首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进excel vba代码中多个ifs结尾ifs

如何改进excel vba代码中多个ifs结尾ifs
EN

Stack Overflow用户
提问于 2018-04-05 10:37:23
回答 3查看 116关注 0票数 0
代码语言:javascript
复制
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个标准,则某个工作表将是可见的

有没有更好的方法来写上面的代码?似乎有太多的if和end if

非常感谢

EN

回答 3

Stack Overflow用户

发布于 2018-04-05 12:50:26

代码语言:javascript
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2018-04-05 10:57:20

任何时候你都会遇到这样的问题:

代码语言:javascript
复制
If [C3] > 0 And [B3] > 0 And [B1] > 0 Then
Sheets("E-L1").Visible = True
Else
Sheets("E-L1").Visible = False
End If

你可以缩短它。由于以下原因:

代码语言:javascript
复制
( [C3] > 0 And [B3] > 0 And [B1] > 0 )

...returns TrueFalse (不带If)。如果是True,你想要Visible=True。因此:

代码语言:javascript
复制
Sheets("E-L1").Visible  =  ( [C3] > 0 And [B3] > 0 And [B1] > 0 )

...is的等价物。这将使所有类似的部分发生很大的变化。

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

有许多简单的例子,最终“风格”取决于你,只要确保它是有组织的,无论它是什么。

例如,如下所示:

代码语言:javascript
复制
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

应该是:

代码语言:javascript
复制
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

还有一件事,do 不会养成像A1+B2一样使用速记的习惯。这种形式的单元格引用充满了潜在的问题,这意味着我们可以在即时窗口中进行调试,而不是作为代码的一部分。

有几种“适当”的方法可以做到这一点,最常见的是用代替

代码语言:javascript
复制
[A1]

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

代码语言:javascript
复制
Dim ws as Worksheet
Set ws = Worksheets("mySheetName")

...and然后引用单元格,如下所示:

代码语言:javascript
复制
ws.Ramge("A1")

这看起来像是更多的打字,但这其中有重要的原因。正确的组织将拯救您(以及您向其展示代码的人!)从长期来看不会引起头痛。

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-05 13:53:41

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49663267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档