使用VB.NET为VBA IDE生成外接程序

使用VB.NET为VBA IDE生成外接程序,vb.net,vba,add-in,vbe,Vb.net,Vba,Add In,Vbe,我曾在其他地方问过这个问题,但从未发现有人知道如何使用VB.NET为VBA IDE构建外接程序。有可能吗?有人能给我举个例子吗?如果您需要使用IDTExtensibility2接口编写com加载项,请从新项目中选择共享加载项项目模板 'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common 'FontFace=Courier New (STRING - Default if missing) 'FontHeight=10 (DWORD - Defa

我曾在其他地方问过这个问题,但从未发现有人知道如何使用VB.NET为VBA IDE构建外接程序。有可能吗?有人能给我举个例子吗?

如果您需要使用IDTExtensibility2接口编写com加载项,请从新项目中选择共享加载项项目模板

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
编辑

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
否则,要从头开始创建此加载项,您需要执行以下操作:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
创建新的项目类库 添加对扩展性的引用,它应该在列表中。您可能需要下载office版本的PIA。也许是VSTO,但我不确定这一点 再次添加对Microsoft.Vbe.Interop的引用应与PIA一起使用。 选中“属性”选项卡中的“Com互操作注册”框。 “调试设置”选项卡中的“可选”将“启动”更改为“外部程序”,并在“programfiles”文件夹中输入excel exe的路径(如果该路径用于excel),这是为了允许项目可调试。 命令选项中的可选项向工作表或word文档中添加一个条目,该条目将在启动时使用宏显示加载项对话框。对于开发,这对于简化调试体验很有意义。例如C:\vbe.xlsm 可选设置工作表目录的启动路径,例如C:\ 实现可扩展性程序集中的接口IDTExtensibility2。 调用这个类连接这只是一个首选项 使用以下属性为类添加属性 [可想而知, GuidYourGeneratedGuid, ProgIdYourAddinName.Connect]

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
下面是一个让您开始的实现,首先用AppName替换YourAddinName,并为YourGeneratedGuid创建一个Guid。 您需要将加载项注册到正确的注册表位置,查看下面的注册表项以了解情况,还需要替换注册表项中的一些变量

Imports System
Imports System.Drawing
Imports System.Linq
Imports System.Runtime.InteropServices
Imports Extensibility
Imports Microsoft.Vbe.Interop

Namespace VBEAddin


