Как это сделать, если "=" несколько значений? - PullRequest
0 голосов
/ 12 января 2020

Я хочу, чтобы сообщение показывало, пытается ли пользователь изменить ячейку на основе заголовка ее столбца. Я мог бы просто защитить ячейки, но в любом случае это было бы полезно для будущих знаний.

Вместо нескольких выражений if я хочу что-то похожее на where in (), которое находится в SQL. Есть ли способ сделать не в или вы просто использовали бы другой?

Код, который работает для одного значения

Dim ThisColumn as long
ThisColumn=Target.Column
If Cells(1, ThisColumn).Value = "# workers" Then
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
    MsgBox "Protected Columns"
    Exit Sub
End If

Я хочу что-то вроде

If Cells(1, ThisColumn).Value in("# workers","# of people") Then
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
    MsgBox "Protected Columns"
    Exit Sub
End If

Ответы [ 5 ]

2 голосов
/ 12 января 2020

Похоже, вам нужно использовать двоичные логические операторы, такие как AND или OR, как описано здесь:

И-оператор

ИЛИ-оператор

В вашем случае OR -оператор предлагает вам следующее решение:

if ((Cells(1, ThisColumn).Value="# workers"  )  OR
    (Cells(1, ThisColumn).Value="# of people"))
...
1 голос
/ 13 января 2020

Вы можете использовать instr, пожалуйста, прочитайте: Это

Пример:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Yourvalue As Variant
Dim ThisColumn as long
ThisColumn=Target.Column

Yourvalue = Array("# workers", "# of people", "# ...")
If IsInArray(Cells(1, ThisColumn).Value, Yourvalue) Then
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
        MsgBox "Protected Columns"
    Exit Sub
    End If
'Continue Code

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Integer
IsInArray = InStr(Join(arr, ""), stringToBeFound)
End Function
1 голос
/ 13 января 2020

большое спасибо. Я действительно пытался использовать функцию или, но она не работала (если только мне не нужны скобки вокруг ifs?). Обратите внимание, что я нашел решение, и нашел больше того, что искал, так как мог определить список:

Dim ColumnTitle
ColumnTitle = Cells(1, ThisColumn).Value  
Select Case ColumnTitle    
Case "# Workers", "Assumption numbers used for costings"   ' List of Column Titles.

    Cells(ThisRow, ThisColumn).Select

Case Else    ' Other values.
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
    MsgBox "Protected Columns."

End Select
0 голосов
/ 13 января 2020

Вы можете использовать Dictionary и его встроенный метод Exists

Dim RestrictedColumns As Object
Set RestrictedColumns = CreateObject("Scripting.Dictionary")
With RestrictedColumns
    .Add "# workers", "# workers"
    .Add "# of people", "# of people"
End With
Dim ThisColumn As Long
ThisColumn=Target.Column
If RestrictedColumns.Exists(Cells(1, ThisColumn).Value) Then
    With Application
        .EnableEvents = False
        .Undo
        .EnableEvents = True
    End With
    MsgBox "Protected Columns"
    Exit Sub
End If
0 голосов
/ 13 января 2020

Вы можете использовать два Application метода, называемых .Match и .Count. Мы можем указать Match, чтобы проверить 1D-массив по значению. Он вернет значение цифры c, если найдено, и ошибку, если нет. Тогда .Count проигнорирует эту ошибку и вернет общее количество найденных значений. Например, методика:

Dim ThisColumn As Long: ThisColumn = Target.Column
Dim arr As Variant: arr = Array("# workers", "# of people")

With Application
    If .Count(.Match(arr, Cells(1, ThisColumn), 0)) > 0 Then
        .EnableEvents = False
        .Undo
        .EnableEvents = True
        MsgBox "Protected Columns"
        Exit Sub
    Else
        'Do something else if need be...
    End If
End With

Теперь вы можете добавить к arr любое значение, которое вы хотите проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...