簡體   English   中英

如何改善許多ifs結束的excel vba代碼

[英]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 )

...返回TrueFalse (不包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM