Я использую электронную таблицу с несколькими раскрывающимися списками. Я хочу, чтобы для одной строки можно было выбрать несколько элементов из DropDownList.
Я использую приведенный ниже код, но проблема в том, что при защите книги теряется возможность выбора нескольких элементов.
> Private Sub Worksheet_Change(ByVal Target As Range)
Dim Oldvalue As String
Dim Newvalue As String
Application.EnableEvents = True
On Error GoTo Exitsub
If Target.Address = "$G$5" Or Target.Address = "$G$6" Or Target.Address = "$G$7" Or Target.Address = "$G$8" Or Target.Address = "$G$9" Or Target.Address = "$G$10" Or Target.Address = "$G$11" Or Target.Address = "$G$12" Or Target.Address = "$G$13" Or Target.Address = "$G$14" Or Target.Address = "$G$15" Or Target.Address = "$G$16" Or Target.Address = "$G$17" Or Target.Address = "$G$18" Or Target.Address = "$G$19" Or Target.Address = "$G$20" Or Target.Address = "$G$21" Or Target.Address = "$G$22" Or Target.Address = "$G$23" Or Target.Address = "$G$24" Or Target.Address = "$G$25" Or Target.Address = "$G$26" Or Target.Address = "$G$27" Or Target.Address = "$G$28" Or Target.Address = "$G$29" Or Target.Address = "$G$30" Or Target.Address = "$G$31" Or Target.Address = "$G$32" Or Target.Address = "$G$33" Or Target.Address = "$G$34" Or Target.Address = "$G$35" Or Target.Address = "$G$36" Or Target.Address = "$G$37" Or Target.Address = "$G$38" Or Target.Address = "$G$39" Or Target.Address = "$G$40" Then
If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
GoTo Exitsub
Else: If Target.Value = "" Then GoTo Exitsub Else
Application.EnableEvents = False
Newvalue = Target.Value
Application.Undo
Oldvalue = Target.Value
If Oldvalue = "" Then
Target.Value = Newvalue
Else
If InStr(1, Oldvalue, Newvalue) = 0 Then
Target.Value = Oldvalue & ", " & Newvalue
Else:
Target.Value = Oldvalue
End If
End If
End If
End If
Application.EnableEvents = True
Exitsub:
Application.EnableEvents = True
End Sub
Не защищайте свой рабочий лист с помощью встроенной функции excel, если вы собираетесь выполнять какой-либо код VBA в будущем, вместо этого используйте следующий код и скопируйте его в свойThisWorkbook
вкладка, чтобы защитить конкретный рабочий лист, в то же время позволяя VBA работать должным образом:
Вы можете заменитьsheet1
с именем вашего рабочего листа.
Sub Workbook_Open()
Sheet1.Protect Password:="xxxx", UserInterfaceOnly:=True
Sheet1.EnableSelection = xlUnlockedCells
End Sub
Не отвечая напрямую на ваш вопрос, но одно предложение, чтобы упростить все это, если вместо этого использовать это:
Если не Application.Intersect (Target, Range ("G5: G40")) Is Nothing, тогда
Locked = False
. Верно ли мое предположение? FaneDuru