这是我不明白的一个.
鉴于此类模块(剥离到重现崩溃所需的最低限度):
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "TestCrashClass"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Public Function Init() As TestCrashClass
Attribute Init.VB_UserMemId = 0
Dim tcc As New TestCrashClass
Set Init = tcc
End Function
Public Property Get Data() As String
Data = "test data"
End Property
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么当我输入以下代码时Excel完全崩溃:
Sub MakeExcelCrash()
With TestCrashClass(
Run Code Online (Sandbox Code Playgroud)
在这一点上,我这个可爱的消息:
即使我输入一个没有违规括号的完整程序然后尝试添加它们,我也会遇到同样的崩溃.
我能让Excel不崩溃的唯一方法是将一组()从其他地方复制/粘贴到这行代码中.
Sub MakeExcelCrash()
With TestCrashClass()
Debug.Print …Run Code Online (Sandbox Code Playgroud) 如何将VBA编辑器还原到其初始设置?经过一些糟糕的操作后,我在宏和项目资源管理器窗口设置方面遇到了一些麻烦.
我在PC上对VBA编辑器进行了很多更改,包括工具栏的自定义.有没有办法导出这些,以便我可以在不同的系统上使用它们,而不必从头开始?
我正在尝试ThisWorkbook使用VBA Extensibility 重命名Excel工作表的代码模块.
我用线完成了这个
ThisWorkbook.VBProject.VBComponents("ThisWorkbook").Name = "wb"
Run Code Online (Sandbox Code Playgroud)
我可以在VB编辑器中看到更改,也可以访问工作簿的属性,例如Debug.? wb.Name.
但是:如果我保存并关闭文件然后重新打开它,我会发现奇怪的行为.如果代码模块在重命名之前为空,则它将恢复为旧的空ThisWorkbook名称.
如果不是空的,或者是在保存之前填充,我现在兼得,一个空ThisWorkbook模块(如果有任何会触发事件) -和填充wb模块-这不火的工作簿事件:

有没有人见过这种行为 - 并且知道修复/解决方法?
我正在使用VBIDE API,并且不能假设主机应用程序是Excel或任何Office应用程序.
所以我所知道的是,我正在看着它VBComponent,而且它Type是vbext_ct_document.
在VBE的即时窗格中,我可以获得此输出:
?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1"))
VBComponent
?TypeName(Sheet1)
Worksheet
Run Code Online (Sandbox Code Playgroud)
但是该Sheet1对象仅存在于运行时环境中,所以如果我是C#加载项,我甚至都看不到它.
那得到任何接近我所需要的,唯一的一点是通过Parent和Next组件的属性:
?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1").Properties("Parent").Object)
Workbook
?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1").Properties("Next").Object)
Worksheet
Run Code Online (Sandbox Code Playgroud)
这让我得到了我追求的类型名称......但错误的组件!对于ThisWorkbook,这是顶级文档对象,我得到的Application对象为Parent:
?TypeName(Application.VBE.ActiveVBProject.VBComponents("ThisWorkbook").Properties("Parent").Object)
Application
Run Code Online (Sandbox Code Playgroud)
这种方法可能很有用,但前提是硬编码特定于主机的逻辑,该逻辑知道哪个组件具有"应用程序"类型的"父"属性是Workbook主机应用程序是Excel时的实例...并且不能保证其他主机中的其他文档模块甚至会有"父"属性,所以我非常难过.
几乎任何东西都是开放的- 从p/invoke调用和低级COM"反射"魔术(ITypeInfo魔法)到...到......我不知道 - unsafe带有时髦指针的代码需要// here be dragons注释-任何导线,可以潜在地结束了一个可行的解决方案是值得欢迎的.
据我所知的VBE加载生活在同一个进程中的主机,这样的地方有一个指针ThisWorkbook,并Sheet1和任何其他文件类型的VBComponentVBA项目.
?ObjPtr(ThisWorkbook)
161150920
Run Code Online (Sandbox Code Playgroud)
我想我只需要以某种方式抓住指针,我将成为我需要的地方.
我刚刚开始在Excel中学习宏和VBA编程,但是一旦我打开编辑器并开始编写它就会让我回到最后一个单词的末尾,例如:
我想写'Sub Entername()'但是如果我写得不够快,那就像:'SubEnterName()'这是不正确的.我不介意自动填充例如.endSub()或一些自动更正,但这只是令人生气.
我该怎么办呢.谢谢吉米.
我在搜索框中输入文本时遇到了一些麻烦,因为在我认为是严重的ID标签之后.我从页面的源代码中获取了ID.我之前和其他网站一样.有人可以帮帮我吗?还有另一种方法吗?
Sub FileUpload()
Dim IEexp as Object
IEexp.visible = True
IEexp.Navigate ("www.example.com")
'this is where the problem
IEexp.Document.GetElementByID("step1_id_bean_newSupportingDoc_description").Value _
= "monthly update"
End Sub
Run Code Online (Sandbox Code Playgroud)
我得到一个"自动化错误调用的对象已与其客户端断开连接"
我从中提取ID的源代码:
<td class="Label">Description</td>
<td class="Data"><input type="text" name="bean.newSupportingDoc.description" size="60" maxlength="250" value="" id="step1_id_bean_newSupportingDoc_description" class="NoBorder"/>
</td>
Run Code Online (Sandbox Code Playgroud) 给定MS Access VBA中的数据库对象,如何获取该数据库的VBProject?
Function GetVBProject(ByVal db As Database) As VBProject
Set GetVBProject = ???
End Function
Run Code Online (Sandbox Code Playgroud)
我知道如何在Access中获取VBProjects的唯一方法就是通过Application.VBE.VBProjects.Item(???).但是,我不知道项目的顺序是什么,名称是什么.我只会知道它的父数据库.Excel中的等价物很简单
Function GetVBProject(ByVal wb As Workbook) As VBProject
Set GetVBProject = wb.VBProject
End Function
Run Code Online (Sandbox Code Playgroud) 我有一个插件和一个工作簿打开.插件是.xlam文件,在工作簿中我添加了对它的引用.插件受密码保护.
可以从我的工作簿中运行addin的公共方法.然而,在一个插件的方法使用的VBA.UserForms.Add打开是在运行时创建的窗体像这样
让我们说一个引用的工作簿myAddin有这个:
Private Sub callAddin()
myAddin.ShowForm ThisWorkbook
End Sub
Run Code Online (Sandbox Code Playgroud)
通常,我的插件中的代码如下所示:
Public Sub ShowForm(CallerWorkbook As Workbook)
Const vbext_ct_MSForm As Long = 3
'This is to stop screen flashing while creating form
Application.VBE.MainWindow.Visible = False
'Add to ThisWorkbook, not supplied workbook or VBE will crash - ignore CallerWorkbook
Dim myForm As Object
Set myForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
'Create the User Form
With myForm
.Properties("Caption") = "Select"
.Properties("Width") = 300
.Properties("Height") = 270
End With
'Show the form …Run Code Online (Sandbox Code Playgroud) Microsoft.Vbe.Interop在C#中使用,我可以访问CommandBarEvents和ReferencesEvents通过VBE.Events.
然而,那些非常有用的MSDN文档似乎表明,VBProjectsEvents当向VBE添加项目或从VBE中删除项目时,我可以使用它来通知我的加载项...这正是我在这里想要实现的.
我可以_VBProjectsEvents在对象浏览器中看到该接口,但没有实现它(而不是_CommandBarControlsEvents接口,由它实现CommandBarEventsClass),使用ReSharper的实现功能.
在_VBProjectsEvents任何地方都有接口的实现吗?如果没有,那么如何通知从VB中删除VBProject?