【问题标题】:Why won't any of my IF/ELSEIF statements execute?为什么我的任何 IF/ELSEIF 语句都不会执行?
【发布时间】:2020-01-02 19:17:55
【问题描述】:

下面是我用 VBA 为 excel 编写的代码。我主要担心的是为什么这些都不会执行。每当我更改单元格值时,它都不会通过任何 if else 语句。我的理解是,只要工作表中的单元格值发生更改,就应该执行此子例程。然后我使用 if else 语句来确定正在更改哪些单元格,然后执行正确的计算。任何帮助将不胜感激。

谢谢!

    Private Sub Worksheet_Change(ByVal Target As Range)
    '////////////////////COLUMN C & E CALCULATION STEPS///////////////////////////
If (Target.Column = 3) Then
    If (Target.Row = 11) Then
        Range("D11").Value = Range("C11").Value / Range("C5").Value
    ElseIf (13 <= Target.Row <= 19) Then
        Range("D13").Value = Range("C13").Value / Range("C5").Value
        Range("D14").Value = Range("C14").Value / Range("C5").Value
        Range("D15").Value = Range("C15").Value / Range("C5").Value
        Range("D16").Value = Range("C16").Value / Range("C5").Value
        Range("D17").Value = Range("C17").Value / Range("C5").Value
        Range("D18").Value = Range("C18").Value / Range("C5").Value
        Range("D19").Value = Range("C19").Value / Range("C5").Value
    ElseIf (21 <= Target.Row <= 27) Then
        Range("D21").Value = Range("C21").Value / Range("C5").Value
        Range("D22").Value = Range("C22").Value / Range("C5").Value
        Range("D23").Value = Range("C23").Value / Range("C5").Value
        Range("D24").Value = Range("C24").Value / Range("C5").Value
        Range("D25").Value = Range("C25").Value / Range("C5").Value
        Range("D26").Value = Range("C26").Value / Range("C5").Value
        Range("D27").Value = Range("C27").Value / Range("C5").Value
    ElseIf (29 <= Target.Row <= 30) Then
        Range("D29").Value = Range("C29").Value / Range("C5").Value
        Range("D30").Value = Range("C30").Value / Range("C5").Value
    ElseIf (32 <= Target.Row <= 33) Then
        Range("D32").Value = Range("C32").Value / Range("C5").Value
        Range("D33").Value = Range("C33").Value / Range("C5").Value
    ElseIf (Target.Row = 35) Then
        Range("D35").Value = Range("C35").Value / Range("C5").Value
    ElseIf (37 <= Target.Row <= 39) Then
        Range("D37").Value = Range("C37").Value / Range("C5").Value
        Range("D38").Value = Range("C38").Value / Range("C5").Value
        Range("D39").Value = Range("C39").Value / Range("C5").Value
    ElseIf (Target.Row = 41) Then
        Range("D41").Value = Range("C41").Value / Range("C5").Value
    ElseIf (43 <= Target.Row <= 44) Then
        Range("D43").Value = Range("C43").Value / Range("C5").Value
        Range("D44").Value = Range("C44").Value / Range("C5").Value
    ElseIf (46 <= Target.Row <= 47) Then
        Range("D46").Value = Range("C46").Value / Range("C5").Value
        Range("D47").Value = Range("C47").Value / Range("C5").Value
    Else
    End If
