我正在阅读其他人编写的一些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吗?
答案 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)
无条件分支到过程中的指定行。
语法转到行
必需的line参数可以是任何行标签或行号。
skipNoChange:
是一个行标签,其事实是它完全在左侧,并且该行以:
结尾,之后没有任何内容。尝试使标签缩进-标签将移回到代码窗格的左侧。
在您的示例中:
If RowCount <= 9 Then GoTo skipNoChange
其中RowCount
由Cells(Rows.Count, 1).End(xlUp).Row
确定,是说如果活动表的A列中最后填充的行是<= 9,则该行是从工作表的底部向上确定的,行标签skipNoChange
上的代码。这是控制的有条件转移。程序控制移至行标签。此时,不执行此条件测试和标签之间的线。如果代码稍后循环返回并且不满足条件,则将来可能会执行它们。程序将从标签开始继续执行。几乎就像在“ GoTo”上一样。
许多GoTo
使程序流程难以遵循和阅读。通常,您可以重写以使用其他回答流程中至少一个所示的不同控制流结构。
这是结构化编程真正兴起之前的遗物。有趣的阅读here。