vba中多if语句的正确顺序

vba中多if语句的正确顺序,vba,excel,Vba,Excel,当$A$5的值等于“Company 2”时,我需要这个宏来隐藏某些列。下面的查询成功隐藏了列,但没有执行打印循环。正确的设置方法是什么 Sub PrintAll() Dim BrokerCell As Range Dim TotalCell As Range Dim Rng As Range Dim Wks As Worksheet Set Wks = Worksheets("PRINT PAGE") If Range("$A$5").Value = "Company

当$A$5的值等于“Company 2”时,我需要这个宏来隐藏某些列。下面的查询成功隐藏了列,但没有执行打印循环。正确的设置方法是什么

Sub PrintAll()

  Dim BrokerCell As Range
  Dim TotalCell As Range
  Dim Rng As Range
  Dim Wks As Worksheet

 Set Wks = Worksheets("PRINT PAGE")

 If Range("$A$5").Value = "Company 1" Then
  Set Rng = ThisWorkbook.Names("Company1").RefersToRange
 ElseIf Range("$A$5").Value = "Company 2" Then
  Set Rng = ThisWorkbook.Names("Company2").RefersToRange
 Else: Set Rng = ThisWorkbook.Names("Company3").RefersToRange
 End If

If Range("$A$5").Value = "Company 2" Then
    Columns("M:O").Select
    Selection.EntireColumn.Hidden = True
    Else: Columns("M:O").Select
    Selection.EntireColumn.Hidden = False

        For Each BrokerCell In Rng
            If BrokerCell <> "" And Range("$S$5").Value <> "" Then
            Wks.Range("$B$5").Value = BrokerCell.Text
            Wks.PrintOut
            End If
        Next BrokerCell

 End If

End Sub
Sub-PrintAll()
Dim BrokerCell As射程
Dim TotalCell作为范围
变暗Rng As范围
将工作作为工作表
设置Wks=工作表(“打印页”)
如果范围(“$A$5”).Value=“公司1”,则
Set Rng=thispoolk.Names(“Company1”).refrestorange
ElseIf范围(“$A$5”)。Value=“公司2”则
Set Rng=thispoolk.Names(“Company2”).refrestorange
Else:Set Rng=thispoolk.Names(“Company3”).refrestorange
如果结束
如果范围(“$A$5”).Value=“公司2”,则
列(“M:O”)。选择
Selection.EntireColumn.Hidden=True
Else:列(“M:O”)。选择
Selection.EntireColumn.Hidden=False
对于Rng中的每个BrokerCell
如果BrokerCell“”和范围($S$5”)。值“”则
Wks.Range($B$5”).Value=BrokerCell.Text
Wks.打印输出
如果结束
下一个BrokerCell
如果结束
端接头

您的每个
循环的
都包含在
If范围(“$A$5”).Value=“Company 2”的
Else
部分中。只有当
语句的计算结果为false时,它才会执行


如果需要在所有实例中执行每个
循环的
,请将其移动到
结束(如果
)之后。如果仅当
If
语句的计算结果为
True
时才需要执行它,则将其移动到
Else
之前,我相信这就是oyu希望实现的目标,请参见下文

Sub PrintAll()

Dim BrokerCell As Range
Dim TotalCell As Range
Dim Rng As Range
Dim Wks As Worksheet
Dim sCellValue As String

Set Wks = Worksheets("PRINT PAGE")
sCellValue = Replace(Range("$A$5").Value, " ", "")
    If sCellValue = "Company1" Then
        Set Rng = ThisWorkbook.Names(sCellValue ).RefersToRange
    ElseIf sCellValue = "Company2" Then
        Set Rng = ThisWorkbook.Names(sCellValue ).RefersToRange
    Else
        Set Rng = ThisWorkbook.Names("Company3").RefersToRange
    End If

    Columns("M:O").Select
    If sCellValue = "Company2" Then
        Selection.EntireColumn.Hidden = True
    Else
        Selection.EntireColumn.Hidden = False
    End If
    For Each BrokerCell In Rng
        If BrokerCell <> "" And Range("$S$5").Value <> "" Then
            Wks.Range("$B$5").Value = BrokerCell.Text
            Wks.PrintOut
        End If
    Next BrokerCell

End Sub
Sub-PrintAll()
Dim BrokerCell As射程
Dim TotalCell作为范围
变暗Rng As范围
将工作作为工作表
将值设置为字符串
设置Wks=工作表(“打印页”)
sCellValue=Replace(范围(“$A$5”)。值“,”)
如果sCellValue=“Company1”,则
Set Rng=ThisWorkbook.Names(sCellValue).refereStorRange
否则sCellValue=“Company2”则
Set Rng=ThisWorkbook.Names(sCellValue).refereStorRange
其他的
Set Rng=ThisWorkbook.Names(“Company3”).refrestorange
如果结束
列(“M:O”)。选择
如果sCellValue=“Company2”,则
Selection.EntireColumn.Hidden=True
其他的
Selection.EntireColumn.Hidden=False
如果结束
对于Rng中的每个BrokerCell
如果BrokerCell“”和范围($S$5”)。值“”则
Wks.Range($B$5”).Value=BrokerCell.Text
Wks.打印输出
如果结束
下一个BrokerCell
端接头

我将'End If'语句移到了'For Each'之前,但它仍然只执行隐藏或取消隐藏列代码-仍然不执行'For Each'循环。您的答案就是解决方案。我猜我的宏在昨天某个时候被禁用了,因为我今天打开并试用了它,它成功了!所以谢谢。我喜欢设置中的更改,但是,它仍然不能解决“For Each”循环不执行的问题。如果调试代码,Rng是否有单元格?它是跳过循环还是进入循环并点击if语句?如果将BrokerCell更改为变体,请删除as范围,是否存在相同问题?(我假设是这样)现在您应该能够引用BrokerCell,并使其值表示单元格中保存的值,但您是否尝试过BrokerCell.value“”。