2016-03-15 77 views
0

有没有人有任何想法,如果有更快的方式来编码?我正在开发一个Excel工作表,如果你点击一个复选框,True出现在单元格中。然后,如果单元格如果为真然后....但是有11个可能的选择意味着字面上有数百万个可能的组合,并且编写每行代码并且双重检查它正在杀死我。实施例下面的代码(仅可能的组合的10在VBA中快速编写条件if-then语句

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 
+0

如果这是工作的代码,我可能会建议代码审查堆栈交流? – Chrismas007

+0

您也可以使用嵌套的Ifs,因为您似乎在许多代码行中具有相同的条件(这会显着缩短代码) – Chrismas007

回答

3

的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 

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

1

从计费费率中检索成本和小时数的值似乎偏离了概览工作表上正在检查的单元格的一列,尽管在不同的行上。

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: " 

我无法调和你的计划与范围做什么:标签。

+0

您的代码的工作原理非常棒!有没有办法让它在没有加号功能的情况下拉动呢?例如,如果我想只选择几个组合。 – CodingNewb

+0

使用列数组chk或选择大小写来包含/放弃各个列。 – Jeeped

+0

哎呀!我没有看到你的回应!你如何做一个选择案例包括/放弃? – CodingNewb

1

我可能会做这样的事:

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 
+0

Hi RBarryYoung!你的代码工作得很好,但是我一直在计算中间弹出消息框,你知道如何阻止这些消息出现吗? – CodingNewb

+0

@CodingNewb只有在您调用此代码时才会创建它们。 MsgBox可能相当侵扰性,因此您可以像Jeeped那样将它们更改为Debug.Print。 – RBarryYoung

0

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

子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