Сжатие нескольких OR-условий в коде VBA - PullRequest
0 голосов
/ 29 июня 2018

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

Sub TestUsername()
If Environ("Username") = "firstname1.lastname1" Or Environ("Username") = "firstname2.lastname2" _
Or Environ("Username") = "firstname3.lastname3" Or Environ("Username") = "firstname4.lastname4" Then
Sheet1.Range("A1").Value = 1
Else
Sheet1.Range("A2").Value = 2
End If
End Sub

Как вы видите, я перечисляю каждого пользователя, которому разрешено вводить значение в Ячейка A1 с OR-condition в моем коде VBA. Все это прекрасно работает.


Теперь мне было интересно, есть ли более простой способ сделать это. Примерно так:

Sub TestUsername()
If List of or-conditions: {"firstname1.lastname1", "firstname2.lastname2", _
"firstname3.lastname3", "firstname4.lastname4"} = True Then
Sheet1.Range("A1").Value = 1
Else
Sheet1.Range("A2").Value = 2
End If
End Sub

Я просто знаю, что в PHP вы можете сжать несколько условий, например здесь . Поэтому я подумал, что это также возможно для программирования на VBA.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Поскольку вы работаете в ячейке, вы можете определить разрешенные имена пользователей в электронной таблице.

Вот как может выглядеть таблица электронных таблиц:

spreadsheet

А вот код, который вы можете использовать:

Sub TestUsername()
    Dim username As String
    Dim userInTable As Integer
    Dim allowedUserRange As Excel.Range

    username = Environ("username")
    Set allowedUserRange = Excel.Range("tUsers")

    userInTable = Excel.WorksheetFunction.CountIf(allowedUserRange, username)

    If userInTable Then
        Sheet1.Range("A1").Value = 1
    Else
        Sheet1.Range("A1").Value = 2
    End If
End Sub
0 голосов
/ 29 июня 2018

Полагаю, если у вас было ужасное количество условий, вы могли бы вставить их в массив, а затем просто заменить ваше условное выражение

If Environ("Username") = "firstname1.lastname1" Or Environ("Username") = "firstname2.lastname2" _
Or Environ("Username") = "firstname3.lastname3" Or Environ("Username") = "firstname4.lastname4" Then

с этим

If IsInArray(Environ("Username"), arr) Then

Это требует, чтобы вы сначала измерили массив с условиями и использовали эту функцию, однако:

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False

End Function

Таким образом, ваш код становится намного более читабельным и простым в обслуживании.

0 голосов
/ 29 июня 2018

Может быть, что-то вроде этого

Sub TestUsername()
    Select Case Environ("Username")
    Case "firstname1.lastname1", "firstname2.lastname2", "firstname3.lastname3"
        Sheet1.Range("A1").Value = 1
    Case Else
        Sheet1.Range("A2").Value = 2
    End Select
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...