在VBA代码中压缩多个OR条件

时间:2018-06-29 13:43:01

标签: excel excel-vba vba

我使用以下代码允许用户将值写入单元格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

如您所见,我列出了每个允许在我的VBA代码中使用OR-condition单元格A1 中输入值的用户。所有这些都很好。


现在,我想知道是否有更简单的方法可以做到这一点。像这样:

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中您可以压缩多个条件,例如here。因此,我认为这对于VBA编程也是可能的。

4 个答案:

答案 0 :(得分:7)

也许是这样

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

答案 1 :(得分:0)

由于您正在使用单元格,因此您可能希望在电子表格中定义允许的用户名。

电子表格表格的外观如下:

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

答案 2 :(得分:0)

我想,如果您的条件量非常大,则可以将它们放在数组中,然后只需替换条件语句即可

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

这样,您的代码将变得更具可读性和易于维护。

答案 3 :(得分:0)

Select Case提供了一个很好的解决方案,可以同时测试多个条件。我用它来提醒用户,如果他们没有提供所有必需的输入。我正在监视来自多个下拉框的输入以及一些直接单元格输入。

Select Case True 
  Case Range("Customer_DD_Control_Cell") > 0 _ 
    And Range("Dealer_DD_Control_Cell") > 0 _ 
    And Range("Rep_DD_Control_Cell") > 0 _ 
    And Range("Product_DD_Control_Cell") > 0 _ 
    And Len(Range("Customer_State_Input")) > 0 _ 
    And Len(Range("Contract_Date_Input")) > 0
Case Else
 MsgBox "You have not completed the required inputs" 
End Select