如果否则则在多个条件下不起作用

问题描述 投票:1回答:2

我目前正在尝试将此逻辑实现到我的子过程中。以下列出了3种情况和4种结果:

enter image description here

如图所示,第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中显示带有“隐藏”的相关工作表。

excel vba if-statement
2个回答
4
投票

保持简单。当我使用复杂的逻辑时,我首先设置变量,这样我的代码更易于阅读。

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.

这里的经验教训

  • 做真相表。
  • 确定模式。
  • 使用布尔变量简化看似复杂的目标代码。
  • 一次采取一个逻辑步骤。

0
投票

尝试嵌套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
© www.soinside.com 2019 - 2024. All rights reserved.