はじめに
Excel-DNAはこちらで配布されているExcelで.NET Frameworkを利用可能にするライブラリです。
Excel-DNAを使ってユーザ定義関数を作成する例が多く、VBAから使用する例は少ないので、今回はその例を紹介します。
Excel-DNAからVBやC#で作成したロジックを呼び出すメリットは、.NET Frameworkの機能を利用できることです。
.NET Frameworkの一部の機能はVBAから直接使用することもできますが、それ以外の機能も使うことができます。
ちなみに正規表現検索のアドインでは、通常VBA使われる正規表現ライブラリより高機能な.NET Frameworkの正規表現も
使えるようにするために、Excel-DNAからVBを呼び出しています。
今回は、VBAのユーザフォームにはないコントロールである、DateTimePickerを使ったフォームを作って、
VBAからこのフォームを使ってみます。
VB
DP.vb
Imports ExcelDna.Integration
Imports ExcelDna.ComInterop
Imports System.Runtime.InteropServices
Namespace DP
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDispatch)>
<ProgId("DP")> '…@
Public Class InterfaceFunctions
Shared Property SelDate As String
Public Function GetDate() As String '…A
Dim cForm1 As New FormDP
System.Windows.Forms.Application.EnableVisualStyles()
System.Windows.Forms.Application.DoEvents()
If cForm1.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
SelDate = ""
End If
Return SelDate
End Function
End Class
Public Class ExcelAddIn
Implements IExcelAddIn
Public Sub AutoOpen() Implements IExcelAddIn.AutoOpen
ComServer.DllRegisterServer()
End Sub
Public Sub AutoClose() Implements IExcelAddIn.AutoClose
ComServer.DllUnregisterServer()
End Sub
End Class
End Namespace
赤字は固定、黒字部分に固有の処理を記入します。
@の名前がVBAから呼び出す際のcomオブジェクト名になります。
Aの部分にプロパティやメソッドを書きます。VBAから使えるようにするにはPublicにします。
Public Subなら返却値のないメソッド、Public Functionなら返却値のあるメソッドになります。
FormDP.vb
フォーム

コード
Public Class FormDP
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DP.InterfaceFunctions.SelDate = DateTimePicker1.Value.ToString("yyyyMMdd")
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Close()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Close()
End Sub
End Class
Excel-DNA
上記のVBプロジェクトをビルドしてDP.dllを作成します。
Excel-DNAの2ファイルを以下のようにリネーム。
(リネームは必須ではない。ただしこの2ファイルは同じ名前にしておく。)
・ExcelDna.xll → DP.xll
・ExcelDna.dna → DP.dna
DP.dnaの中身を以下のように編集。
<DnaLibrary Name="DP" RuntimeVersion="v4.0">
<ExternalLibrary Path="DP.dll" ComServer="true" />
</DnaLibrary>
VBA
上記で作成した3ファイルと呼び出し側のExcelファイルを1つのフォルダにまとめます。

TestVB.xlsmは呼び出し側のExcelファイルです。
TestVB.xlsmの標準モジュール
Option Explicit
Sub Test()
Dim DP As Object
Application.RegisterXLL ThisWorkbook.Path & "\DP.xll"
Set DP = CreateObject("DP")
MsgBox DP.GetDate
Set DP = Nothing
ExecuteExcel4Macro "UNREGISTER(""DP.xll"")"
End Sub
このブックのシートにボタンを追加して、そのボタンから上記のTestを呼び出すようにします。

ボタンを押してみます。

日付を選択します。


OKボタンを押すと、VBAで選択した日付を表示します。

Excel VBA講座に戻ります
トップに戻ります