SSブログ

VB2008 Express Edition でExcel VBAから参照可能なDLLを作成する方法 [プログラミング]

こんにちは。唐突ですが,自分の備忘のため,標記について記しておきます。ここまで辿り着くのにずいぶん苦労したので,同じような境遇の方々向けにも。ワタクシは理由あって旧バージョンのVB2008を使っていますが,他のバージョンでもおそらく可能ではないかと思います。【手順1】Visual Studio 2008 Express Edition with Service Pack 1をインストールする

安易にぐぐっても最新バージョンのVBしか出てこないので,うまく見つけ出してください。Express Editionは何といっても無償なのが魅力ですが,有償版に比べていろいろと機能を落としています。なお,Service Packは今後追加される可能性があるので,なるべく最新のものがお薦めです。

【手順2】以下のサイトから「VBFusion05.exe」をダウンロードして「ComClass.zip」ファイルを取り出す

http://msdn.microsoft.com/ja-jp/magazine/ee230240.aspx

お目当ての「VBFusion05.exe」はサイトの上の方にあります。ダウンロードして起動すると解凍場所を聞いてきますが,デフォルトの「C:\」でいいと思います。解凍が終わると「C:\VBFusion」フォルダに「ComClass.zip」というファイルがあるので,これを解凍せずにそのまま「C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Templates\ItemTemplates\Visual Basic」フォルダにコピーしてください。「C:\VBFusion」フォルダの他のファイルは不要なので,さっさと削除しましょう。

【手順3】VB2008 Expressを起動し,空の「クラスライブラリ」プロジェクトを作成する

いよいよVB2008を使います。DLLを作るには「クラスライブラリ」プロジェクトを選択します。プロジェクト名はとりあえず「ClassLibrarySuccess」とします。ソリューションエクスプローラにある「Class.vb」はCOMクラスになれないので不要であり,右クリックしてとっとと削除します。

【手順4】ソリューションエクスプローラでCOMクラスを追加する

ソリューションエクスプローラにある「ClassLibrarySuccess」プロジェクトを右クリックして「追加」を選び,下の方にある「COMクラス」を選択します。クラス名はとりあえず「ClsComplex」とします。いま選んだ「COMクラス」がまさに【手順2】でコピーした「ComClass.zip」ファイルです。

【手順5】「ClsComplex」クラスにプログラムコードを追加する

「ClsComplex」クラスをVBAから参照することを考えます。ソリューションエクスプローラにある「ClsComplex.vb」をダブルクリックすると,以下のようなプログラムコードが出てきます。途中のClassId,InterfaceId,EventsIdはVBが勝手に採番してくれるので,下の文字列と違っていてもかまいません,ていうか決していじってはいけません。これらは最終的にレジストリに書き込まれることで,Excel VBAから参照可能となります。
Public Class ClsComplex
#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "ba19beae-9ea4-4341-b491-578a37ca2375"
    Public Const InterfaceId As String = "f14515e5-1361-4941-b2e1-0f3c98e1dd1d"
    Public Const EventsId As String = "a8263ba8-71bd-4314-a228-82525d036e19"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

End Class

