gpt4 book ai didi

vba - 代码检查 - 命名范围引用

转载 作者:行者123 更新时间:2023-12-04 09:45:43 26 4
gpt4 key购买 nike

在 Rubberduck 2.0.11.2453 中运行代码检查后,有 4 个 Range 引用被标记为:

Member 'Range' implicitly references ActiveSheet



有问题的范围是指命名范围。是否有必要限定命名范围引用?
Private Sub RunORatio(ByVal TabNum As Integer)
Dim Start As Integer, Cat As Integer, iMth As Integer, CurrentRow As Integer, Report As Integer
Dim wsORatio As Worksheet, wsData As Worksheet, wsMacro As Worksheet
Dim sMap As String, Test As String

With ActiveWorkbook
Set wsMacro = .Worksheets("Macro")
Set wsORatio = .Worksheets("ORatio" & TabNum)
With wsORatio
sMap = "oratio" & TabNum & "map"
For CurrentRow = 1 To Range(sMap).Rows.Count '<---1 here
Test = Range(sMap).Cells(CurrentRow, 1) '<---1 Here
Set wsData = ActiveWorkbook.Worksheets(Test)
Start = Range(Range(sMap).Cells(CurrentRow, 2)).Row '<---2 Here
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
End Sub

最佳答案

Disclaimer: I'm heavily involved in the development of Rubberduck.



考虑这个常见的错误:
lastRow = Worksheets("Sheet12").Cells(1, Rows.Count).End(xlUp).Row
Rows不合格,因此隐含引用事件工作表,因此 Rows.Count不一定是“Sheet12”上的行数。该代码可能有效,但也可能导致 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 Stack Overflow questions . “错误 1004”产生 1465 Stack Overflow questions .

对事件工作表的隐式引用是错误的常见原因。

Rubberduck 的 VBA 代码检查类似于 ReSharper 的 C# 静态代码分析、提示/建议。该工具告诉您,这里可能存在一些可能导致问题的东西,或者使代码变得不那么明确。

您是否需要完全限定每一个 Range称呼?当然不是——Rubberduck 只是让您知道,在这些情况下, ActiveSheet被隐式引用,仅此而已。

你总是可以告诉 Rubberduck “看,我知道我在做什么”,使用“忽略一次”快速修复:

ignore once

该“修复”插入了一个特殊注释(在内部,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

这些注释的优点是告诉读者( future 的你,或者接管你的代码的人)这里发生了一些事情。

future 版本最终将支持指定 @Ignore在模块级别注释一次,以忽略整个模块中特定检查的所有结果。

请注意,检查属于可维护性和可读性问题类别。 Range("DefinedName")不像以下那样明确和故障安全:
ActiveWorkbook.Names("DefinedName").RefersToRange

这为您提供了相同的范围,并且读起来就像它实际上是在拉取工作簿级别的命名范围。

关于vba - 代码检查 - 命名范围引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41981099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com