私は他の場所でこれを尋ねましたが、VB.NETを使用してVBAIDE用のアドインを構築する方法を知っている人は誰もいません。それも可能ですか?誰かが私に例を教えてもらえますか?
5 に答える
IDTExtensibility2インターフェイスを使用してcomアドインを作成し、新しいプロジェクトから共有アドインプロジェクトテンプレートを選択する必要がある可能性があります。
編集
それ以外の場合、このアドインを最初から作成するには、次の手順を実行する必要があります。
- 新しいプロジェクトクラスライブラリを作成する
- 「拡張性」への参照を追加します。これはリストに含まれているはずです。お使いのバージョンのOfficeのPIAをダウンロードする必要がある場合があります。(そしておそらくVSTOですが、私はこの点について確信が持てません)
- 「Microsoft.Vbe.Interop」への参照を再度追加するには、PIAを使用する必要があります。
- [プロパティ]タブの[Com相互運用機能に登録]チェックボックスをオンにします。
- オプション[デバッグ設定]タブで、スタートアップを外部プログラムに変更し、プログラムファイルフォルダーにExcel exeへのパスを入力します(これがExcelを対象としている場合)。これにより、プロジェクトをデバッグ可能になります。
- オプションコマンドオプションで、起動時にマクロを使用してアドインダイアログを表示するワークシートまたはワードドキュメントにエントリを追加します。開発では、これはデバッグエクスペリエンスを合理化するのに意味があります。例:「C:\vbe.xlsm」
- オプションまた、起動パスをワークシートディレクトリに設定します(例: "C:\")。
- 「Extensibility」アセンブリにあるインターフェース「IDTExtensibility2」を実装します。
- このクラスを「接続」と呼びます(これは単なる設定です)
- クラスを次のように帰属させます
[ComVisible(true)、Guid( "YourGeneratedGuid")、ProgId( "YourAddinName.Connect")]
開始するための実装を次に示します。まず、「YourAddinName」をAppNameに置き換え、「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
アドインを登録するためのレジストリ.keyスクリプトは次のとおりです。正しく登録するには、いくつかの設定を変更する必要があることに注意してください。
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\YourAddinName.Connect]
"CommandLineSafe"=dword:00000000
"Description"="Description for your new addin"
"LoadBehavior"=dword:00000000
"FriendlyName"="YourAddinName"
[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}]
@="YourAddinName.Connect"
[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="YourAddinName.Connect"
"Assembly"="YourAssemblyNameFullTypeName"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///PathToAssembly"
[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\ProgId]
@="YourAddinName.Connect"
注:トークン「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)
残念ながら、almog.oriの手順はうまくいきませんでした。これが将来人々を助けるための私のバージョンです:
「VBEAddIn」という名前のC#またはVB.NETクラスライブラリプロジェクトを作成します
[プロジェクト]、[参照の追加...]メニュー、[参照]タブを使用して、次の相互運用機能アセンブリをプロジェクトへの参照として追加します。
拡張性(C:\ Program Files \ Microsoft Visual Studio 10.0 \ Visual Studio Tools for Office \ PIA \ Common \ Extensions.dll)-x64 PCを使用している場合は、C:\ Program Files(x86)\を試してください。
Microsoft.Office.Interop.Excel(C:\ Program Files \ Microsoft Visual Studio 10.0 \ Visual Studio Tools for Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll)
Microsoft.Vbe.Interop(C:\ Program Files \ Microsoft Visual Studio 10.0 \ Visual Studio Tools for Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.dll)
(オプション)Microsoft.Vbe.Interop.Forms(C:\ Program Files \ Microsoft Visual Studio 10.0 \ Visual Studio Tools for Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.Forms.dll)
次のコードを使用して、プロジェクトにクラスを追加します。
VB.Net:
Imports Microsoft.Office.Interop
Imports Extensibility
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports Microsoft.Vbe.Interop
<ComVisible(True), Guid("3599862B-FF92-42DF-BB55-DBD37CC13565"), ProgId("VBEAddInVB.Net.Connect")> _
Public Class Connect
Implements Extensibility.IDTExtensibility2
Private _VBE As VBE
Private _AddIn As AddIn
Private Sub OnConnection(Application As Object, ConnectMode As Extensibility.ext_ConnectMode, _
AddInInst As Object, ByRef custom As System.Array) Implements IDTExtensibility2.OnConnection
Try
_VBE = DirectCast(Application, VBE)
_AddIn = DirectCast(AddInInst, AddIn)
Select Case ConnectMode
Case Extensibility.ext_ConnectMode.ext_cm_Startup
Case Extensibility.ext_ConnectMode.ext_cm_AfterStartup
InitializeAddIn()
End Select
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
Private Sub OnDisconnection(RemoveMode As Extensibility.ext_DisconnectMode, _
ByRef custom As System.Array) Implements IDTExtensibility2.OnDisconnection
End Sub
Private Sub OnStartupComplete(ByRef custom As System.Array) _
Implements IDTExtensibility2.OnStartupComplete
InitializeAddIn()
End Sub
Private Sub OnAddInsUpdate(ByRef custom As System.Array) Implements IDTExtensibility2.OnAddInsUpdate
End Sub
Private Sub OnBeginShutdown(ByRef custom As System.Array) Implements IDTExtensibility2.OnBeginShutdown
End Sub
Private Sub InitializeAddIn()
MessageBox.Show(_AddIn.ProgId & " loaded in VBA editor version " & _VBE.Version)
End Sub
End Class
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using Extensibility;
using Microsoft.Vbe.Interop;
using System.Windows.Forms;
namespace VBEAddin
{
[ComVisible(true), Guid("3599862B-FF92-42DF-BB55-DBD37CC13565"), ProgId("VBEAddIn.Connect")]
public class Connect : IDTExtensibility2
{
private VBE _VBE;
private AddIn _AddIn;
#region "IDTExtensibility2 Members"
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
try
{
_VBE = (VBE)application;
_AddIn = (AddIn)addInInst;
switch (connectMode)
{
case Extensibility.ext_ConnectMode.ext_cm_Startup:
break;
case Extensibility.ext_ConnectMode.ext_cm_AfterStartup:
InitializeAddIn();
break;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void onReferenceItemAdded(Reference reference)
{
//TODO: Map types found in assembly using reference.
}
private void onReferenceItemRemoved(Reference reference)
{
//TODO: Remove types found in assembly using reference.
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
InitializeAddIn();
}
private void InitializeAddIn()
{
MessageBox.Show(_AddIn.ProgId + " loaded in VBA editor version " + _VBE.Version);
}
public void OnBeginShutdown(ref Array custom)
{
}
#endregion
}
}
プロジェクトの[プロジェクトプロパティ]ウィンドウで、次の手順を実行します。
[アプリケーション]タブで、アセンブリ名とルート名前空間の両方が「VBEAddIn」に設定されていることを確認します。
[コンパイル]タブで、[COM相互運用機能に登録]チェックボックスがオンになっていることを確認します。適切なregasm.exeツールを使用して、COM相互運用機能のアセンブリを手動で登録する必要はありません。ただし、[COM相互運用機能に登録]チェックボックスは、アドインdllを64ビットCOMライブラリとしてではなく、32ビットCOMライブラリとしてのみ登録することに注意してください。
[コンパイル]タブの[高度なコンパイルオプション]ボタンで、[ターゲットCPU]コンボボックスが[AnyCPU]に設定されていることを確認します。これは、実行に応じて、アセンブリを64ビットまたは32ビットとして実行できることを意味します。それをロードする.NETFramework。
[署名]タブで、[アセンブリに署名]がオフになっていることを確認します。
次に、レジストリキーを追加し、以下のスニペットをreg拡張子の付いたASCIファイルとして保存し、ダブルクリックしてレジストリに値を追加します。
重要な注意: regファイルを実行する前に、パスを変更してください: "CodeBase" = "file:/// C:\ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug \ VBEAddIn.dll"
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)。
- 「アドイン」、「アドインマネージャ...」メニューに移動して、アドインが正しく登録されていることを確認します。
- アドインをロードします。「VBAエディタにロードされたVBEAddIn.Connect」というメッセージボックスが表示されます。
このエラーが発生した場合:
「VBEAddIn」を読み込めませんでした。
利用可能なアドインのリストから削除しますか?
パス"CodeBase"= "file:/// C:\ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug\VBEAddIn.dll"を変更しなかった可能性があります
そして、CodeBaseキーがレジストリにあることを確認します(存在しない場合は、CodeBaseに文字列regkeyを追加します)。
次に、Officeアプリケーションを閉じ、Visual StudioからVBEアドインを再度ビルドし、Office(Excel、Outlook、Wordなど)を開き、Alt + F11、[アドイン]メニュー> [アドインマネージャー]を選択して、[アドイン]と[読み込み/読み込み解除]を選択します。
この問題を克服するための最後の秘訣:
それでも失敗する場合は、Officeアプリを閉じ、[プロジェクトのプロパティ]>[ビルド]タブ>[COM相互運用機能に登録]>[ソリューションのビルド]にチェックマークを付け、Officeアドイン> Alt +F11>アドインメニュー>アドインマネージャーを開き、[ロード/アンロード]をクリックします。
この回答は、私が変更したCarloのQuintero(MZTools)からの情報を使用しています。参照:http ://www.mztools.com/articles/2012/MZ2012013.aspx
また、このリファレンスは、C#またはVB.NETからVBADLLを作成するのに役立つことがわかりました。
新しいC#(またはVB.Net)プロジェクトを作成し、テンプレートタイプとして[クラスライブラリ]を選択します。
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が表示されるようにプロジェクトのプロパティを構成します。
- COM相互運用機能に登録します。
- プロジェクトをコンパイルします。
- タイプライブラリファイルをWindowsシステムフォルダにコピーします。
- AccessVBAエディターからタイプライブラリを参照します。
VBAコードでDLLを使用します。
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
GeeksEngine.comによって利用可能になりました
VBAコードから.NETDLLを呼び出すことができると思います(実際にこれを自分で行うことはありません)。VBクラスライブラリプロジェクトを作成し、VBAで使用するDLLを作成するだけです。
簡単なグーグルの後、プロジェクトのプロパティ->ビルドで「ComInteropに登録」= Trueを設定する必要があるようですが、私が言ったように、これまで実際に試したことはありません。
また、プロジェクトのGUID(assamblyInfo.csのc#の場合)がクラス「Connect」のGUIDと異なることに注意してください。
同じGUIDを使用すると、「タイプライブラリに変換できませんでした」という結果になります-チェック時のエラー:[プロジェクトのプロパティ]>[ビルド]タブ>[COM相互運用機能に登録]