ElseIf (Target.Column = 5) Then
    If (Target.Row = 11) Then
        Range("F11").Value = Range("E11").Value / Range("C5").Value
    ElseIf (13 <= Target.Row <= 19) Then
        Range("F13").Value = Range("E13").Value / Range("C5").Value
        Range("F14").Value = Range("E14").Value / Range("C5").Value
        Range("F15").Value = Range("E15").Value / Range("C5").Value
        Range("F16").Value = Range("E16").Value / Range("C5").Value
        Range("F17").Value = Range("E17").Value / Range("C5").Value
        Range("F18").Value = Range("E18").Value / Range("C5").Value
        Range("F19").Value = Range("E19").Value / Range("C5").Value
    ElseIf (21 <= Target.Row <= 27) Then
        Range("F21").Value = Range("E21").Value / Range("C5").Value
        Range("F22").Value = Range("E22").Value / Range("C5").Value
        Range("F23").Value = Range("E23").Value / Range("C5").Value
        Range("F24").Value = Range("E24").Value / Range("C5").Value
        Range("F25").Value = Range("E25").Value / Range("C5").Value
        Range("F26").Value = Range("E26").Value / Range("C5").Value
        Range("F27").Value = Range("E27").Value / Range("C5").Value
    ElseIf (29 <= Target.Row <= 30) Then
        Range("F29").Value = Range("E29").Value / Range("C5").Value
        Range("F30").Value = Range("E30").Value / Range("C5").Value
    ElseIf (32 <= Target.Row <= 33) Then
        Range("F32").Value = Range("E32").Value / Range("C5").Value
        Range("F33").Value = Range("E33").Value / Range("C5").Value
    ElseIf (Target.Row = 35) Then
        Range("F35").Value = Range("E35").Value / Range("C5").Value
    ElseIf (37 <= Target.Row <= 39) Then
        Range("F37").Value = Range("E37").Value / Range("C5").Value
        Range("F38").Value = Range("E38").Value / Range("C5").Value
        Range("F39").Value = Range("E39").Value / Range("C5").Value
    ElseIf (Target.Row = 41) Then
        Range("F41").Value = Range("E41").Value / Range("C5").Value
    ElseIf (43 <= Target.Row <= 44) Then
        Range("F43").Value = Range("E43").Value / Range("C5").Value
        Range("F44").Value = Range("E44").Value / Range("C5").Value
    ElseIf (46 <= Target.Row <= 47) Then
        Range("F46").Value = Range("E46").Value / Range("C5").Value
        Range("F47").Value = Range("E47").Value / Range("C5").Value
    Else
    End If

    '////////////////////COLUMN D & F CALCULATION STEPS///////////////////////////
    ElseIf (Target.Column = 4) Then
    If (Target.Row = 11) Then
        Range("C11").Value = Range("D11").Value * Range("C5").Value
    ElseIf (13 <= Target.Row <= 19) Then
        Range("C13").Value = Range("D13").Value * Range("C5").Value
        Range("C14").Value = Range("D14").Value * Range("C5").Value
        Range("C15").Value = Range("D15").Value * Range("C5").Value
        Range("C16").Value = Range("D16").Value * Range("C5").Value
        Range("C17").Value = Range("D17").Value * Range("C5").Value
        Range("C18").Value = Range("D18").Value * Range("C5").Value
        Range("C19").Value = Range("D19").Value * Range("C5").Value
    ElseIf (21 <= Target.Row <= 27) Then
        Range("C21").Value = Range("D21").Value * Range("C5").Value
        Range("C22").Value = Range("D22").Value * Range("C5").Value
        Range("C23").Value = Range("D23").Value * Range("C5").Value
        Range("C24").Value = Range("D24").Value * Range("C5").Value
        Range("C25").Value = Range("D25").Value * Range("C5").Value
        Range("C26").Value = Range("D26").Value * Range("C5").Value
        Range("C27").Value = Range("D27").Value * Range("C5").Value
    ElseIf (29 <= Target.Row <= 30) Then
        Range("C29").Value = Range("D29").Value * Range("C5").Value
        Range("C30").Value = Range("D30").Value * Range("C5").Value
    ElseIf (32 <= Target.Row <= 33) Then
        Range("C32").Value = Range("D32").Value * Range("C5").Value
        Range("C33").Value = Range("D33").Value * Range("C5").Value
    ElseIf (Target.Row = 35) Then
        Range("C35").Value = Range("D35").Value * Range("C5").Value
    ElseIf (37 <= Target.Row <= 39) Then
        Range("C37").Value = Range("D37").Value * Range("C5").Value
        Range("C38").Value = Range("D38").Value * Range("C5").Value
        Range("C39").Value = Range("D39").Value * Range("C5").Value
    ElseIf (Target.Row = 41) Then
        Range("C41").Value = Range("D41").Value * Range("C5").Value
    ElseIf (43 <= Target.Row <= 44) Then
        Range("C43").Value = Range("D43").Value * Range("C5").Value
        Range("C44").Value = Range("D44").Value * Range("C5").Value
    ElseIf (46 <= Target.Row <= 47) Then
        Range("C46").Value = Range("D46").Value * Range("C5").Value
        Range("C47").Value = Range("D47").Value * Range("C5").Value
    Else
    End If
