问题标签 [vbe]

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 投票
0 回答
71 浏览

excel - VBA Excel - 在范围内执行命令 - 与其他工作簿交互

我一直在尝试如何解决这个问题。我锁定了我的 vba 项目,因为我不希望大多数人能够更改代码。问题是,我有根据用户输入修改其他模块的代码,这显然会导致问题,因为如果模块被锁定,您将无法修改它。因为我只是不做'sendkeys'(哈哈,来吧),没有实用的方法来解锁它,所以我可以修改代码。

所以我创建了一个 .xlam 加载项。模块将新代码写入文件,将其保存为 .bas 类型,然后加载项导入并运行它。

但...

我在与工作簿(为 .xlam 加载项生成模块的工作簿)交互时遇到问题。以下是我发现棘手的代码部分。它主要与使用所述工作簿执行自动填充和更新表单有关。

这些是首要问题。就个人而言,我宁愿直接从工作表中运行代码(换句话说,考虑一个模块执行 Range("A1") 中的内容 - 比如 "msgbox someString"),但我不确定这是否可能。想知道这个很久了

关于语法应该是什么的任何指针,例如 #1 和 #2 - 和/或关于如何直接从工作表执行代码的想法,从而一起绕过头痛?

0 投票
2 回答
1893 浏览

excel - Excel vba删除子代码

关于VBE。如果工作表不存在,它将创建它并在 Sheet1 中添加一个命令按钮。它还将添加 appr。私有子命令button1_click 的代码。这一切正常。这是将添加新子的现有代码的一部分:

但是,在添加“子代码”之前,它应该检查已经存在的(对象)中的子代码(对于 commandbutton1)是否已经存在,如果存在,则在添加新代码之前将其删除。

0 投票
2 回答
3435 浏览

excel - 为什么我需要打开 VBA 编辑器才能将数据加载到用户窗体中?

我有一个 Excel 文件,其中 VBA 宏将数据加载到用户窗体中。

如果我在没有打开编辑器的情况下运行它,它有时会崩溃并关闭 Excel。

如何修复我的文件,这样我就不需要先打开编辑器?

宏中的示例代码:

0 投票
1 回答
847 浏览

c# - 我怎么知道 `ThisWorkbook` 是 `Workbook`?

我正在使用 VBIDE API,不能假设宿主应用程序是 Excel 或任何 Office 应用程序。

所以我只知道我在看 a VBComponent,它Type就是vbext_ct_document

在 VBE 的即时窗格中,我可以获得以下输出:

但是该Sheet1对象只存在于运行时环境中,所以如果我是 C# 插件,我什至看不到它。

唯一可以接近我需要的东西是通过组件的ParentandNext属性:

这让我得到了我想要的类型名称......但是在错误的组件上!对于ThisWorkbook顶级文档对象,我将Application对象作为Parent

该方法可能有用,但前提是我对特定于主机的逻辑进行硬编码,该逻辑知道具有“应用程序”类型的“父”属性的任何组件都是Workbook当主机应用程序是 Excel 时的实例......并且不能保证其他主机中的其他文档模块甚至会有那个“父”属性,所以我很难过。

我对任何事情都持开放态度——从 p/invoke 调用和低级 COM“反射”魔法(ITypeInfo那种魔法)到......到......我不知道 -unsafe带有需要// here be dragons注释的时髦指针的代码-欢迎任何可能最终成为可行解决方案的线索。


AFAIK VBE 加载项与主机存在于同一进程中,因此在某个地方有一个指向VBA 项目中的ThisWorkbook任何Sheet1其他文档类型的指针。VBComponent

我想我只需要以某种方式抓住那个指针,我就会到达我需要的地方。

0 投票
2 回答
547 浏览

c# - 如何迭代 MS-Access 表单上的控件?

我有一个方法,给定 a VBComponent,我可以.Designer从那里访问 and.Controls集合:

此方法的问题在于,当主机为 MS-Access 时,form.Designernull,因此该方法提前返回。

这里的dynamic演员表并不是特别有用,似乎我可以转换到一个UserForm界面,它会“正常工作”——至少在 Excel 主机中。

但由于 MS-Access 的表单没有设计器 (???),我如何去迭代 MS-Access 表单上的控件,因为 C# 代码是 VBE 加载项(即只能轻松访问任何内容VBIDE API 可用)?

0 投票
2 回答
367 浏览

vba - 为什么粘贴时此代码会编译但否则会失败?

一位朋友让我看这个页面,并注意到一个论坛用户的签名中有一段奇怪的代码。

该代码是一个单行代码,如下所示:

滚动删除:

On Local Error Resume Next: If Not Empty Is Nothing Then Do While Null: ReDim i(True To False) As Currency: Loop: Else Debug.Assert CCur(CLng(CInt(CBool​​(False Imp True Xor False Eqv True))) ): Stop: On Local Error GoTo 0

非常令人兴奋的是,如果您只是将它按原样粘贴(然后不要再触摸它!)到有效的过程级范围内,那么该代码会编译(我没有尝试运行它,但这无关紧要)。

