免责声明:我积极参与了 Rubberduck 的开发。
考虑一下这个常见的错误:
lastRow = Worksheets("Sheet12").Cells(1, Rows.Count).End(xlUp).Row
Rows
是不合格的,因此隐式引用活动工作表,因此Rows.Count
不一定是“Sheet12”上的行数。代码might工作,但它也可能导致一个微妙的错误lastRow
因此,根据活动工作表的内容,没有正确的值。
或者这个:
ActiveWorkbook.Worksheets("SummarySheet") _
.ListObjects("Table1").Sort.SortFields.Add _
Key:=Range("Table1[[#All],["Date]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
看见?因为Key
参数不合格,调用将在运行时失败,并出现错误 1004 - “对象 '_Global' 的方法 'Range' 失败”。那是169 堆栈溢出问题。产生“错误 1004”1465 堆栈溢出问题.
对活动工作表的隐式引用是导致错误的一个非常常见的原因。
Rubberduck 的 VBA 代码检查与 ReSharper 的 C# 静态代码分析一样,提示/建议。该工具告诉您,这里可能有一些东西could导致问题,或者使代码不够明确。
Do you need完全符合资格每一个Range
call?当然不是——Rubberduck 只是让你知道,在这些情况下,ActiveSheet
被隐式引用,这就是它的全部内容。
您始终可以使用“忽略一次”快速修复来告诉 Rubberduck“看,我知道我在做什么”:
该“修复”插入了一个特殊的注释(Rubberduck 在内部将其称为“注释”),指示检查忽略特定结果,同时保持检查启用:
With ActiveWorkbook
Set wsMacro = .Worksheets("Macro")
Set wsORatio = .Worksheets("ORatio" & TabNum)
With wsORatio
sMap = "oratio" & TabNum & "map"
'@Ignore ImplicitActiveSheetReference
For CurrentRow = 1 To Range(sMap).Rows.Count
'@Ignore ImplicitActiveSheetReference
Test = Range(sMap).Cells(CurrentRow, 1)
Set wsData = ActiveWorkbook.Worksheets(Test)
'@Ignore ImplicitActiveSheetReference
Start = Range(Range(sMap).Cells(CurrentRow, 2)).Row
Report = wsMacro.Range(sMap).Cells(CurrentRow, 3)
For Cat = 0 To 12
For iMth = 1 To 12
wsORatio.Cells(Report + Cat, 7 + iMth) = wsData.Cells(Start + Cat, 37 + iMth)
Next iMth
Next Cat
Next CurrentRow
End With
End With
这些注释的优点是告诉读者(未来的你,或者接管你的代码的人)这里发生了一些事情。
未来版本最终将支持指定@Ignore
在模块级别进行一次注释,以忽略整个模块中特定检查的所有结果。
请注意,检查是在可维护性和可读性问题类别。Range("DefinedName")
并不像以下那样明确和安全:
ActiveWorkbook.Names("DefinedName").RefersToRange
这给了你相同的范围,and读起来就像它实际上正在拉取工作簿级别范围内的命名范围。