【问题标题】:Multiple IF Statements not working from 3rd statement on多个 IF 语句从第 3 条语句开始不起作用
【发布时间】:2021-11-01 00:06:30
【问题描述】:

在第二个语句之后让多个 If 语句工作时遇到问题。我有 2500 行数据问题集,它们与 217 项下拉列表相关联。我要编码的是,适用的问题将根据下拉列表的选定操作填充。每个操作适用的问题从 3 到 12 不等,不适用于选择的问题应自动隐藏行。我尝试了多种代码变体,使用 ElseIf、If、组合 If 和 ElseIf、组合 If 和 Or_(这是最新的),如下所示。有人可以就此提出建议吗?我不知道还能尝试什么,我需要在代码中添加额外的 213 个变量.....谢谢

Sub Hide_Rows()

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TrigerCell As Range

Set Triggercell = Range("$J$14")
   
    If Not Application.Intersect(Triggercell, Target) Is Nothing Then
            If Triggercell.Value = "Electrician, farm based business" Then
                Rows("19:2500").Hidden = False
                Rows("26:2500").Hidden = True
                Or_
            If Triggercell.Value = "Plumbing and heating contractors, farm based business" Then
                Rows("19:2500").Hidden = False
                Rows("19:25", "47:2500").Hidden = True
                Or_
            If Triggercell.Value = "Plumbing contractors (plumber), farm based business" Then
                Rows("19:2500").Hidden = False
                Rows("19:46", "55:2500").Hidden = True
                Or_
            If Triggercell.Value = "Assembly and installation of agricultural equipment in farm outbuildings, for others, farm based business" Then
                Rows("19:2500").Hidden = False
                Rows("19:55", "61:2500").Hidden = True
            End If
    End If
End Sub

End Sub
End Sub

【问题讨论】:

  • 您是否只是在每个 If 块之后缺少 End If 语句?显示的代码有什么错误?
  • 什么是Or_?这不是我熟悉的语言。您可能要考虑为此使用Select Case,我认为它最适合您正在做的事情。
  • 另外:这是独立的 VB,还是 Excel 中的 VBA? (无论哪种方式,我的建议都成立。)
  • “不编译”和“不工作”是两个不同的东西。 “不工作”意味着代码确实编译并正在运行。您的代码未编译。
  • 我建议在任何模块中使用Option Explicit On 作为第一行;这将使拼写错误的变量成为错误,而不是默默地创建新的东西。

标签: excel vba if-statement


【解决方案1】:

Or_ 不存在于 VBA 中,因此当您尝试使用它时遇到编译错误也就不足为奇了。这种用法很不寻常,可能会使编译器感到困惑,这可能就是为什么直到第二个或第三个(或者甚至可能是不相关的语句)才会收到错误消息的原因。

您可以使用Select Case 语句或在条件之间使用ElseIf 来完成这项工作。我认为Select Case 对于这个问题来说更自然一些。它应该是这样的:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim TriggerCell As Range

    Set Triggercell = Range("$J$14")

    If Application.Intersect(TriggerCell, Target) Is Nothing Then Exit Sub
    
    Select Case Triggercell.Value
        Case "Electrician, farm based business"
            Rows("19:2500").Hidden = False
            Rows("26:2500").Hidden = True
        Case "Plumbing and heating contractors, farm based business"
            Rows("19:2500").Hidden = False
            Rows("19:25").Hidden = True
            Rows("47:2500").Hidden = True
        'Etc.
    End Select
End Sub

请注意(根据对此答案的评论)您不能为 Rows 指定两个单独的范围,这是原始代码中的几个块的问题。我已经相应地更新了答案。

【讨论】:

  • 感谢代码示例。我已经更新以反映,但我得到了相同的结果。当它运行时,它似乎停在第 3 条语句的第一行并显示所有行,而不仅仅是适用于语句 Case "Plumbing contracters, farm based business" Rows("19:2500").Hidden = False Rows 的行("19:46", "55:2500").Hidden = True
  • 抱歉代码示例,我无法正确粘贴
  • @Shelley 您是否尝试过设置断点并单步执行代码?也许如果你这样做,你会看到一个明显的问题。我现在不能确切地说出了什么问题。如果您遇到错误,请提供确切的错误消息。
  • 我已经多次单步执行代码,但没有显示错误消息或使用“运行”代码按钮
  • @Shelley 因此,如果您没有错误消息,那么肯定还有其他问题。我建议使用一些观察变量并观察控制流,以了解实际执行与您应该如何进行的心理模型有何不同。
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多