问题标签 [rubberduck]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
152 浏览

vba - 如果程序结束,RubberDuck 可以测试吗?

我正在使用 RubberDuck 开发测试,并想测试程序的 MsgBox 输出。问题是程序在输出 MsgBox 后立即结束——字面上有一个“结束”语句。

运行 RubberDuck 测试并使用 Fakes.MsgBox.Returns 时,会出现不确定的黄色结果,并显示消息“运行测试时出现意外的 COM 异常”

我尝试在测试结束时放置“Assert.Fail”;然而,似乎节目的结尾把事情搞砸了。

是否可以在 RubberDuck 中进行测试以检测程序是否结束?

0 投票
1 回答
143 浏览

excel - 设置(Private WithEvents As Sheet1) sheetUI = Sheet1 导致错误 438:对象不支持此属性或方法

我正在使用这个优秀的教程作为基础,利用 Mathieu Guindon 编写面向对象编程 VBA 代码的概念创建一个简单的“Hello World”Excel VBA 项目,该概念在https://rubberduckvba.wordpress上的一系列文章中进行了讨论。 com/博客。

我创建了一个“基本”项目,没有包含 Excel 工作表 (HelloSheet)、视图、ViewAdapter(包括 ViewCommands 和 ViewEvents 接口)和控制器的任何模型。VBA 项目编译时没有错误,但是当我尝试运行“应用程序条目”宏时,我得到了可怕的“运行时错误 438:对象不支持此属性或方法”。这发生在我的 View 类的 Class_Initialize() 子类中,我在其中声明了“Private WithEvents sheetUI As HelloSheet”并尝试设置“sheetUI = HelloSheet”。

是我的项目树的概述,如 RubberDuck VBIDE 中所示。

我尝试更新 VBA 项目引用以完全匹配“战舰”示例项目的引用。我还尝试了两种不同的方法来实现 View 类中的惰性对象/弱引用-原始文章中链接的“Battleship (WorksheetView).xlsm”中的一种与GitHub 上最新版本中使用的方法,更具体地说:

VS

..但“运行时错误 438:对象不支持此属性或方法”仍然存在。

以下是工作表、类、接口等中所有相关的代码拆分:

1)HelloSheet(常规Excel工作表代码隐藏):

2)SheetView类:

3) ISheetViewEvents 接口:

4) ISheetViewCommands 接口:

5)SheetViewAdapter 类(PredeclaredId / 有默认实例):

6)HelloController类:

7) 最后是作为入口点的“宏”标准模块。这是我遇到错误的地方(“Set view = New SheetView”行):

假设我可以绕过入门级错误,我会期待一个非常简单的功能:

1) 隐藏的 Excel 形状在 HelloSheet(OnLaunchCommand)上可见;

2)当双击一个单元格时,它所在的行将在同一个工作表的单元格A1中报告(Worksheet_BeforeDoubleClick事件)。

显然,这种简单任务的代码量是多余的——我的想法是,一旦我掌握了这些基础知识,就可以将模型类添加到项目中并将它们映射到工作簿中的某些区域(即表/列表对象)。

任何帮助将不胜感激!对任何完成这篇相当长的帖子的人表示敬意:)

0 投票
1 回答
194 浏览

excel - 当工作表的代码隐藏在“代理”接口+类中实现时正确处理工作表事件

我正在尝试进一步构建这个优秀的示例,它已经实现了这些非常有见地的 RubberduckVBA.com 文章中讨论的最佳实践:

  1. 通过代理类从 Excel 工作簿/工作表中抽象出来;
  2. 使用 UserForm 控件而不弄乱其默认实例的状态;
  3. 将“应用”逻辑添加到 #2

我想在现有示例中添加一个事件处理程序,它(为简单起见)报告 Sheet1 的“A1”单元格中 Sheet2 的“更改”范围左上角单元格的值,以及“A2”中的更改时间”。我通常会在 Sheet2 的代码隐藏中这样做:

但我想知道如何在给定的示例中最好地实现这一点,考虑到它是围绕 MVP 模式设计的,并通过代理接口利用工作簿和工作表抽象——这意味着预期零/最小工作表代码隐藏。

