代码检查 - 命名范围参考

2023-11-24

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

成员“Range”隐式引用 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

免责声明:我积极参与了 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“看,我知道我在做什么”:

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

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

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


请注意,检查是在可维护性和可读性问题类别。Range("DefinedName")并不像以下那样明确和安全:

ActiveWorkbook.Names("DefinedName").RefersToRange

这给了你相同的范围,and读起来就像它实际上正在拉取工作簿级别范围内的命名范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码检查 - 命名范围参考 的相关文章

  • 使用 VBA 在另一个 Access 实例中打开特定窗体

    所以我在这里四处查看并找不到我的问题的答案 至少不完全是 案例如下 我在 DBase1 中 想要单击一个按钮并在单独的访问实例中打开 DBase2 中的 NeuSteckbrief 表单 我设法使用以下代码在单独的实例中打开 DBase2
  • 在 Word 2010 中复制形状而不使用 .Select?

    是否可以在 Word 2010 中复制形状而无需借助 Select 根据开发中心 http msdn microsoft com en us library office ff835500 aspx the Anchor属性返回形状的锚定范
  • 按日期计算 Outlook 中的电子邮件

    我有以下代码来计算 Outlook 文件夹中的电子邮件数量 Sub HowManyEmails Dim objOutlook As Object objnSpace As Object objFolder As Object Dim Ema
  • 元素不存在,尽管它具有 ID 属性

    在 selenium excel vba 中 我试图了解有关如何处理 CSS 选择器的更多信息 我很想知道 因为在检查带有 ID 的元素并运行代码时 我收到一条消息 指出未找到该元素 这是到目前为止的代码 Private bot As Ne
  • 在 vba 上将值粘贴到另一个工作簿工作表上时出现问题

    我有以下代码 以便从工作簿复制工作表并将其粘贴到另一个名为 Control de precios 的工作簿的工作表 1 上 Sub createSpreadSheet Set NewBook Workbooks Add With NewBo
  • 通过文本自动创建到另一个工作表的超链接

    我想知道如何基于各自工作表中两个单元格具有的相同文本值 通过脚本自动创建从一个 Excel 工作表到另一个 Excel 工作表的超链接 如果这可以在没有脚本的情况下完成 使用某种公式 如 VLOOKUP 这将是更好的选择 谢谢你的时间 使用
  • 更改索引设置访问 VBA

    我正在尝试自动化 Access 中的流程 我希望自动化的步骤之一是更改表中某些字段的索引设置 我需要这样做来提高后续查询的速度 使用索引查询速度大约快 100 倍 无论如何 假设我的表名为 Cars 如下所示 ID Name Charact
  • 使用查询选择器从 VBA 中抓取

    我使用了该网站的代码来提取数据site https bazashifer ru proflist profnastil Option Explicit Public Sub GetInfo Dim sResponse As String i
  • 报告文字颠倒?

    由于特定原因 我需要能够在报告的下半部分颠倒 倒置 显示一些值 这份报告的目的是打印并从中间折叠起来 所以我希望它遵循这种特定的格式 我找不到任何可以轻松做到这一点的东西 我考虑过但不知道如何实施的一些想法 导入 颠倒字体并将控件的字体设置
  • 列表框:添加组合框作为项目?

    是否可以将列表框的每个项目都作为组合框 我需要这个 因为我将列表框设置为可检查 然后我需要让用户从列表中每个元素的不同选项中进行选择 Thanks 如果您不打算分发您的应用程序 那么您还可以查看 TreeView 控件 请参阅此示例 COD
  • 使用 PDFMAKER 将多封电子邮件保存为 pdf

    我是 VBA 的新手 但我用 SAS 编写了一些程序 用汇编程序 大型机和 PC Word Perfect 宏 编写了一些程序 用 Java HTML 和其他东西编写了一些程序 我所做的是 当我遇到问题并且我认为我可以对其进行编程时 我会在
  • schema.ini 文件不适用于 MS Access

    我有一堆 csv 文件 我通过 VBA 将它们导入到 Access 中的表中 我在与导入的 csv 文件相同的目录中还有一个 schema ini 文件 尽管在 ini 文件中字段被指定为双精度类型 但它们在 Access 中会转换为文本类
  • 拆分具有多行文本和单行文本的行

    我试图弄清楚如何拆分数据行 其中行中的 B C D 列包含多行 而其他列不包含多行 我已经弄清楚如何拆分多行单元格 如果我将这些列复制到新工作表中 手动插入行 然后运行下面的宏 仅适用于 A 列 但我在编码时迷失了休息 Here s wha
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 由于直接引用范围而不是通过中间变量而导致 Excel VBA 运行时错误 450

    当我尝试直接引用某个范围内的值时 出现运行时错误 450 但如果我使用中间变量 它就会起作用 我不明白为什么 所以我担心在将来的某个时候我会再次遇到错误而不知道为什么 我尝试过使用 With End With 块 但当我直接引用范围时它仍然
  • 将包含换行符的文本文件导入到 Excel 中

    我有一个纯文本文件 如下所示 some text containing line breaks 我正在尝试说话excel 2004 Mac v 11 5 正确打开此文件 我希望只看到一个单元格 A1 包含上述所有内容 不带引号 但可惜的是
  • Excel VBA 导出到文本文件。需要删除空行

    我有一个工作簿 使用以下脚本将其导出到文本文件 它工作正常 但是当我打开文本文件时 末尾总是有一个空行 这导致我在生成此文本文件后运行的另一个脚本出现问题 有关如何从导出中删除空行的任何帮助 Code Sub Rectangle1 Clic
  • 如何在不滚动的情况下截取整个电子邮件正文?

    我正在使用 OL2010 想要制作整个电子邮件的屏幕截图 不仅仅是 屏幕 可以用VBA或者外部程序来完成吗 有一个类似的问题 https stackoverflow com questions 4176340关于如何使用 C 实现这一点 注
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • 在组合框中显示可见工作表

    您好 我有以下代码来在组合框中显示工作表 创建工作表后 工作表会自动添加到列表中 我不希望隐藏的工作表在保管箱中可见 我怎么做 Option Explicit Private Sub ComboBox1 Change If ComboBox

