Excel-DNA


はじめに

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講座に戻ります

トップに戻ります


お探しの情報は見つかりましたか?
まだの方はこちらをどうぞ。
Google

PageTop