''' <summary>
''' The object for implementing an Add-in.
''' </summary>
''' <seealso class='IDTExtensibility2' />
<Guid("YourGeneratedGuid"), ProgId("YourAddinName.Connect")> _ 
Public Class Connect
    Implements IDTExtensibility2
    Private _application As VBE 'Interop VBE application object


    #Region "IDTExtensibility2 Members"

    ''' <summary>
    ''' Implements the OnConnection method of the IDTExtensibility2 interface.
    ''' Receives notification that the Add-in is being loaded.
    ''' </summary>
    ''' <param term='application'>
    ''' Root object of the host application.
    ''' </param>
    ''' <param term='connectMode'>
    ''' Describes how the Add-in is being loaded.
    ''' </param>
    ''' <param term='addInInst'>
    ''' Object representing this Add-in.
    ''' </param>
    ''' <seealso class='IDTExtensibility2' />
    Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef [custom] As Array)
    _application = CType(Application,VBE)
    End Sub

    Private Sub onReferenceItemAdded(ByVal reference As Reference)
        'TODO: Map types found in assembly using reference.
    End Sub

    Private Sub onReferenceItemRemoved(ByVal reference As Reference)
        'TODO: Remove types found in assembly using reference.
    End Sub


    Private Sub BootAddin()
        'Detect change in active window. 
    End Sub

    ''' <summary>
    ''' Implements the OnDisconnection method of the IDTExtensibility2 interface.
    ''' Receives notification that the Add-in is being unloaded.
    ''' </summary>
    ''' <param term='disconnectMode'>
    ''' Describes how the Add-in is being unloaded.
    ''' </param>
    ''' <param term='custom'>
    ''' Array of parameters that are host application specific.
    ''' </param>
    ''' <seealso class='IDTExtensibility2' />
    Public Sub OnDisconnection(ByVal disconnectMode As ext_DisconnectMode, ByRef [custom] As Array)
    End Sub

    ''' <summary>
    ''' Implements the OnAddInsUpdate method of the IDTExtensibility2 interface.
    ''' Receives notification that the collection of Add-ins has changed.
    ''' </summary>
    ''' <param term='custom'>
    ''' Array of parameters that are host application specific.
    ''' </param>
    ''' <seealso class='IDTExtensibility2' />
    Public Sub OnAddInsUpdate(ByRef [custom] As Array)
    End Sub

    ''' <summary>
    ''' Implements the OnStartupComplete method of the IDTExtensibility2 interface.
    ''' Receives notification that the host application has completed loading.
    ''' </summary>
    ''' <param term='custom'>
    ''' Array of parameters that are host application specific.
    ''' </param>
    ''' <seealso class='IDTExtensibility2' />
    Public Sub OnStartupComplete(ByRef [custom] As Array)
        'Boot dispatcher

    End Sub


    ''' <summary>
    ''' Implements the OnBeginShutdown method of the IDTExtensibility2 interface.
    ''' Receives notification that the host application is being unloaded.
    ''' </summary>
    ''' <param term='custom'>
    ''' Array of parameters that are host application specific.
    ''' </param>
    ''' <seealso class='IDTExtensibility2' />
    Public Sub OnBeginShutdown(ByRef [custom] As Array)
    End Sub

    #End Region
End Class
End Namespace
'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
请注意,YourGeneratedGuid标记必须包含大括号{},并且与上面属性库中的Guid相同,YourAssemblyNameFullTypeName标记必须是程序集全名,YourAddinName.Connect标记必须是上面属性库中设置的相同ProgId

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
旁注

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
还发现这很有帮助,可以帮你节省几个小时的谷歌搜索时间

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                

我想你可以从VBA代码中调用.NETDLL,但我自己从来没有这样做过。只需创建一个VB类库项目并创建一个DLL以在VBA中使用

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                

在快速谷歌搜索之后,您似乎需要在“项目属性”->“构建”下为Com Interop=True设置Register,但正如我所说,我以前从未尝试过此操作。

我还发现此参考有助于从C或VB.NET创建VBA DLL:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
创建一个新的C或VB.Net项目,并选择类库作为模板类型

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleCalc
{
    public class Calc
    {
        private int numberOne = 0;
        private int numberTwo = 0;

        public void SetNumberOne(int number)
        {
            numberOne = number;
        }

        public void SetNumberTwo(int number)
        {
            numberTwo = number;
        }

        // Add two integers
        public int Add()
        {
            return numberOne + numberTwo;
        }
    }
}
配置项目属性以使其COM可见

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
注册COM互操作。 编译项目。 将类型库文件复制到Windows系统文件夹。 从Access VBA编辑器中引用类型库。 在VBA代码中使用DLL

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
Public Function test()
    Dim lngResult As Long

    Dim objCalc As SimpleCalc.Calc
    Set objCalc = New SimpleCalc.Calc

    objCalc.SetNumberOne (3)
    objCalc.SetNumberTwo (6)

    lngResult = objCalc.Add()

End Function
不幸的是,almog.ori的步骤对我不起作用。以下是我的版本,以帮助未来的人们:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
创建名为VBEAddIn的C或VB.NET类库项目

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
添加以下互操作程序集作为对项目的引用,使用项目添加引用。。。菜单,浏览选项卡

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
扩展性C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Common\Extensibility.dll-如果没有,请尝试C:\Program Files x86\如果您使用的是x64 PC

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
Microsoft.Office.Interop.Excel C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
Microsoft.Vbe.Interop C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Vbe.Interop.dll

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
可选Microsoft.Vbe.Interop.Forms C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Vbe.Interop.Forms.dll

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
使用以下代码将类添加到项目中:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
VB.Net:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
在项目的“项目属性”窗口中:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
在“应用程序”选项卡中,确保程序集名称和根命名空间都设置为VBEAddIn

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
在“编译”选项卡中,确保选中“为COM互操作注册”复选框。我们不会用合适的regasm.exe工具手动注册COM互操作程序集。但是请注意,Register for COM interop复选框仅将加载项dll注册为32位COM库,而不是64位COM库

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
在Compile选项卡的Advanced Compile Options按钮中,确保目标CPU组合框设置为AnyCPU,这意味着程序集可以64位或32位执行,具体取决于加载它的执行.NET Framework

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
在“签名”选项卡中,确保取消对部件的签名

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
接下来添加注册表项,将下面的代码段保存为带有reg扩展名和doub的ASCI文件 le单击它将值添加到注册表

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
重要提示:在执行reg文件之前,请更改路径:CodeBase=file:///C:\Dev\VBEAddIn\VBEAddIn\bin\Debug\VBEAddIn.dll

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\VBEAddIn.Connect]
"CommandLineSafe"=dword:00000000
"Description"="Description for your new addin"
"LoadBehavior"=dword:00000000
"FriendlyName"="VBEAddIn"


[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}]
@="VBEAddIn.Connect"

[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\Implemented Categories]

[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="VBEAddIn.Connect"
"Assembly"="VBEAddIn"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:\Dev\VBEAddIn\VBEAddIn\bin\Debug\VBEAddIn.dll"

[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\ProgId]
@="VBEAddIn.Connect"
在Visual Studio中生成VBE加载项并打开Excel。 打开其VBA编辑器Alt+F11。 转到外接程序,外接程序管理器。。。用于检查外接程序是否正确注册的菜单。 加载加载项。您应该会看到消息框VBEAddIn.Connect在VBA编辑器中加载 如果出现此错误:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
无法加载“VBEAddIn”

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
是否将其从可用外接程序列表中删除

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
很可能您没有更改路径代码库=file:///C:\Dev\VBEAddIn\VBEAddIn\bin\Debug\VBEAddIn.dll

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
并检查代码库项是否在注册表中。如果代码库不存在,请使用该代码库添加字符串regkey:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
然后关闭Office应用程序,从Visual Studio再次构建VBE加载项,打开Office Excel、Outlook、Word等和Alt+F11,加载项菜单>加载项管理器,然后选择加载项并勾选加载/卸载

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
克服此问题的最后一个技巧:

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                
如果仍然失败,请关闭Office应用程序,转到Visual Studio,项目属性>生成选项卡>勾选注册COM互操作>生成解决方案,然后打开Office加载项>Alt+F11>加载项菜单>加载项管理器,然后单击加载/卸载

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                

这个答案使用了我修改过的Carlo的Quintero MZTools中的一些信息,参考:

还要注意的是,assamblyInfo.cs中c的项目的Guid与Connect类的Guid不同

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)                

使用相同的Guid会导致在检查时无法转换为类型库错误:项目属性>生成选项卡>注册COM互操作

我认为他正在寻找开发环境的附加程序。我面临的问题是,我使用的是VB.Net的快速版本。Express版本的限制之一是减少了模板集。我想你仍然可以做到,你只需要从头开始创建一个。你知道从哪里开始吗?我签出了MZ工具资源,但它们的信息不适用于.Net中的VBA IDE。这就是我一直在到处打的问题。我能找到的所有信息都是re:VB6.Wow,真是太多了+1.谢谢你的努力。我需要时间尝试一下,如果有效,我会接受:谢谢:嗨,ORI,很抱歉耽搁了。我是个新手,所以请容忍我。我开始尝试实现这些指令,我遇到的第一个障碍是,使用VB的2010 express版本,既没有可用的共享加载项项目模板,也没有在线集合中的共享加载项项目模板。我知道它在VS的完整版本中,所以我想它只是在快速添加中丢失了。你知道这个问题的解决方法吗?对不起,让事情复杂化了。
'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common
'FontFace=Courier New (STRING - Default if missing)
'FontHeight=10 (DWORD - Default if missing)