我目前正在尝试将此逻辑实现到我的子过程中。以下列出了3种情况和4种结果:
如图所示,第I列中的值由主工作表中的数据验证列表驱动
我尝试使用以下代码反映上述逻辑:
If DataImport.Cells(i, "E").Value <> 0 And DataImport.Cells(i, "F").Value <> 0 And DataImport.Cells(i, "I").Value = "Hide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf DataImport.Cells(i, "E").Value = 0 And DataImport.Cells(i, "F").Value = 0 And DataImport.Cells(i, "I").Value = "Hide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf DataImport.Cells(i, "E").Value <> 0 And DataImport.Cells(i, "F").Value <> 0 And DataImport.Cells(i, "I").Value = "Unhide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = True
ElseIf DataImport.Cells(i, "E").Value = 0 And DataImport.Cells(i, "F").Value = 0 And DataImport.Cells(i, "I").Value = "Unhide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
我不确定我是否正确实现了该步骤,因为该过程忽略了我的第三个条件,并且仍在列I中显示带有“隐藏”的相关工作表。
保持简单。当我使用复杂的逻辑时,我首先设置变量,这样我的代码更易于阅读。
Option Explicit
Dim isNotZero as Boolean
Dim isToHide as Boolean
isNotZero = DataImport.Cells(i, "E").Value <> 0 And DataImport.Cells(i, "F").Value <> 0
isToHide = DataImport.Cells(i, "I").Value = "Hide"
现在,我们可以在您的代码中使用这些变量(请记住要正确缩进以使代码逻辑可见)
If isNotZero And isToHide Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf DataImport.Cells(i, "E").Value = 0 And DataImport.Cells(i, "F").Value = 0 And isToHide Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf isNotZero And Not isToHide Then
ThisWorkbook.Worksheets(ws(index)).Visible = True
ElseIf DataImport.Cells(i, "E").Value = 0 And DataImport.Cells(i, "F").Value = 0 And Not isToHide Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
End iF
您注意到我是如何留下一些代码的。 (A <> 0 AND B <> 0)与(A = 0 AND B = 0)相反。您正在寻找的是(A = 0 OR B = 0)。一个简单的真值表将证明这一点,我将把它留给自己做练习。
但请稍等。
您上面的逻辑/真相表是一件好事。它显示了A和C的模式(A和B是E和F中的值不为零)。它还显示了一个简单的模式。
ThisWorkbook.Worksheets(ws(index)).Visible = isNotZero and Not isToHide
如您所见,我已经用一行代码替换了复杂的If … Then...
。让我们最后对isToHide
进行调整,您的最终代码如下。
Option Explicit
Dim isNotZero as Boolean
Dim isToHide as Boolean
isNotZero = DataImport.Cells(i, "E").Value <> 0 And DataImport.Cells(i, "F").Value <> 0
isToExpose = DataImport.Cells(i, "I").Value = "Unhide"
ThisWorkbook.Worksheets(ws(index)).Visible = isNotZero and isToExpose
' Purely because I prefer the positive statements
' And now your code is easier to read and self-commenting.
这里的经验教训
尝试嵌套if语句以查看是否可以解决问题。另外,可以简化您的逻辑,因为如果E和F列中的值为0,那么无论I列中的值是什么,我们总是隐藏工作表:
If DataImport.Cells(i, "E").Value <> 0 And DataImport.Cells(i, "F").Value <> 0 Then
If DataImport.Cells(i, "I").Value = "Hide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf DataImport.Cells(i, "I").Value = "Unhide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = True
End If
ElseIf DataImport.Cells(i, "E").Value = 0 And DataImport.Cells(i, "F").Value = 0 Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
End If
此外,我们可以使用With:进一步简化代码:
With DataImport
If .Cells(i, "E").Value <> 0 And .Cells(i, "F").Value <> 0 Then
If .Cells(i, "I").Value = "Hide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
ElseIf .Cells(i, "I").Value = "Unhide" Then
ThisWorkbook.Worksheets(ws(index)).Visible = True
End If
ElseIf .Cells(i, "E").Value = 0 And .Cells(i, "F").Value = 0 Then
ThisWorkbook.Worksheets(ws(index)).Visible = False
End If
End With