问题标签 [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.
excel - VBA Excel - 在范围内执行命令 - 与其他工作簿交互
我一直在尝试如何解决这个问题。我锁定了我的 vba 项目,因为我不希望大多数人能够更改代码。问题是,我有根据用户输入修改其他模块的代码,这显然会导致问题,因为如果模块被锁定,您将无法修改它。因为我只是不做'sendkeys'(哈哈,来吧),没有实用的方法来解锁它,所以我可以修改代码。
所以我创建了一个 .xlam 加载项。模块将新代码写入文件,将其保存为 .bas 类型,然后加载项导入并运行它。
但...
我在与工作簿(为 .xlam 加载项生成模块的工作簿)交互时遇到问题。以下是我发现棘手的代码部分。它主要与使用所述工作簿执行自动填充和更新表单有关。
这些是首要问题。就个人而言,我宁愿直接从工作表中运行代码(换句话说,考虑一个模块执行 Range("A1") 中的内容 - 比如 "msgbox someString"),但我不确定这是否可能。想知道这个很久了
关于语法应该是什么的任何指针,例如 #1 和 #2 - 和/或关于如何直接从工作表执行代码的想法,从而一起绕过头痛?
excel - Excel vba删除子代码
关于VBE。如果工作表不存在,它将创建它并在 Sheet1 中添加一个命令按钮。它还将添加 appr。私有子命令button1_click 的代码。这一切正常。这是将添加新子的现有代码的一部分:
但是,在添加“子代码”之前,它应该检查已经存在的(对象)中的子代码(对于 commandbutton1)是否已经存在,如果存在,则在添加新代码之前将其删除。
excel - 为什么我需要打开 VBA 编辑器才能将数据加载到用户窗体中?
我有一个 Excel 文件,其中 VBA 宏将数据加载到用户窗体中。
如果我在没有打开编辑器的情况下运行它,它有时会崩溃并关闭 Excel。
如何修复我的文件,这样我就不需要先打开编辑器?
宏中的示例代码:
c# - 我怎么知道 `ThisWorkbook` 是 `Workbook`?
我正在使用 VBIDE API,不能假设宿主应用程序是 Excel 或任何 Office 应用程序。
所以我只知道我在看 a VBComponent
,它Type
就是vbext_ct_document
。
在 VBE 的即时窗格中,我可以获得以下输出:
但是该Sheet1
对象只存在于运行时环境中,所以如果我是 C# 插件,我什至看不到它。
唯一可以接近我需要的东西是通过组件的Parent
andNext
属性:
这让我得到了我想要的类型名称......但是在错误的组件上!对于ThisWorkbook
顶级文档对象,我将Application
对象作为Parent
:
该方法可能有用,但前提是我对特定于主机的逻辑进行硬编码,该逻辑知道具有“应用程序”类型的“父”属性的任何组件都是Workbook
当主机应用程序是 Excel 时的实例......并且不能保证其他主机中的其他文档模块甚至会有那个“父”属性,所以我很难过。
我对任何事情都持开放态度——从 p/invoke 调用和低级 COM“反射”魔法(ITypeInfo
那种魔法)到......到......我不知道 -unsafe
带有需要// here be dragons
注释的时髦指针的代码-欢迎任何可能最终成为可行解决方案的线索。
AFAIK VBE 加载项与主机存在于同一进程中,因此在某个地方有一个指向VBA 项目中的ThisWorkbook
任何Sheet1
其他文档类型的指针。VBComponent
我想我只需要以某种方式抓住那个指针,我就会到达我需要的地方。
c# - 如何迭代 MS-Access 表单上的控件?
我有一个方法,给定 a VBComponent
,我可以.Designer
从那里访问 and.Controls
集合:
此方法的问题在于,当主机为 MS-Access 时,form.Designer
是null
,因此该方法提前返回。
这里的dynamic
演员表并不是特别有用,似乎我可以转换到一个UserForm
界面,它会“正常工作”——至少在 Excel 主机中。
但由于 MS-Access 的表单没有设计器 (???),我如何去迭代 MS-Access 表单上的控件,因为 C# 代码是 VBE 加载项(即只能轻松访问任何内容VBIDE API 可用)?
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 时,为什么它不再合法?
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
vba - Access VB Editor - 更新模块时如何隐藏?
我想避免为用户显示 VBE。
场景如下: Access 2010 *.accdb,在整个组织中使用。当用户打开数据库应用程序时,其中一个模块会根据数据库内表中的信息进行刷新和重新保存。这很好用。
使用的系统是 Windows 7 和 10。
问题 当上述模块被刷新和保存(通过 VBA)时,VBE 打开并显示。
到目前为止 更新和保存模块后,我添加了以下代码:
不幸的是,这只会在用户清晰可见后隐藏 VBE 。所以看起来比较笨重。
关于我如何仍然可以操作模块并防止 VBE 被看到的任何想法?
在此先感谢您的帮助!
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 代码?太感谢了!我真的很感谢你的帮助!
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?
不幸的是,这是我的第一个加载项,我在这方面的经验不足......