想在 VBA 中创建多个 if 语句

want to make multiple if statement in VBA

我怎么能 运行 这个多个 If 语句它只是 运行 第一个 if 语句(因为它是真的)但我希望 Programm 逐步处理所有 If 语句。请检查 check13 的 If 语句,因为在拾取数组时几乎没有区别。

Sub main_process_data()
   Dim s1 As Worksheet, s2 As Worksheet
   Dim check1 As Boolean, check5 As Boolean, check6 As Boolean, check7 As Boolean, check13 As Boolean

Set s1 = ThisWorkbook.Worksheets(1)
Set s2 = ThisWorkbook.Worksheets(2)

check1 = s2.CHECKBOXES("Check Box 1").Value = xlOn
check5 = s2.CHECKBOXES("Check Box 5").Value = xlOn
check6 = s2.CHECKBOXES("Check Box 6").Value = xlOn
check7 = s2.CHECKBOXES("Check Box 7").Value = xlOn
check13 = s2.CHECKBOXES("Check Box 13").Value = xlOn

If check1 Then
    s1.Range("C42").Value = s2.Range("B2").Value
Else
    s1.Range("C42").Value = vbNullString

If check5 Then
    s1.Range("C43").Value = s2.Range("B3").Value
Else
    s1.Range("C43").Value = vbNullString

If check6 Then
    s1.Range("C44").Value = s2.Range("B4").Value
Else
    s1.Range("C44").Value = vbNullString
    
If check7 Then
    s1.Range("C45").Value = s2.Range("B5").Value
Else
    s1.Range("C45").Value = vbNullString

If check13 Then
    s1.Range("C45").Value = s2.Range("B11").Value
Else
    s1.Range("C45").Value = vbNullString

End If
End If
End If
End If
End If

End Sub

给运行每一个如果一个接一个应该是这样的:

Sub main_process_data()
   Dim s1 As Worksheet, s2 As Worksheet
   Dim check1 As Boolean, check5 As Boolean, check6 As Boolean, check7 As Boolean, check13 As Boolean

Set s1 = ThisWorkbook.Worksheets(1)
Set s2 = ThisWorkbook.Worksheets(2)

check1 = s2.CHECKBOXES("Check Box 1").Value = xlOn
check5 = s2.CHECKBOXES("Check Box 5").Value = xlOn
check6 = s2.CHECKBOXES("Check Box 6").Value = xlOn
check7 = s2.CHECKBOXES("Check Box 7").Value = xlOn
check13 = s2.CHECKBOXES("Check Box 13").Value = xlOn

If check1 Then
    s1.Range("C42").Value = s2.Range("B2").Value
Else
    s1.Range("C42").Value = vbNullString
End If

If check5 Then
    s1.Range("C43").Value = s2.Range("B3").Value
Else
    s1.Range("C43").Value = vbNullString
End If

If check6 Then
    s1.Range("C44").Value = s2.Range("B4").Value
Else
    s1.Range("C44").Value = vbNullString
End If

If check7 Then
    s1.Range("C45").Value = s2.Range("B5").Value
Else
    s1.Range("C45").Value = vbNullString
End If

End Sub

使用循环和 Offset:

Dim checks As Variant
checks = Array(check1, check5, check6, check7, check13)

Dim i As Long
For i = Lbound(checks) to Ubound(checks)
    If checks(i) Then
        s1.Range("C42").Offset(i).Value = s2.Range("B2").Offset(i).VAlue
    Else
        s1.Range("C42").Offset(i).Value = vbNullString
    End If
Next

更好的是,跳过创建 check 变量:

Dim checkNums As Variant
checkNums = Array(1, 5, 6, 7, 13)

Dim i As Long
For i = Lbound(checkNums) to Ubound(checkNums)
    If s2.CHECKBOXES("Check Box " & checkNums(i)).Value = xlOn Then
        s1.Range("C42").Offset(i).Value = s2.Range("B2").Offset(i).Value
    Else
        s1.Range("C42").Offset(i).Value = vbNullString
    End If
Next

编辑:

由于 s2 上的范围不连续,使用两个数组:

Dim checkNums As Variant
checkNums = Array(1, 5, 6, 7, 13)

With s2
    Dim ranges As Variant
    ranges = Array(.Range("B2"), _
                   .Range("B3"), _
                   .Range("B4"), _
                   .Range("B5"), _
                   .Range("B11"))
End With


Dim i As Long
For i = Lbound(checkNums) to Ubound(checkNums)
    If s2.CHECKBOXES("Check Box " & checkNums(i)).Value = xlOn Then
        s1.Range("C42").Offset(i).Value = ranges(i).Value
    Else
        s1.Range("C42").Offset(i).Value = vbNullString
    End If
Next

我建议使用 Select-Case(C# 中的 switch-case)而不是 If-Else,作为模式匹配的一种形式。参见:Select Case statement