【问题标题】:Having trouble understanding the logic behind "If..Then Go To" in VBA Excel无法理解 VBA Excel 中“If..Then Go To”背后的逻辑
【发布时间】:2019-04-11 20:41:03
【问题描述】:

我正在阅读其他人编写的一些 VBA 代码,但我无法理解其背后的逻辑:

Sheets("IC View").Select
RowCount = Cells(Rows.Count, 1).End(xlUp).Row

If RowCount <= 9 Then GoTo skipNoChange

    'Sheets("IC View").Select
    Range("A1:BG1").EntireColumn.Hidden = False
    Range(Cells(10, "A"), Cells(LastRowIC, 
   "BG")).SpecialCells(xlCellTypeVisible).Copy

    Worksheets("IC Log").Select
    nextRowLog = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Range("A" & nextRowLog).PasteSpecial xlPasteValues
    Application.CutCopyMode = False

skipNoChange:

Sheets("IC View").Select
zeroCheck = 2   'start at column 3
    Do While Cells(9, zeroCheck + 1).value <> "Checked_By"
        If Cells(9, zeroCheck + 1).value = "" Then Columns(zeroCheck + 
        1).EntireColumn.Hidden = True
        If Cells(9, zeroCheck + 1).value <> "" Then Columns(zeroCheck + 
        1).EntireColumn.Hidden = False
        zeroCheck = zeroCheck + 1
     Loop

'==================================
Call checkFreesaleChanges

因此,如果行数小于或等于 9,那么我知道它需要转到“SkipNoChange”,但“SkipNoChange”在哪里结束?它是否以“zeroCheck ... Loop”结束,然后转到“Call checkFreesaleChanges”?

如果行数大于 9 会怎样?它是否继续执行代码但不运行'skipNoChange:...Loop'之间的位但确实运行CallcheckFreesaleChanges?

【问题讨论】:

  • 但是 'SkipNoChange 在哪里结束? 它没有。我建议您使用 if then... end if 在我看来它使代码更易于阅读
  • @Andreas 我只是想了解代码中发生了什么,因为我无法在不知道逻辑的情况下更改它。 'skipNoChange' 肯定会在某个地方结束,因为如果行数大于 9,那么需要有一些行(与 skipNoChange 相关)没有运行?
  • 没有。如果行数超过 9,您对编译器说 “跳过所有这些,然后从那里正常恢复。”。没有尽头。这就像告诉某人走那个方向。
  • @andreas 跳过所有内容?并从哪里恢复? ..现在只是阅读你的答案:)
  • 目前的逻辑就是:如果rowcount

标签: excel vba loops if-statement


【解决方案1】:

这是一个 if then.... Else.... end if 的示例。

在我看来,它使代码更易于阅读和理解。
将 cmets 添加到 else 和 end if 行意味着您无需上下滚动即可查看 else 或 end if 的用途。

Sheets("IC View").Select
RowCount = Cells(Rows.Count, 1).End(xlUp).Row


If RowCount > 9 Then 
    'Sheets("IC View").Select
    Range("A1:BG1").EntireColumn.Hidden = False
    Range(Cells(10, "A"), Cells(LastRowIC, 
   "BG")).SpecialCells(xlCellTypeVisible).Copy

    Worksheets("IC Log").Select
    nextRowLog = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Range("A" & nextRowLog).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
Else ' rowcount is less than 9
    msgbox "Rowcount is less than 9"
End If ' end of if rowcount syntax

Sheets("IC View").Select
zeroCheck = 2   'start at column 3
    Do While Cells(9, zeroCheck + 1).value <> "Checked_By"
        If Cells(9, zeroCheck + 1).value = "" Then Columns(zeroCheck + 
        1).EntireColumn.Hidden = True
        If Cells(9, zeroCheck + 1).value <> "" Then Columns(zeroCheck + 
        1).EntireColumn.Hidden = False
        zeroCheck = zeroCheck + 1
     Loop

'==================================
Call checkFreesaleChanges

【讨论】:

  • 感谢您的帮助!
  • @Sorath 没问题。另一个旅行是在 VBA 编辑器中使用调试器。按 F8,代码将运行一行。如果您使用即时窗口,那么您可以写 Rowcount = 5 并下到您的 if 看看会发生什么。然后只需向上拖动黄线并在即时窗口中输入Rowcount = 15,然后按F8重试
  • 对不起,我以为我理解了逻辑,但我又困惑了! 'Then' 和 'GoTo' 是要一起读的吗?因为根据你的逻辑 GoTo skipNoChange 发生在 rowcount >9 @andreas
  • 我认为您应该写“如果行数 >9,则以红色运行代码”
【解决方案2】:

skipNoChange: 是一个标签,一个占位符。您可以使用任何以冒号结尾的单词:

它通常用于 VBA 中的错误处理。

Sub DoSomething
   on error goto hell
   'some code here
   ....
Ciao:
   exit Sub

hell:
   msgbox "Shit happens"
   resume Ciao

End Sub

【讨论】:

    【解决方案3】:

    GoTo Statement

    无条件分支到过程中的指定行。

    语法转到行

    所需的行参数可以是任何行标签或行号。

    skipNoChange: 是一个行标签,因为它完全位于左侧,并且行以: 结尾,之后什么都没有。尝试缩进标签 - 它会移回代码窗格的左侧。

    在你的例子中:

    If RowCount <= 9 Then GoTo skipNoChange
    

    其中RowCountCells(Rows.Count, 1).End(xlUp).Row 确定,您是说活动表A 列中最后填充的行(由从工作表底部向上确定)是否为skipNoChange。这是有条件的控制权转移。程序控制切换到行标签。该条件测试和标签之间的线不作为此时执行。如果代码稍后循环返回并且不满足条件,那么它们将来可能会被执行。程序从标签开始继续执行。它几乎就像在“GoTo”上一样。

    许多GoTos 使程序流难以理解和阅读。通常,您可以重写以使用不同的控制流结构,如其他答案中的至少一个所示。

    这是结构化编程真正起飞之前的遗物。有趣的阅​​读here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2015-04-13
      • 2018-10-30
      • 1970-01-01
      相关资源
      最近更新 更多