如何改进许多ifs结束ifs的excel vba代码

时间:2018-04-05 02:37:23

标签: excel vba excel-vba

Private Sub Worksheet_Change(ByVal Target As Range)

If [C3] > 0 And [B3] > 0 And [B1] > 0 Then
Sheets("E-L1").Visible = True
Else
Sheets("E-L1").Visible = False
End If
If [C4] > 0 And [B4] > 0 And [B1] > 0 Then
Sheets("E-L2").Visible = True
Else
Sheets("E-L2").Visible = False
End If
If [C5] > 0 And [B5] > 0 And [B1] > 0 Then
Sheets("E-L3").Visible = True
Else
Sheets("E-L3").Visible = False
End If

If [C7] > 0 And [B7] > 0 And [B1] > 0 Then
Sheets("M-L1").Visible = True
Else
Sheets("M-L1").Visible = False
End If
If [C8] > 0 And [B8] > 0 And [B1] > 0 Then
Sheets("M-L2").Visible = True
Else
Sheets("M-L2").Visible = False
End If

If [C10] > 0 And [B10] > 0 And [B1] > 0 Then
Sheets("MIDPI-1").Visible = True
Else
Sheets("MIDPI-1").Visible = False
End If
If [C11] > 0 And [B11] > 0 And [B1] > 0 Then
Sheets("MIDPI-2").Visible = True
Else
Sheets("MIDPI-2").Visible = False
End If

If [C13] > 0 And [B13] > 0 And [B1] > 0 Then
Sheets("BR-1").Visible = True
Else
Sheets("BR-1").Visible = False
End If
If [C14] > 0 And [B14] > 0 And [B1] > 0 Then
Sheets("BR-2").Visible = True
Else
Sheets("BR-2").Visible = False
End If
If [C15] > 0 And [B15] > 0 And [B1] > 0 Then
Sheets("BR-3").Visible = True
Else
Sheets("BR-3").Visible = False
End If
If [C16] > 0 And [B16] > 0 And [B1] > 0 Then
Sheets("BR-4").Visible = True
Else
Sheets("BR-4").Visible = False
End If

If [C18] > 0 And [B18] > 0 And [B1] > 0 Then
Sheets("BR-LR1").Visible = True
Else
Sheets("BR-LR1").Visible = False
End If
If [C19] > 0 And [B19] > 0 And [B1] > 0 Then
Sheets("BR-LR2").Visible = True
Else
Sheets("BR-LR2").Visible = False
End If
If [C20] > 0 And [B20] > 0 And [B1] > 0 Then
Sheets("BR-LR3").Visible = True
Else
Sheets("BR-LR3").Visible = False
End If
If [C21] > 0 And [B21] > 0 And [B1] > 0 Then
Sheets("BR-LR4").Visible = True
Else
Sheets("BR-LR4").Visible = False
End If

If [C23] > 0 And [B23] > 0 And [B1] > 0 Then
Sheets("BR-SR1").Visible = True
Else
Sheets("BR-SR1").Visible = False
End If
If [C24] > 0 And [B24] > 0 And [B1] > 0 Then
Sheets("BR-SR2").Visible = True
Else
Sheets("BR-SR2").Visible = False
End If

If [C26] > 0 And [B26] > 0 And [B1] > 0 Then
Sheets("MOD-F1").Visible = True
Else
Sheets("MOD-F1").Visible = False
End If
If [C27] > 0 And [B27] > 0 And [B1] > 0 Then
Sheets("MOD-F2").Visible = True
Else
Sheets("MOD-F2").Visible = False
End If

If [C29] > 0 And [B29] > 0 And [B1] > 0 Then
Sheets("MOD-S1").Visible = True
Else
Sheets("MOD-S1").Visible = False
End If
If [C30] > 0 And [B30] > 0 And [B1] > 0 Then
Sheets("MOD-S2").Visible = True
Else
Sheets("MOD-S2").Visible = False
End If
End Sub

以上检查工作表可见的3个标准,如果不满足所有3个,则隐藏工作表

即。如果满足3条标准,则可以看到某个工作表

有没有更好的方法来编写上面的代码? 似乎是多余的 太多的ifs和结束ifs

非常感谢

3 个答案:

答案 0 :(得分:2)

git clone

只需用所有行索引和相应的工作表名称填充这两个数组

答案 1 :(得分:1)

任何时候你都有:

If [C3] > 0 And [B3] > 0 And [B1] > 0 Then
Sheets("E-L1").Visible = True
Else
Sheets("E-L1").Visible = False
End If

你可以缩短它。从那以后:

( [C3] > 0 And [B3] > 0 And [B1] > 0 )

...返回TrueFalse(没有If)。 ......如果你需要True Visible=True。因此:

Sheets("E-L1").Visible  =  ( [C3] > 0 And [B3] > 0 And [B1] > 0 )

......是等价的。这将对所有类似的部分做出重大改变。

以前似乎浪费时间的东西,但实际上是一个重要的习惯是适当的间距和缩进(特别是在与论坛的其他人共享代码时!)。

最终的" style"有各种简单的示例松散规则。取决于你,只要确保它的组织无论如何。

例如,这个:

Sub myExample
If [C29] > 0 And [B29] > 0 And [B1] > 0 Then
Sheets("MOD-S1").Visible = True
Else
Sheets("MOD-S1").Visible = False
End If
End Sub

应该是:

Sub myExample
    If [C29] > 0 And [B29] > 0 And [B1] > 0 Then
        Sheets("MOD-S1").Visible = True
    Else
        Sheets("MOD-S1").Visible = False
    End If
End Sub

还有一件事,养成使用[A1] + [B2]这样的速记的习惯。这种形式的单元格引用充满了潜在的问题,对于我们来说,在调试的即时窗口中是有意义的,而不是代码的一部分。

有一些"适当的"您可以采用哪种方式,最常见的是, 而不是

[A1]

(在程序开始时至少声明一个工作表)

Dim ws as Worksheet
Set ws = Worksheets("mySheetName")

...然后你会像以下那样引用单元格:

ws.Ramge("A1")

它可能看起来更像打字,但有重要原因。从长远来看,正确的组织将从头痛中拯救你(以及你展示代码的那些!)。

如果您想进行更改并更新问题中的代码,我们可以再看看。

答案 2 :(得分:0)

DisplayName的代码略有变化,我认为非常好。 范围B1对于所有条件都是通用的,因此为什么不将它作为您的第一个条件,并将其从其余代码中删除。您的范围成对出现,因此将它们添加到数组中。我将对的所有前半部分放在数组的前半部分,这样你就可以使用/ 2作为Mod值来获得数组的后半部分值。工作表数组当然应该等于你的/ 2值

Sub sheetVisibility()
On Error GoTo NoSheet
Dim ranges As Variant, sheets As Variant, arrayLen As Integer
If ([B1] > 0) Then
    ranges = Array("C3", "C4", "C5", "C6", _
                   "B3", "B4", "B5", "B6")
    arrayLen = UBound(ranges) / 2
    sheets = Array("Sheet1", "Sheet2", "Sheet3", "Sheetx")
    For i = 0 To UBound(ranges) Mod arrayLen 
        sheets(sheets(i)).Visible = (Range(ranges(i)) > 0 And Range(ranges(i + arrayLen)) > 0)
    Next i
End If
End
NoSheet:
End Sub