[英]how to improve excel vba code of many ifs end ifs
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和end ifs
非常感谢
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rowsIndex As Variant, sheetNames As Variant
rowsIndex = Array(3,4,5,7,8,10)
sheetNames = Array("E-L1","E-L2","E-L3","M-L1","M-L2","MISPI-1")
Dim index As Long
For index = LBound(rowsIndex) To UBound(rowsIndex)
Sheets(sheetNames(index)).Visible = Cells(rowsIndex(index), 2) > 0 And Cells(rowsIndex(index), 3) > 0 And Cells(1,2) > 0
Next
End Sub
只需用所有行索引和相应的工作表名称填充这两个数组
每当你有类似的东西:
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 )
...返回True
或False
(不包含If
)。 ...如果为True
,则需要Visible=True
。 因此:
Sheets("E-L1").Visible = ( [C3] > 0 And [B3] > 0 And [B1] > 0 )
相当于 这将在所有类似的部分中产生很大的变化。
过去似乎对我来说是浪费时间,但实际上是一个重要的习惯,就是适当的间距和缩进 (尤其是在与论坛的其他人共享您的代码时!)。
最终,“样式”取决于您各种各样的简单示例松散规则,只要确保它的组织方式是什么即可。
例如,这:
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")
看起来好像要打字很多,但是有重要的原因。 从长远来看,适当的组织可以使您(以及那些向您展示代码的人)免于头痛。
如果您想进行更改并更新问题中的代码,我们可以再看看。
我认为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.