标签: rubberduck

Rubberduck VBA 代码检查:成员“x”具有值为“-1”的“VB_VarHelpID”属性,但没有相应的注释

我正在使用“工作表抽象\工作表代理”技术开发 Excel VBA 项目,在没有工作表文章和我的问题here中的后续问题中进行了描述。我的 VBA 代码是按照 MVP 设计模式构建的,并且我编写了尽可能多的 OOP 代码。Rubberduck 的“代码检查”功能在此过程中提供了很大帮助,但是在最近的版本中(我认为从 v2.4.1.4*** 开始,但我无法准确指出确切版本)我开始始终如一地得到一些我不太理解的“Rubberduck Opportunities”和“Code Quality Issues”警告。

正如标题中提到的,第一个是Member 'x' has a 'VB_VarHelpID' attribute with value '-1', but no corresponding annotationRubberduck Opportunity。每当我在“WorksheetProxy”类中声明事件公开工作表(或其他事件公开对象,即命令按钮)时,我都会得到这个。以下代码中的两行都会触发此错误:

' This code sits in my ProcessMasterProxy class
Private WithEvents sheet As Worksheet
Private WithEvents buttonHideOwnerToAvailability As CommandButton
Run Code Online (Sandbox Code Playgroud)

然后,每当我声明一个事件公开“SheetProxy”类的实例或一个事件公开用户表单时,我都会在“Presenter”类中得到相同的错误:

' Here I am declaring an instance of the ProcessMasterProxy class from the above snippet
Private WithEvents assetPrx As ProcessMasterProxy
Private WithEvents view …
Run Code Online (Sandbox Code Playgroud)

excel vba rubberduck

4
推荐指数
1
解决办法
330
查看次数

Rubberduck VBA:什么可能导致解析器错误?

感谢这个问题:Rubberduck UI子菜单被禁用,我知道我可能必须点击"刷新按钮"才能使用RubberduckVBA.

其中一个可能出现的错误显然是"解析器错误".

在此输入图像描述

可能出现这种解析器错误的不同情况有哪些?

vba rubberduck

3
推荐指数
1
解决办法
251
查看次数

如何使用RubberDuck'@PredeclaredID设置属性VB_PredeclaredId

作为Rubberduck和OOP的新手,我仍在学习如何使用该软件并利用编程技术