ElseIf (Target.Column = 6) Then
    If (Target.Row = 11) Then
        Range("E11").Value = Range("F11").Value * Range("C5").Value
    ElseIf (13 <= Target.Row <= 19) Then
        Range("E13").Value = Range("F13").Value * Range("C5").Value
        Range("E14").Value = Range("F14").Value * Range("C5").Value
        Range("E15").Value = Range("E15").Value * Range("C5").Value
        Range("E16").Value = Range("F16").Value * Range("C5").Value
        Range("E17").Value = Range("F17").Value * Range("C5").Value
        Range("E18").Value = Range("F18").Value * Range("C5").Value
        Range("E19").Value = Range("F19").Value * Range("C5").Value
    ElseIf (21 <= Target.Row <= 27) Then
        Range("E21").Value = Range("F21").Value * Range("C5").Value
        Range("E22").Value = Range("F22").Value * Range("C5").Value
        Range("E23").Value = Range("F23").Value * Range("C5").Value
        Range("E24").Value = Range("F24").Value * Range("C5").Value
        Range("E25").Value = Range("F25").Value * Range("C5").Value
        Range("E26").Value = Range("F26").Value * Range("C5").Value
        Range("E27").Value = Range("F27").Value * Range("C5").Value
    ElseIf (29 <= Target.Row <= 30) Then
        Range("E29").Value = Range("F29").Value * Range("C5").Value
        Range("E30").Value = Range("F30").Value * Range("C5").Value
    ElseIf (32 <= Target.Row <= 33) Then
        Range("E32").Value = Range("F32").Value * Range("C5").Value
        Range("E33").Value = Range("F33").Value * Range("C5").Value
    ElseIf (Target.Row = 35) Then
        Range("E35").Value = Range("E35").Value * Range("C5").Value
    ElseIf (37 <= Target.Row <= 39) Then
        Range("E37").Value = Range("F37").Value * Range("C5").Value
        Range("E38").Value = Range("F38").Value * Range("C5").Value
        Range("E39").Value = Range("F39").Value * Range("C5").Value
    ElseIf (Target.Row = 41) Then
        Range("E41").Value = Range("F41").Value * Range("C5").Value
    ElseIf (43 <= Target.Row <= 44) Then
        Range("E43").Value = Range("F43").Value * Range("C5").Value
        Range("E44").Value = Range("F44").Value * Range("C5").Value
    ElseIf (46 <= Target.Row <= 47) Then
        Range("E46").Value = Range("F46").Value * Range("C5").Value
        Range("E47").Value = Range("F47").Value * Range("C5").Value
    Else
    End If
    Else
    End If
    End Sub

【问题讨论】:

  • 如果您更改 C 列中的值,这根本不会触发?在If (Target.Row = 11) 上放一个Break,看看它是否在你改变时能做到这一点,比如C2。此外,请确保此代码位于您希望它运行的工作表的 Worksheet 模块中。
  • 该事件适用于工作表中的任何单元格,但您的代码仅适用于在 C:C 列上修改的单元格。 (第 3 栏)。您的大多数条件都写错了,而且它们每次都是正确的,除了第 13 行的情况......
  • 请edit 尝试使用Select Case 提出问题,而不是发表评论,谢谢!
  • 当有人提供了解决您问题的答案时,您应该接受它,(点击勾号),而不是将答案编辑到 Q 中

标签: excel vba subroutine


【解决方案1】:

VBA 无法像您预期的那样处理x &lt;= y &lt;= z。它首先评估x &lt;= y,然后将结果(布尔值)与z 进行比较。

Select Case 更适合这种情况:

Select Case Target.Row
     Case 11
         ' do something
     Case 13 to 19
         ' do something else
     Case 21 to 27
         ' do the next thing 
     ' and so on
End Select

同样重要:禁用事件以避免重新触发事件:

Private Sub Worksheet_Change(ByVal Target As Range)
     On Error GoTo SafeExit:
     Application.EnableEvents = False

     ... your code

SafeExit:
     Application.EnableEvents = True
End Sub

【讨论】:

  • 其他方式。它从右到左解决。首先y&lt;=z 然后将该布尔值与x 进行比较
  • 谢谢!我将尝试看看是否可以使用与 if else 语句相同的嵌套逻辑来实现。
  • @ScottCraner - 这是我最初的想法,但无法在测试中复制。例如,? 5 &lt;= 6 &lt;= 7 返回True,但? 5 &lt;= (6 &lt;= 7) 返回False。如果从右到左计算,它们不应该都是False 吗?还是我错过了什么?
  • 你可能是对的。 ? 1=-1=true 返回 False,但 ? 1=1=true 返回 true。
  • ?True=1=1 => -1=1=1 => False=1 => False; ?1=1=-1 => True=-1 => True=True。它是从左到右的,但正如 BigBen 所指出的,VBA 将其评估为布尔表达式,然后可以将其转换回整数。胡思乱想的隐式转换非常不合逻辑。
猜你喜欢
  • 2017-07-02
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多