使用VB.NET为VBA IDE生成外接程序
我曾在其他地方问过这个问题,但从未发现有人知道如何使用VB.NET为VBA IDE构建外接程序。有可能吗?有人能给我举个例子吗?如果您需要使用IDTExtensibility2接口编写com加载项,请从新项目中选择共享加载项项目模板使用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
'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)