在VBA中快速编写条件if-then语句

有没有人有任何想法,如果有更快的方式来编码? 我正在做一个excel工作表,如果你点击一个checkbox,True出现在单元格中。 然后,如果单元格如果是真的那么….但有11个可能的select,这意味着有字面上数以百万计的可能的组合,并写每一行代码和双重检查它正在杀死我。 下面的代码示例(只有10个可能的组合。

If Worksheets("Overview").Range("B36").Value = "" And Worksheets("Overview").Range("C36").Value = "" And Worksheets("Overview").Range("D36").Value = "" And Worksheets("Overview").Range("E36").Value = "" And Worksheets("Overview").Range("F36").Value = "" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Please select engagement components." ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "" And Worksheets("Overview").Range("D36").Value = "" And Worksheets("Overview").Range("E36").Value = "" And Worksheets("Overview").Range("F36").Value = "" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "" And Worksheets("Overview").Range("E36").Value = "" And Worksheets("Overview").Range("F36").Value = "" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "" And Worksheets("Overview").Range("F36").Value = "" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33") & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25") & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "True" And Worksheets("Overview").Range("H36").Value = "" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33") + Worksheets("Billing Rates").Range("H33") & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25").Value + Worksheets("Billing Rates").Range("H25") & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "True" And Worksheets("Overview").Range("H36").Value = "True" And Worksheets("Overview").Range("I36").Value = "" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33").Value + Worksheets("Billing Rates").Range("H33").Value + Worksheets("Billing Rates").Range("I33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25") + Worksheets("Billing Rates").Range("H25") + Worksheets("Billing Rates").Range("I25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "True" And Worksheets("Overview").Range("H36").Value = "True" And Worksheets("Overview").Range("I36").Value = "True" And Worksheets("Overview").Range("J36").Value = "" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33").Value + Worksheets("Billing Rates").Range("H33").Value + Worksheets("Billing Rates").Range("I33").Value + Worksheets("Billing Rates").Range("J33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25") + Worksheets("Billing Rates").Range("H25") + Worksheets("Billing Rates").Range("I25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "True" And Worksheets("Overview").Range("H36").Value = "True" And Worksheets("Overview").Range("I36").Value = "True" And Worksheets("Overview").Range("J36").Value = "True" And Worksheets("Overview").Range("K36").Value = "" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33").Value + Worksheets("Billing Rates").Range("H33").Value + Worksheets("Billing Rates").Range("I33").Value + Worksheets("Billing Rates").Range("J33").Value + Worksheets("Billing Rates").Range("K33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25") + Worksheets("Billing Rates").Range("H25") + Worksheets("Billing Rates").Range("I25").Value + Worksheets("Billing Rates").Range("J25").Value & vbNewLine & "Scope: " ElseIf Worksheets("Overview").Range("B36").Value = "True" And Worksheets("Overview").Range("C36").Value = "True" And Worksheets("Overview").Range("D36").Value = "True" And Worksheets("Overview").Range("E36").Value = "True" And Worksheets("Overview").Range("F36").Value = "True" And Worksheets("Overview").Range("G36").Value = "True" And Worksheets("Overview").Range("H36").Value = "True" And Worksheets("Overview").Range("I36").Value = "True" And Worksheets("Overview").Range("J36").Value = "True" And Worksheets("Overview").Range("K36").Value = "True" And Worksheets("Overview").Range("L36").Value = "" Then MsgBox "Cost: " & Worksheets("Billing Rates").Range("C33").Value + Worksheets("Billing Rates").Range("D33").Value + Worksheets("Billing Rates").Range("E33").Value + Worksheets("Billing Rates").Range("F33") + Worksheets("Billing Rates").Range("G33").Value + Worksheets("Billing Rates").Range("H33").Value + Worksheets("Billing Rates").Range("I33").Value + Worksheets("Billing Rates").Range("J33").Value + Worksheets("Billing Rates").Range("K33").Value + Worksheets("Billing Rates").Range("L33").Value & vbNewLine & "Hours: " & Worksheets("Billing Rates").Range("C25").Value + Worksheets("Billing Rates").Range("D25").Value + Worksheets("Billing Rates").Range("E25").Value + Worksheets("Billing Rates").Range("F25").Value + Worksheets("Billing Rates").Range("G25") + Worksheets("Billing Rates").Range("H25") + Worksheets("Billing Rates").Range("I25").Value + Worksheets("Billing Rates").Range("J25").Value + Worksheets("Billing Rates").Range("K25").Value + Worksheets("Billing Rates").Range("L25").Value 

