标签: vbe

键入左括号时Excel崩溃

这是我不明白的一个.

鉴于此类模块(剥离到重现崩溃所需的最低限度):

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崩溃 - 哎呀!

即使我输入一个没有违规括号的完整程序然后尝试添加它们,我也会遇到同样的崩溃.

我能让Excel不崩溃的唯一方法是将一组()从其他地方复制/粘贴到这行代码中.

 Sub MakeExcelCrash()
     With TestCrashClass()
         Debug.Print …
Run Code Online (Sandbox Code Playgroud)

excel vba vbe

11
推荐指数
2
解决办法
265
查看次数

如何将VBA编辑器恢复为初始设置?

如何将VBA编辑器还原到其初始设置?经过一些糟糕的操作后,我在宏和项目资源管理器窗口设置方面遇到了一些麻烦.

excel vba vbe

9
推荐指数
3
解决办法
2万
查看次数

导出VBA编辑器(VBE)设置

我在PC上对VBA编辑器进行了很多更改,包括工具栏的自定义.有没有办法导出这些,以便我可以在不同的系统上使用它们,而不必从头开始?

excel settings customization export vbe

9
推荐指数
1
解决办法
380
查看次数

如何正确重命名ThisWorksheet的CodeModule

我正在尝试ThisWorkbook使用VBA Extensibility 重命名Excel工作表的代码模块.

我用线完成了这个

ThisWorkbook.VBProject.VBComponents("ThisWorkbook").Name = "wb"
Run Code Online (Sandbox Code Playgroud)

我可以在VB编辑器中看到更改,也可以访问工作簿的属性,例如Debug.? wb.Name.

但是:如果我保存并关闭文件然后重新打开它,我会发现奇怪的行为.如果代码模块在重命名之前为空,则它将恢复为旧的空ThisWorkbook名称.

如果不是空的,或者是在保存之前填充,我现在兼得,一个空ThisWorkbook模块(如果有任何会触发事件) -和填充wb模块-这不火的工作簿事件:

在此输入图像描述

有没有人见过这种行为 - 并且知道修复/解决方法?

excel vba excel-vba vbe

8
推荐指数
1
解决办法
2115
查看次数

我怎么知道`ThisWorkbook`是`工作簿'?

我正在使用VBIDE API,并且不能假设主机应用程序是Excel或任何Office应用程序.

所以我所知道的是,我正在看着它VBComponent,而且它Typevbext_ct_document.

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

?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1"))
VBComponent
?TypeName(Sheet1)
Worksheet
Run Code Online (Sandbox Code Playgroud)

但是该Sheet1对象仅存在于运行时环境中,所以如果我是C#加载项,我甚至都看不到它.

那得到任何接近我所需要的,唯一的一点是通过ParentNext组件的属性:

?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)

我想我只需要以某种方式抓住指针,我将成为我需要的地方.

c# com vbe vbide

8
推荐指数
1
解决办法
572
查看次数

如何在Excel VBA编辑器中禁用自动退格

我刚刚开始在Excel中学习宏和VBA编程,但是一旦我打开编辑器并开始编写它就会让我回到最后一个单词的末尾,例如:

我想写'Sub Entername()'但是如果我写得不够快,那就像:'SubEnterName()'这是不正确的.我不介意自动填充例如.endSub()或一些自动更正,但这只是令人生气.

我该怎么办呢.谢谢吉米.

excel vba vbe

7
推荐指数
1
解决办法
3874
查看次数

VBA - IE GetElementByID无法正常工作

我在搜索框中输入文本时遇到了一些麻烦,因为在我认为是严重的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)

internet-explorer vba vbe

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

获取数据库的VBProject

给定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)

ms-access vba access-vba vbe

7
推荐指数
1
解决办法
2487
查看次数

在运行时将userform添加到其他工作簿

我有一个插件和一个工作簿打开.插件是.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)

excel vba excel-vba vbe

7
推荐指数
1
解决办法
111
查看次数

VBProjectsEvents在哪里?

Microsoft.Vbe.Interop在C#中使用,我可以访问CommandBarEventsReferencesEvents通过VBE.Events.

然而,那些非常有用的MSDN文档似乎表明,VBProjectsEvents当向VBE添加项目或从VBE中删除项目时,我可以使用它来通知我的加载项...这正是我在这里想要实现的.

我可以_VBProjectsEvents对象浏览器中看到该接口,但没有实现它(而不是_CommandBarControlsEvents接口,由它实现CommandBarEventsClass),使用ReSharper的实现功能.

_VBProjectsEvents任何地方都有接口的实现吗?如果没有,那么如何通知从VB中删除VBProject?

c# events com-interop vbe

6
推荐指数
1
解决办法
141
查看次数