这里有一份教程,虽然我没有尝试过且不确定其是否可行,但听起来很有前途。
以下是重点内容。
要开始构建Access插件,可以创建Word(或者InfoPath、PowerPoint、Project或Visio)插件(Excel或Outlook也可以,但它们有额外的冗余主机特定代码)。
然后,在COM选项卡上添加对Microsoft Access对象库的引用(它还会拉取对ADODB和DAO的引用)。它还会拉取Microsoft.Office.Core.dll,该文件会重复默认引用的Office.dll - 因此需要删除其中一个重复项。
在解决方案资源管理器中,可以选择项目并单击“显示所有文件”按钮。这样可以更轻松地打开ThisAddIn.Designer.cs文件 - 在这里可以将Application字段的声明和初始化从M.O.I.Word.Application更改为M.O.I.Access.Application。请注意,此步骤会更改自动生成的文件:通常情况下不会重新生成该文件,但如果损坏了项目,则可以重新生成该文件(这意味着如果重新生成该文件,则手动更改将丢失):
internal Microsoft.Office.Interop.Access.Application Application;
this.Application = this.GetHostItem<Microsoft.Office.Interop.Access.Application>(typeof(Microsoft.Office.Interop.Access.Application), "Application");
这是所有的代码更改。现在来看项目更改。有两种方法可以进行这些更改——通过IDE以一种覆盖或抵消默认设置的方式;或直接手动编辑.csproj文件,以替换默认设置。让我们先看看这两种方法:先通过IDE,然后手动。
首先,我将更改项目属性|调试|启动操作,改为“启动外部程序”,并指定Access的路径,例如:
C:\Program Files (x86)\Microsoft Office\Office12\MSACCESS.EXE
然后,我将创建一个与我的插件解决方案同名的.reg文件,并将其放在解决方案文件夹中。此reg文件用于为Access注册插件(并取消Word的注册)。下面列出的示例reg文件只是标准VSTO构建任务为每种插件类型执行的内容转储,加上了一行附加内容。附加行(下面的第一个reg条目)仅删除构建任务为Word放置的条目。其余条目对于Word和Access是相同的,唯一的更改是将“Word”替换为“Access”:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\MyAddIn]
[HKEY_CURRENT_USER\Software\Microsoft\Office\Access\Addins\MyAddIn]
"Description"="MyAddIn"
"FriendlyName"="MyAddIn"
"LoadBehavior"=dword:00000003
"Manifest"="C:\\Temp\\MyAddIn\\bin\\Debug\\MyAddIn.vsto|vstolocal"
在项目属性|生成事件中,我添加了一个后期生成事件命令行,将.reg文件合并到注册表中:
regedit /s "$(SolutionDir)$(SolutionName).reg"
这样就可以按F5来构建解决方案:这将为Access注册插件,并加载插件以进行调试。
请注意,与其将Debug属性设置为外部程序(步骤4),我可以直接修改.csproj文件,将TargetProgram从Word更改为Access。例如,将以下内容更改为:
<ProjectProperties HostName="Word"
HostPackage="{D2B20FF5-A6E5-47E1-90E8-463C6860CB05}" OfficeVersion="12.0" VstxVersion="3.0"
ApplicationType="Word" Language="cs" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\12.0\Word\InstallRoot\Path#WINWORD.EXE"
AddItemTemplatesGuid="{147FB6A7-F239-4523-AE65-B6A4E49B361F}" />
…转换为以下内容:
<ProjectProperties HostName="Access"
HostPackage="{D2B20FF5-A6E5-47E1-90E8-463C6860CB05}" OfficeVersion="12.0" VstxVersion="3.0"
ApplicationType="Access" Language="cs" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\12.0\Access\InstallRoot\Path#MSACCESS.EXE"
AddItemTemplatesGuid="{147FB6A7-F239-4523-AE65-B6A4E49B361F}" />
请注意,如上所示更改值会更改解决方案资源管理器中使用的图标。
10. 我还可以更改元素的名称值,以更改解决方案资源管理器中ThisAddIn.cs的父节点的名称。将其更改为:
<Host Name="Word" GeneratedCodeNamespace="MyAddIn" IconIndex="0">
<HostItem Name="ThisAddIn" Code="ThisAddIn.cs" CanonicalName="AddIn" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.cs" />
</Host>
…转换为以下内容:
<Host Name="Access" GeneratedCodeNamespace="MyAddIn" IconIndex="0">
<HostItem Name="ThisAddIn" Code="ThisAddIn.cs" CanonicalName="AddIn" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.cs" />
</Host>
此外,注册是由元素值确定的。因此,我可以直接编辑.csproj文件来更改这个值,而不是设置一个.reg文件作为后置构建任务(参见上面的步骤5-6)。
<OfficeApplication>Word</OfficeApplication>
…变成这样:
<OfficeApplication>Access</OfficeApplication>
onAction
属性,可以设置为标准模块中的方法,例如<button id="MyButton" label="Run My Macro" onAction="MyMacro"/>
。阅读本文,这一切都可以在VBA和Access中完成,您不需要使用VSTO。 - Kostas K.