一些观察:

  • 如果将指令分隔符/冒号替换为新行,则不再编译
  • On Local Error可以简化为On Error
  • 乍一看,嵌套转换并没有什么特别的意义,但事实证明,用简单的转换和比较系列替换Debug.Assert True会使代码始终编译,因此其中的某些东西会弄乱编译器。
  • 如果粘贴代码,则编译;如果Local在 VBE 验证该行之后以任何方式对其进行了修改(甚至只是删除),它会停止编译,并且似乎没有任何东西可以让 VBA 再理解它,除非该行被删除并重新粘贴。
  • 最新的语法/解析器密切模仿实际的 VBA 规范,它解析和解析得很好(老实说,这让我大吃一惊)
  • 如果已知该行无法编译,然后剪切/重新粘贴,它不会编译......但从 VBE 外部再次重新粘贴它,它会突然编译。

问题是,这段代码如何根据 VB 语言规范进行编译?它是 VB[6|A|E] 实现中的错误吗?换句话说,它为什么/如何工作

认为它与指令分隔符 ( :) 和 inline-if 语法有关 - 鉴于没有End If语句,它单行而不是块。

但是,是什么让那个特定的代码成为薛定谔的代码?是什么让它既合法又非法?

如果代码被使用正式语法定义(ANTLR)生成的解析器正确解析,那么它一定是合法的构造吗?那么,当您只是回到那条线并按 ENTER 时,为什么它不再合法?

0 投票
1 回答
5895 浏览

vba - 打开多个 VBE 窗口(每个项目一个) - Word VBA

我在 VBA 中有几个项目可以在 Word 中完成。

问题是,目前我打开的所有项目都在 VBE 的同一个窗口中。我想打开一个以上的 VBE 窗口,这样我打开的每个项目都会有一个 VBE 窗口。

我之所以要这样做是因为我想要一个项目在我的左显示器上,另一个在我的右显示器上。这样我就可以同时看到他们两个。

有没有办法做到这一点 ?(谷歌没有给我答案)

编辑:我可以补充一点,我拥有的项目都是.dotm文件(尽管这是我知道保存那些包含 VBA 的 Word 文件类型的唯一方法)。

编辑 2:我使用的是 Microsoft Office Professional Plus 2013。基本上是 Word 2013。

回答: Cindy Meister的回答(见下面的引用或她的评论)完全符合我的需要。

Word 需要特殊技巧来打开一个新实例——安装默认是不允许的。一种方法是从命令行使用 /n 开关:filepath\winword.exe /n 另一种方法是在宏中使用 New 关键字:Dim wdApp As Word.Application: Set wdApp = New Word.Application: wdApp.Visible = True

0 投票
1 回答
171 浏览

vba - Access VB Editor - 更新模块时如何隐藏?

我想避免为用户显示 VBE。

场景如下: Access 2010 *.accdb,在整个组织中使用。当用户打开数据库应用程序时,其中一个模块会根据数据库内表中的信息进行刷新和重新保存。这很好用。

使用的系统是 Windows 7 和 10。

问题 当上述模块被刷新和保存(通过 VBA)时,VBE 打开并显示。

到目前为止 更新和保存模块后,我添加了以下代码:

不幸的是,这只会在用户清晰可见隐藏 VBE 。所以看起来比较笨重。

关于我如何仍然可以操作模块并防止 VBE 被看到的任何想法?

在此先感谢您的帮助!

0 投票
0 回答
1138 浏览

vba - MS Access:如何访问受保护的 VBA 代码并绕过“意外错误 40230”?

我的先行者构建了一个由 .accdb 和 .accde 文件组成的 AccessDB。数据库(.accdb 文件)存储在我们的网络驱动器中,每个用户都必须复制前端文件(.accde)才能访问和使用数据库。数据库不受密码保护。嵌入式 VBA 代码用于生成报告,并且存在一些错误和错误。所以我必须照顾他们。VBA 代码受密码保护,当然他没有向任何人透露它就离开了。

现在,每次我尝试打开 VBE(Alt+F11 或通过菜单“DATABASE TOOLS”-“Visual Basic”)时,都会收到警告“Unexpected error 40230”(有时,每个表单和报告一个) )。单击警告,我可以打开 VBE,但看不到代码。

我已经尝试在 VBE("Tools" > "'MyProject' Properties...") 中打开我的项目的属性,但我不能。这里需要密码!

有没有人有一个想法可以帮助我访问 VBA 代码?太感谢了!我真的很感谢你的帮助!

0 投票
1 回答
629 浏览

vba - 在 IDE Add-In 中制作 VB6- 或 VBA-IDE 环境相关参考?

我在 VB6 中成功创建了VB6_IDE_Add_In,它引用了 Microsoft "Visual Basic 6.0 Extensibility"。但是,要在 VBA IDE(Excel、Access)中使用此加载项,我必须复制VB6_IDE_Add_In项目,将其重命名为VBA_IDE_Add_In,重命名其属性等,并且主要更改提到的“Microsoft Visual Basic for应用程序可扩展性 5.3"

最后我有两个 dll - 一个用于 VB6,第二个用于 VBA。他们两个我都必须到“regsvr32”并手动将VBA-IDE-Add-In注册表项从 VB6 键“[HKCU\Software\Microsoft\Visual Basic\6.0\Addins]”移动到 VBA 键[HKCU\Software\Microsoft\ VBA\VBE\6.0\插件] ...

有没有办法使用条件编译或命令行参数来编译将根据 VB6 或 VBA 环境使用正确引用的单个 dll?

不幸的是,这是我的第一个加载项,我在这方面的经验不足......