さて,最後の「End Class」の直前の行を増やして以下のようなプログラムコードを追加します。下の文字列をそのままコピーしてもいいですが,写経のつもりで自ら打ち込んでみてはいかがでしょうか。インテリセンスと呼ばれるVBの機能が候補をどんどん出してくれるので,使いたい文字列を選んでTABキーを押すと,あなたの入力を手助けしてくれるはずです。これに慣れるともう離れられません。
    Protected iRe#, iIm#

    Public Sub New(ByVal Re#, ByVal Im#)
        MyBase.New()
        iRe = Re
        iIm = Im
    End Sub

    Public Property Re#()
        Get
            Return iRe
        End Get
        Set(ByVal Re0#)
            iRe = Re0
        End Set
    End Property

    Public Property Im#()
        Get
            Return iIm
        End Get
        Set(ByVal Im0#)
            iIm = Im0
        End Set
    End Property

    Public Sub Rotate(ByVal Degree#)
        Dim TmpCos# = Math.Cos(Math.PI / 180 * Degree)
        Dim TmpSin# = Math.Sin(Math.PI / 180 * Degree)
        Dim TmpRe# = iRe
        Dim TmpIm# = iIm
        iRe = TmpRe * TmpCos - TmpIm * TmpSin
        iIm = TmpRe * TmpSin + TmpIm * TmpCos
    End Sub

    Public Function Display$()
        Dim sgn$
        If iIm < 0 Then
            sgn = "-"
        Else
            sgn = "+"
        End If
        Return iRe & " " & sgn & " " & Math.Abs(iIm) & "*i"
    End Function


【手順6】vbproj.userファイルを書き換える

試しに「デバッグ開始」ボタンを押してみてください。入力ミスがなければ左下に「ビルド正常終了」といううれしい表示が出るものの,まもなく以下のような悲しい表示が現れるはずです。

vberror1.PNG

これは,DLLは正しく作られたのですが,DLLを走らせるVB2008の設定が整っていないことを意味します。そこで,「ClassLibrarySuccess」プロジェクトを上書き保存してVB2008をいったん終了してから,「C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Projects\ClassLibrarySuccess\ClassLibrarySuccess」フォルダにある「ClassLibrarySuccess.vbproj.user」をメモ帳で開き,

とあるのを,以下のように書き換えて上書き保存します。途中のEXCEL.EXEについては,Excel2003(フォルダ名「Office11」)ではうまくいくことを確認していますが,Excel2002(フォルダ名「Office10」)ではうまくいきませんでした。他のExcelバージョンは試していません。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <StartAction>Program</StartAction>
    <StartProgram>C:\Program Files\Microsoft Office\Office10\EXCEL.EXE</StartProgram>
    <StartWorkingDirectory>C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Projects\ClassLibrarySuccess\ClassLibrarySuccess
</StartWorkingDirectory>
    <StartArguments>test.xls</StartArguments>
  </PropertyGroup>
</Project>


【手順7】空のExcelファイルを用意する

あと少しです。「C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Projects\ClassLibrarySuccess\ClassLibrarySuccess」フォルダに空のExcelファイル「test.xls」を置きます。

【手順8】「ClassLibrarySuccess」プロジェクトをデバッグ開始する

これで準備は整いました。あらためてVB2008を立ち上げ,「ClassLibrarySuccess」プロジェクトで「デバッグ開始」ボタンを押してみます。Excelファイル「test.xls」が立ち上がれば成功です。うまくいかない場合は【手順6】をよく確認してください。

Excel VBAに行ってから参照設定で「C:\Documents and Settings\ユーザー名\My Documents\Visual Studio 2008\Projects\ClassLibrarySuccess\ClassLibrarySuccess\bin\Debug」フォルダにある「ClassLibrarySuccess.tlb」ファイルを選択します。エラーが出なかったら,標準モジュールを追加して以下のプログラムコードを書きます。これも写経のつもりで自ら打ち込んでみてはいかがでしょうか。VBよりも貧弱なインテリセンスがあなたの入力を手助けしてくれるでしょう。
Option Explicit

Public Sub Test()
    Dim x As New ClsComplex
    x.Re = 1
    x.Im = 0
    Debug.Print x.Display
    x.Rotate (45)
    Debug.Print x.Display
    x.Rotate (45)
    Debug.Print x.Display
    x.Rotate (45)
    Debug.Print x.Display
    x.Rotate (45)
    Debug.Print x.Display
End Sub


【手順9】VBAでプログラムを走らせる

いよいよVBAで「Sub Test」を走らせてみます。うまくいったでしょうか。

質問あればお気軽にお願いします。ワタクシの能力の範囲で頑張ってお答えします。おしまい。

<参考サイト>
http://homepage1.nifty.com/rucio/main/dotnet/technique/teq2_COM.htm
http://www.geocities.jp/autolisptechnique/infovbnet_express.html
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。