awnser正在处理ifs内部的其他ifs或连续的ifs,存储这些值,并在最后一行显示一条消息:

 Dim msg as String If A = True Then If B = True Then msg = "A and B is True" Else msg = "A is True B is False" End If End If MsgBox msg 

要么

 If A = True Then msg = "A is true" Else msg = "A is false" EndIf If B = True Then msg = msg & " and B is True" Else msg = msg & " and B is False" End If MsgBox msg 

你不需要一遍又一遍地检查相同的条件。

我可能会这样做:

 Dim ws As Worksheet, wsB As Worksheet Set ws = Worksheets("Overview") Set wsB = Worksheets("BillingRates") Dim trueCount As Integer Dim i As Integer Dim Cst, Hrs For i = 1 To 11 If ws.Range(Chr(65 + i) & "36").Value = "True" Then trueCount = trueCount + 1 Cst = Cst + wsB.Range(Chr(66 + i) & "33").Value Hrs = Hrs + wsB.Range(Chr(66 + i) & "25").Value End If If trueCount = 0 Then MsgBox "Please select engagement components." Else MsgBox "Cost: " & Cst _ & vbNewLine & "Hours: " & Hrs _ & vbNewLine & "Scope: " End If Next i 

从“结算费率”中检索成本和小时数的值似乎与“概览”工作表上正在检查的单元格相偏移一列,尽pipe在不同的行上。

 Dim chk As Long, dBRC As Double, dBRH As Double Dim wsBR As Worksheet Set wsBR = Worksheets("Billing Rates") With Worksheets("Overview") If Not CBool(Application.CountA(.Range("B36:L36"))) Then Debug.Print "Please select engagement components." Else For chk = 2 To 12 'only collect the even numbered columns Select Case chk Case 2, 4, 6, 8, 10, 12 If .Cells(36, chk) = "True" Then '<~~ is this supposed to be an actual boolean True or a string that looks like "True"? dBRC = dBRC + wsBR.Cells(33, chk + 1).Value2 dBRH = dBRH + wsBR.Cells(25, chk + 1).Value2 End If Case Else 'do nothing End Select Next chk End If End With Debug.Print "Cost: " & Format(dBRC, "$0.00") & vbNewLine & "Hours: " & dBRH & vbNewLine & "Scope: " 

我无法调和你打算在Scope:标签上做什么。

感谢RBarryYoung和Jeeped帮助我解决这个问题,如果没有你的帮助,我会变成一条小溪。 我想出了如何让popup窗口再次出现。 以下是我最终使用的代码:

Sub Way_EatFresh()

 Dim ws As Worksheet, wsB As Worksheet Set ws = Worksheets("Overview") Set wsB = Worksheets("Billing Rates") Dim trueCount As Integer Dim i As Integer Dim Cst, Hrs For i = 1 To 11 If ws.Range(Chr(65 + i) & "36").Value = "True" Then trueCount = trueCount + 1 Cst = Cst + wsB.Range(Chr(66 + i) & "33").Value Hrs = Hrs + wsB.Range(Chr(66 + i) & "25").Value End If Next i If trueCount > 0 Then MsgBox "Cost: " & Cst _ & vbNewLine & "Hours: " & Hrs _ & vbNewLine & "" End If If trueCount = 0 Then MsgBox "Please select engagement components." End If End Sub