随机推荐

  • ggplot2:手动添加图例

    我怎样才能绘制地图any现有 ggplot 的 不相关 图例 免责声明 请不要恨我 我知道使用 ggplot2 创建图例的最佳方法是正确映射数据 99 的情况下我都会这样做 然而 我在这里要求的东西通常可以给我任何我想要的传奇 As an
  • 如何使用 Ninject 实例化 MEF 导出对象?

    我的应用程序正在使用 MEF 从外部程序集中导出一些类 这些类是为构造函数注入而设置的 我面临的问题是 当我尝试访问这些类时 MEF 正在尝试实例化这些类 有没有办法让 Ninject 负责类的实例化 IEnumerable
  • Java 中带有整数键的哈希表

    我正在尝试创建一个哈希表 如下所示 Hashtable
  • 将 T-SQL 语句解析为标记

    你可以看到here多好啊C 代码语句被解析为标记 例如 以下代码 namespace MyNamespace class MyClass public void MyFunction int arg1 int var1 arg1 被解析为
  • 使用自定义类型扩展指定 DataTemplate.DataType

    我有这个标记扩展 public class NullableExtension TypeExtension public NullableExtension public NullableExtension string type base
  • PHP 中不使用 preg_match() 的 UTF-8 验证

    我需要验证一些以 UTF 8 编码的用户输入 许多人建议使用以下代码 preg match A x09 x0A x0D x20 x7E xC2 xDF x80 xBF xE0 xA0 xBF x80 xBF xE1 xEC xEE xEF
  • glVertexAttribPointer 内置顶点属性,如 gl_Vertex、gl_Normal

    我必须使用 glVertexAttribPointer 将顶点属性发送到期望它们作为内置的着色器 gl Vertex gl Color etc The glVertexAttribPointer函数需要指定每个内置属性的索引 或位置 我可以
  • 使用不同的 SQL 查询批量准备语句

    我发现现有的问题similar对于这个问题实际上并没有明确的答案 带有一个 sql 查询的普通批处理准备语句将如下所示 private static void batchInsertRecordsIntoTable throws SQLEx
  • 视图的 SELECT 在 FROM 子句中包含子查询

    我有两个表 我需要创建一个视图 这些表格是 credit orders id client id number of credits payment status credit usage id client id credits used
  • 带有CSS三角形的边框半径

    I have 一个矩形对角线的每一边都有自己的颜色 div width 0 height 0 border left 150px solid green border top 100px solid gray 现在我想向 div 添加边框半
  • 使我的 NumPy 数组跨进程共享

    我已经阅读了很多关于共享数组的问题 对于简单的数组来说 它似乎足够简单 但我一直试图让它适用于我拥有的数组 import numpy as np data np zeros 250 dtype float32 250000 2 float3
  • 在node.js中加载并执行外部js文件并访问局部变量?

    做一个简单的事情是否容易 可能include path to file Node js 中的命令类型 我想做的就是访问局部变量并运行脚本 人们通常如何组织比简单的 hello world 更大的 Node js 项目 功能齐全的动态网站 例
  • Excel 是否计算提供给 IF 函数的两个结果参数?

    Excel s if函数采用三个参数 一个条件 一个 if true 值和一个 if false 值 Excel 是否计算出所有三个参数的值 还是仅计算条件的值和相应的结果 澄清 我不知道是什么result of the if将会是 我想知
  • init 方法中的 [self release]、[self dealloc] 或 [super dealloc] ?

    我刚刚阅读了有关如何在 init 方法中正确失败的内容 并且文档似乎彼此不同意 一种建议抛出异常 另一种则建议清理并返回 nil 目前的最佳实践是什么 我相信普遍接受的做法是失败时返回零 但你确实想释放 self 以避免泄漏 id init
  • 如何等待数据写入管道的另一端

    我正在用 C 语言开发一个应用程序 父进程和子进程通过管道进行通信 在写入管道之前 父进程执行另一个语句 在示例代码中 我使用 sleep 10 来进行延迟 在子进程中 它应该从管道读取数据 但是子进程中管道的读取端不会读取数据 int m
  • 使用 JSoup 提取图像 src

    我正在尝试使用 jsoup 从此网页中提取所有图像网址 任何人都可以提供有关如何做到这一点的帮助吗 所有标签的格式都是这样的 但我只需要 src 图像 而不是 ajaxsrc img src http image cdnllnwnl xos
  • 使用 BACK 键隐藏键盘事件

    我注意到在Android Market Application 当您单击搜索按钮时 它会显示键盘 但是当您单击back按钮 搜索EditText变得不可见并且keyboard被隐藏 问题是我无法隐藏EditText按后退键后隐藏键盘后 因为
  • Visual Studio自定义构建步骤规则?

    使用 Visual Studio 2008 当我向 C 项目添加一个不存在的文件时 c cpp h rc或者 IDE 无法识别的任何内容都会弹出一个对话框 询问我是否要为此类文件创建自定义构建步骤规则 有谁知道如何在不添加文件的情 况下进入
  • [A]如何在javafx中使MP3重复播放?

    我希望我的 mp3 文件在完成后再次重复 但我无法创建循环来重复播放我的文件 我使用了这段代码 但只有它在完成后播放我的文件的第一秒 AudioClip myMusic myMusic setCycleCount AudioClip IND
  • 代码检查 - 命名范围参考

    在 Rubberduck 2 0 11 2453 中运行代码检查后 有 4 个范围引用被标记为 成员 Range 隐式引用 ActiveSheet 有问题的范围是指命名范围 是否有必要限定命名范围引用 Private Sub RunORat