我能够理解事件处理是如何在令人敬畏的战舰教程中实现的,但它的设计在一些重要方面有所不同:

  1. “战舰”遵循 MVC 设计模式,而我想像示例中那样坚持使用 MVP;
  2. “战舰”通过“视图”类从其工作表中抽象出来,而我想为每个工作表有一个单独的代理接口+类;
  3. “战舰”部署了适配器模式,而我可以将视图和工作表代理实现与演示者耦合(如果可能的话,关于事件处理)。

考虑到这一点,我绝对希望看到一个代码示例,它将我上面描述的“Worksheet_Change”事件添加到已经实现工作簿和工作表代理并遵循 MVP 模式的基础项目中。

即使没有代码示例,如果我弄清楚这些问题也会有很大帮助:

  1. 工作表代理方法是否规定应该绝对零表代码隐藏?如果我在 Sheet2(不是它的代理)内开始我的“Worksheet_Change”事件实现,这会是朝着错误方向迈出的一步,如下所示:
  1. 如果不是绝对需要使用适配器模式进行事件处理,那么使用“IViewCommands”和“IViewEvents”接口来列出从 Presenter 发送到 View 的所有命令以及从 View 引发的事件是否仍然是一个好主意?分别发送给Presenter?
  2. 我假设我需要使用惰性对象/弱引用才能公开事件。如果是这样,并且假设我可以在没有适配器的情况下完成工作(参见上面的#2),这是否意味着我的“Sheet2Proxy”类将不得不通过它的“IViewEvents”来持有对 Presenter 的弱引用(再次参见 # 2)接口?
0 投票
1 回答
260 浏览

vba - VBA 的 IoC 容器

在 VBA 中很好地阅读了关于 DI 的内容:

https://rubberduckvba.wordpress.com/2016/07/05/oop-vba-pt-2-factories-and-cheap-hotels/

所以现在下一步是在 VBA 中使用 IoC 容器。但我想知道这是否可能!我是 VBA 的新手,我无法弄清楚一些事情:

  1. 如果在 VBA 中完成,则 VBA 没有名称空间或 C# 中的等效类型。那么我的查找表如何存储一个类型的唯一键呢?
  2. 我想过用 C# 编写一个 com dll 并在那里实现一个 IoC,但我不知道如何将接口类型传递给 com 接口。我什至无法实例化一个接口以将其作为对象传递给 com.

我是否简化为仅使用字符串并使用模块在 VBA 中实现命名空间?

PS:我没有找到任何用于 vba 的 IoC 容器的现有实现,所以如果有的话,我会全力以赴!

0 投票
1 回答
416 浏览

vba - 如何使用 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 的美妙之处在于您不需要手动执行导出/编辑/导入部分,只需单击几下即可完成,如下面的答案所述。

0 投票
1 回答
552 浏览

excel - 如何在没有 Rubberduck TestModules 的情况下交付 Excel VBA 应用程序?

我一直在使用 Rubberduck VBA 插件。

我想“交付”我的 Excel 应用程序,而不在参考资料中使用 Rubberduck 插件。你是怎么管理的?例如,是否可以“隐藏”TestModules 而不编译它们?

0 投票
1 回答
395 浏览

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

我正在使用“工作表抽象\工作表代理”技术开发一个 Excel VBA 项目,在没有工作表文章和我的问题中的后续问题中进行了描述。我的 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 机会。每当我在“WorksheetProxy”类中声明一个事件公开工作表(或其他事件公开对象,即命令按钮)时,我都会得到这个。以下代码中的两行都会触发此错误:

然后,每当我声明暴露事件的“SheetProxy”类的实例或暴露事件的 UserForm 时,我都会在“Presenter”类中得到相同的错误:

Rubberduck 的代码检查为此类错误提供了两种操作:1.“添加属性注释”'@MemberAttribute VB_VarHelpID, -1在声明上方插入行和 2.“删除属性”似乎什么都不做,单击后错误仍然存​​在。

我想知道“添加属性注释”修复对我的 VBA 项目有什么影响,以及我是否应该应用它,或者更确切地说要更改我的代码中的某些内容以避免完全出错。

同样,我担心我在“代码质量问题”部分中遇到的一个相关错误:To the variable 'sheet' of declared type 'EXCEL.EXE:Excel.Worksheet' a value is set assigned with the incompatible declared type 'ProcessMgmt.ProcessMaster'这与上面第一个片段中的“ProcessMasterProxy”类中的以下代码有关:

其中“ProcessMaster”是实际 Excel 工作表的名称,上述代码位于其相应的“SheetProxy”类中。

Code Inspections 针对此错误提供的唯一选项是“忽略一次”,我想知道这样做是否安全。我之前在几个项目中出现过这个错误,但那里一切正常。但是,在我最近的项目中,我在打开工作簿时开始随机收到“运行时错误 35010”,其中我的 Workbook_Open 事件中有以下代码:

此问题是否与上述两个代码检查建议/错误中的任何一个有关?

0 投票
1 回答
719 浏览

excel - 另一个班级的 VBA 提高活动

我正在尝试在 codereview 中实施这篇文章中的建议

客观的:

管理用户与 Excel 表 (ListObjects) 交互时发生的情况

最后的想法是为不同的表提供自定义事件。例如,当您向 table1 添加一行时,会引发自定义 AddEvent1,当您对 table2 执行相同操作时,会引发 AddEvent2。

将只有一个类来管理事件,而一个类来保存表格及其信息。


所以建议的过程是:

  1. 将 listobject 添加到一个名为Table
  2. 该类将监听父工作表(ChangeSelectionChange)上的事件
  3. TableManager当更改事件被触发时,从处理这些事件的类中触发一个自定义事件(像adding,updatingdeletingrows 的事件)

编辑#1:

调整代码:

  • Create函数现在返回一个实例Table
  • 并且该属性Set SourceTable现在将listObjectParentSheet字段设置为相应的值

但是仍然Table Manager不听引发的事件 listObjectParentSheet_Change


成分:

1) 带有 Excel 表格 (ListObject) 的工作表和后面的代码:

2) 类Table(使用Rubberduck将预先声明的 id 设置为 true )

3) 类TableManager


问题/问题:

我还没有弄清楚如何在TableManager课堂上触发“AddEvent”。我知道我搞砸了一些实例化类的概念,但我不知道我做错了什么。


预期结果:

AddEvent当用户更改列表对象的任何单元格时,在引发时显示消息框“添加内容”


任何帮助将非常感激。

编辑#2

最终代码感谢 Mat 的回答:

Sheet1::

模块:ListObjectUtilities

班级:ITable

班级:Table

班级:TableManager

示例文件

0 投票
1 回答
120 浏览

excel - 如何在“创建”函数中运行子程序以及如何为图表“系列”制作模拟/存根/伪造?

前言

大约 10 年前,我开始重构和改进ChartSeriesJohn Walkenbach 的类。不幸的是,原来的它似乎不再在线提供。

关注Rubberduck博客已经有一段时间了,现在我尝试提高我的 VBA 技能。但过去我只写过——我猜专家会称之为——“脚本般的上帝程序”(因为不知道更好)。所以我对类,尤其是接口和工厂很陌生。

实际问题

我尝试通过使用接口将其划分为多个类而不是添加单元测试来重构整个类。对于仅阅读Series.Formula公式的各个部分,获取然后进行所有处理就足够了。所以在函数中调用Runsub会很好。Create但到目前为止,我所做的一切都失败了。因此,我目前Run在所有Get属性等中运行(并测试,如果公式更改并退出Run比。这可能吗?如果是,如何?

其次,要添加单元测试——当然是使用——我目前依赖于真正的 Charts/ ChartObjects。如何为 stub/mock/fake 创建 stub/mock/fake Series?(对不起,我不知道正确的术语。)

这里是代码的简化版本。

非常感谢您的帮助。

普通模块

IChartSeries.cls

ChartSeries.cls

ISeriesPart.cls

SeriesPart.cls

ISeriesParts.cls

SeriesFormulaParts.cls

0 投票
2 回答
85 浏览

excel - 运行 RDVBA 测试后 Excel 在退出时挂起

以下示例包含三个 VBA 模块:两个类和一个常规模块。在我运行 RubberDuck VBA 测试然后尝试关闭 Excel 后,Excel 在主动使用 CPU 时挂起。运行一次测试不会每次都重现这个问题,但是当我至少运行两次时,似乎每次都会重现这个问题。


RDVBA 版本 2.5.2.5871
操作系统:Microsoft Windows NT 6.2.9200.0,x64

测试环境一:
主机产品:Microsoft Office XP x86
主机版本:10.0.6501
主机可执行文件:EXCEL.EXE

测试环境二:
主机产品:Microsoft Office 2016 x64
主机版本:16.0.4266.1001
主机可执行文件:EXCEL.EXE


模块测试.bas

Class1.cls

Class2.cls