无法理解VBA Excel中“ If..Then Go To”背后的逻辑

时间:2018-11-08 10:42:31

标签: excel vba excel-vba loops if-statement

我正在阅读其他人编写的一些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 ...循环”结束,然后转到“调用checkFreesaleChanges”?

如果行数大于9怎么办?它会继续执行代码,但不会在'skipNoChange:... Loop'之间运行,但是会继续运行CallcheckFreesaleChanges吗?

3 个答案:

答案 0 :(得分:2)

这里是if if ....否则.... if结束的例子。

我认为它使代码更易于阅读和遵循。
将注释添加到else并在行结束时表示您无需上下滚动即可查看else或end的目的。

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

答案 1 :(得分:2)

skipNoChange:是标签,占位符。您可以使用任何以冒号:

结尾的单词

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

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

hell:
   msgbox "Shit happens"
   resume Ciao

End Sub

答案 2 :(得分:0)

GoTo Statement

  

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

     

语法转到行

     

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

skipNoChange:是一个行标签,其事实是它完全在左侧,并且该行以:结尾,之后没有任何内容。尝试使标签缩进-标签将移回到代码窗格的左侧。

在您的示例中:

If RowCount <= 9 Then GoTo skipNoChange

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

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

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