第一次看到文件夹注释(https://github.com/rubberduck-vba/Rubberduck/wiki/Using-@Folder-Annotations)时,它的工作方式非常直观。

但是随后出现了VB_Attribute注释(https://github.com/rubberduck-vba/Rubberduck/wiki/VB_Attribute-Annotations),我不知道如何使它们工作。

希望这可以节省一些时间以供人们使用该功能

编辑:

为了使属性的需求更具体化,这是克里斯托弗·麦克莱伦(Christopher J. McClellan)发现的一篇很棒的文章

https://christopherjmcclellan.wordpress.com/2015/04/21/vb-attributes-what-are-they-and-why-should-we-use-them/

RubberDuck的优点在于,您无需手动执行“导出/编辑/导入”部分,只需单击几下即可完成答案,如下面的答案所述。

oop vba attributes rubberduck

3
推荐指数
1
解决办法
53
查看次数

我是否可以更改私有方法可见性以对其进行单元测试

我在这个答案中看到,对于Java,您可以在单元测试中将私有方法的可见性设置为"true",以便测试该方法.有没有这样的东西可用于VBA,所以我可以使用RD-VBA对私有方法进行单元测试?

如果没有,并且我有一个类在三个私有方法中计算出一些逻辑并将其返回给返回值,我注定只给出一个输入值并测试返回值,而不能测试三个私有方法在两者之间做升降机吗?

tdd vba unit-testing rubberduck

2
推荐指数
1
解决办法
88
查看次数

如何使用Rubberduck编辑带有VBA代码的文件,并且在VBA项目中不留下Rubberduck的痕迹

我对Rubberduck 的一个非常限制因素是,仅仅在安装了Rubberduck 的开发PC 上打开VBA 项目就会对其进行修改。即使我没有故意更改任何内容而只是查看它,某些内容也会发生变化,因为 VB 编辑器会询问我是否要将更改保存到它打开的每个项目中。

将此与使用纯文本文件作为源代码的“正常”编程语言进行比较。例如,如果我从某人那里收到一个 .py python 脚本,对其进行编辑以添加一个功能并将其发回,他们永远不会知道,如果我使用记事本、vscode、vim 或其他任何东西来编辑它,对他们来说也没有什么关系

如果我对 VBA 项目做了同样的事情,并且安装了 ruby​​duck,它会以某种方式更改文件,甚至是我不应该接触的部分代码,这正是我想要避免的。如果可能的话,我想让自己使用Rubberduck 变得不再重要。

我想要实现的是:

  • 我收到一个包含 VBA 项目的二进制文件,我的任务是添加一个函数
  • 我编辑它以添加我的功能,但我保留了许多现有模块和其他代码不变
  • 也许我自己使用rubberduck功能只是为了让编码更容易,也许我这边有一些测试
  • 我以某种方式“清理”了 VBA 项目,使其免受 Rubberduck 可能已进行或需要进行的任何其他修改的影响
  • 我将文件发回给他们,他们不可能知道我在计算机中使用了 Rubberduck,而且除了我编写的新函数之外,VBA 项目中的任何其他内容都没有受到影响

关键要求是:

  • 他们发送二进制文件(例如 .xlsxm)并需要接收返回的相同内容(.xlsxm,但我在某个模块中添加了一个函数)。例如,我无法仅将文本文件中的 VB 源代码发回给他们
  • 我不能碰任何我不该碰的东西
  • 接收者是另一位开发人员,因此 VBA 项目源代码对他们来说很重要,而不是最终用户看不到它
  • 不寻找任何特定于应用程序的内容,excel 文件只是一个示例

我唯一想到的是将文本复制到另一个项目的各种形式(直接,或导出到文本文件,然后导入或类似),但这听起来有问题:

  • 涉及手动步骤并且容易出错。可能会带来比我一开始想要解决的问题更多的问题
  • 我不知道 Rubberduck 对整个项目产生的所有影响和变化。也许甚至有一些不仅仅涉及“文本”源代码本身?我如何确定文件 100% 干净?

我确实看到了这个问题,但它涉及专门排除测试模块的代码。就我而言,我想知道是否有一种正确、干净的方法来完全避免 Rubberduck 的所有副作用,而不仅仅是不包含某个模块或代码段。

vba rubberduck

2
推荐指数
1
解决办法
101
查看次数

为什么按索引引用工作表仍然隐式引用按活动表引用

我有下面的代码来格式化工作表。该工作簿中有多个工作表,因此我只想对第一个工作表执行操作。但是,如果我有除第一个激活之外的任何工作表(例如第二个工作表),则代码会引发 1004 错误。我不知道为什么,因为我正在指定和定义目标工作表。

Option Explicit

Sub SelectByJobNumber()
    Dim LastRow As Long
    Dim OperatingRow As Variant
    Dim CountOfMatching As Long
    
    Dim WB As Worksheet
    Set WB = ThisWorkbook.Worksheets(1)
    
    LastRow = WB.Cells(ActiveSheet.Rows.Count, "C").End(xlUp).Row
    
        WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22)).Formula = "=" & "Sum(S74:S" & LastRow & ")"
        WB.Range(Cells(LastRow + 2, 19), Cells(LastRow + 2, 22)).NumberFormat = "$#,##0.00"
    
    For OperatingRow = 74 To LastRow
        
        If WB.Cells(OperatingRow, 3) = WB.Cells(OperatingRow + 1, 3) Then

            CountOfMatching = CountOfMatching + 1

        Else
            
                WB.Range(Cells(OperatingRow - …
Run Code Online (Sandbox Code Playgroud)

excel vba rubberduck

0
推荐指数
1
解决办法
82
查看次数

标签 统计

rubberduck ×6

vba ×6

excel ×2

attributes ×1

oop ×1

tdd ×1

unit-testing ×1