• 締切済み

DLLを作成してVBAから使用する方法は?

Visual Basic 2005 Express EditionでDLLを作成して,エクセルVBAから使用する方法を教えてください。 DLLで提供する関数は,仮に Public Function TRIM2(ByVal str1 As String) As String TRIM2 = trim(str1) End Function とします。 DLLの作り方とエクセルVBAでの利用のやり方が判りません。 一応,DLLらしきものを作りエクセルVBAから参照を試みましたが,「指定されたファイルへの参照は登録できません。」というエラーになります。

みんなの回答

noname#259269
noname#259269
回答No.3

Express Edition で動作確認しました。何かと面倒ですね。 おっしゃるとおり、.tlb ファイルは作成されませんでした。 「アセンブリを COM 参照可能にする」にチェックをつけてビルドし、 出来た dll を配布場所にコピーしてから、regasm.exe を使って以下のように入力してください(pathは具体的な配布場所)。 regasm (path)\hoge.dll /tlb:(path)\hoge.tlb /codebase これで、COM 登録が完了し、tlb ファイルが作成されます。 この状態でVBAで参照設定してみてください。 以上試してみてください。 #COM 登録解除は regasm の /unregister オプションです。

QZE00555
質問者

お礼

ご回答ありがとうございます。 私の開発環境にはregasm.exe がありません。 もう少しのところにきたようです。 よろしくお願いします。

noname#259269
noname#259269
回答No.2

Express Edition には、確かにありませんでした。。。m(__)m プロジェクトのプロパティの「アプリケーション」タブ内に「アセンブリ情報」ボタンがあり、その中に「アセンブリを COM 参照可能にする」というチェックをONにしてみてください。

QZE00555
質問者

お礼

ありがとうございます。やってみましたが変化がないようです。タイプライブラリも作成されていないようです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

COM(Component Object Model)として DLLをコンパイルしてtlb(タイプライブラリ)を生成しないと VBAから使用できないですよ VB2005側のDLLプロジェクトのプロパティ > コンパイルの 『COM相互運用機能の登録』にチェックをつけておきます ExcelのVBEで ツール > 参照設定で VB2005で生成したComクラスの名前を探します 見つからなければDLLを生成したフォルダーにあるTLBファイルを 参照ボタンから探しましょう VB2005で作成したCOMはインスタンス経由で関数にアクセスしますので VBA側では Dim VBComObj as new MyComClass Dim ss as string ss = VBComObj.Trim2( " 123 " ) といった使い方になります 作成したCOMクラスが MyComClassだと仮定しています

QZE00555
質問者

お礼

ありがとうございます。 ご回答いただいた内容を元にググっており,大変参考になっています。 ただ,自分が使っているVisual Basic 2005 Express Editionには, VB2005側のDLLプロジェクトのプロパティ > コンパイルの 『COM相互運用機能の登録』にチェックをつけておきます というのが無いみたいです。(見つけられないだけかも?) Express Editionにはタイプライブラリを作成する機能がないのでしょうか?それすら判りません(泣) すみませんがもう少し助けてください。 よろしくお願いします。

関連するQ&A

  • VBAでDLLが見つからないエラー

    CADのVBA(6.0)ですが、DLLが見つからないエラーが出ます ' こっちはエラーが出ない Public Declare Function SearchVBApath Lib _ "C:\Program Files\AppliTool\VB\DDDD.dll" (ByVal env As String, ByVal s As String) As Integer 'こっちだとエラーが出る Public Declare Function SearchVBApath Lib "DDDD.dll" (ByVal env As String, ByVal s As String)    As Integer VBAプロジェクトファイルとDLLは同じフォルダにおいてあります 上記のようにフルパスだとエラーが出ないのですがDLL名だけだとこの関数のところでエラーがでます このDLL関数宣言行の前の方には他のDLL関数も同じようにパス省略で記述しているのですがそちらにはエラーが出ません どなたかヒント下さい、よろしくお願いします。

  • C++で作成したDLLを vb.net から動的に

    C++で作成したDLLを vb.net から動的に使用する方法 <DllImport("DllNAME")> _ Private Shared Function FuncName( _   <MarshalAs(UnmanagedType.LPStr)> ByVal str1 As StringBuilder, _   <MarshalAs(UnmanagedType.LPStr)> ByVal str2 As StringBuilder ) As String End Function Sub huga()   Dim result As String = FuncName( "hoge", "piyo" )   MsgBox(result) End Sub 上記方法で 静的にはリンク出来たのですが 動的にリンクする方法がわかりません ご教授ください お願いします!

  • vc++のAPI(dll)の引数をVBAでうけとる

    Excelで開発しなければならない事情があり、 vc++のAPIが持っている関数を ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。 VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。 VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。 VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。 --VC-- XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL); --VBA-- <宣言部> Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long <呼び出し部> Dim lngHandle As Long Dim sName as String Dim lngType As Long Dim sValue As String Dim lngSize as Long Dim tmpSize as Long lngSize = 0 sName = "keiyaku" tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString) XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString degug.print sValue

  • VB .NetのDLL参照について

    名前付パイプの処理をしているのですが、DLLが参照できません。 Public Class ClsJi01   Public Declare Function MakePipe Lib "\DLL\Point.DLL" (ByVal pipe_name As String, ByVal buf_size As Integer, ByVal max_instances As Short, ByVal hpipe As Integer, ByVal err_code As Integer) As Integer  Public Sub M_Pipe()   Dim r As Integer   Dim rpipe As Integer   Dim err_code As Integer   r = MakePipe("\\.\pipe\RS04", 255, 16, rpipe, err_code)  End Sub End Class Point.DLLは以前VB6.0の時に使用していたDLLで自作です。 これで実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。 どうしたら良いのでしょうか?

  • 自作DLLをエクセルVBAで使用したい

    こんにちは。 自作DLLをエクセルVBAで使用したいのですが、知識不足でうまく動かせません。どうぞお知恵をお貸しください。 例えば足し算をするCのプログラムを以下のように作ります。ファイル名は"wa.c"とします。 #define EXPORT __declspec(dllexport) __stdcall EXPORT double wa(double a,double b) { return(a+b); } これをコンパイルして、DLLファイル"test.dll"を作ります。 gcc -shared -o test.dll wa.c エクセルVBAのモジュールには次のように記述しました。 Declare PtrSafe Function wa Lib "test.dll" (ByVal a As Double, ByVal b As Double) As Double ここで作成した関数をワークシート関数として呼び出したいのですが、ワークシート上での返り値は常にゼロになってしまいます。例えば、ワークシートのセルに"=wa(1.2,3.5)"と記入すると、"4.7"を返してほしいところですが、ゼロとなってしまいます。ワークシート関数として正しく動作させるにはどうしたらよいでしょうか? ちなみに、この関数をエクセルVBAのサブルーチンで使うことはできます。例えばこんな感じです。 Sub test() x = 1.2 y = 3.5 Call MsgBox(wa(x, y)) End Sub また、上記の"test.dll"を他のCのプログラムから呼び出すことも正しくできます。 なお、64bitのエクセルを使っています。Cのコンパイラも64bitです。 どうぞよろしくお願いいたします。

  • C++で作成したDLLにVBAから配列渡し

    VC++初心者です。よろしくお願いします。 VC++2008ExpressでWindowsアプリケーションのDLLを作成してみました。 Excel2007VBAにて、そのDLLを呼び出して関数を使用したいのですが VBAの配列を参照渡しで渡すと、配列のデータをうまく渡せません。 コードは以下の通りです。 配列ではないデータはうまくいきますが。。。 配列の場合はもっと他に必要なことがあるのでしょうか? よろしくお願いします。 //VC++ DLLコード #include <windows.h> int APIENTRY Add(int[] a) {    return a[0] + a[1] ; } '''VBAのコード Private Declare Function Add Lib "TEST_DLL.dll" (ByRef a() As Integer) As Integer Dim a(1) As Integer Sub test() a(0) = 1 a(1) = 2 MsgBox (Add(a)) End Sub メッセージボックスには3が表示されるはずですが 変な数字に化けてしまいます。 どなたか、ご存知の方、よろしくお願いします。

  • VB.NET DLL 参照型String読込み

    VCで作成されたDLLの参照型Stringの読込みに困っております。 ご存じの方、お教え下さい。 VB6では次のような定義で、問題なく実行できます。 Private Declare Function VcToVb _ Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Long, _ ByRef strData As String, ByRef Err_Cnt As Long, ByRef Err_DATA As String) As Long ------------------------------------ Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) これを VB.NETで実施 Private Declare Ansi Function VcToVb _  Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Int32, _ <MarshalAs(UnmanagedType.LPStr)> ByRef strData As StringBuilder, _ ByRef err_cnt As Int32, ByRef Err_DATA As StringBuilder) As Int32 (テストのため、strDataのみ) -------------------------------------- Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) ******************************************* 調べた結果、VB.NETでは参照型は簡単にはいかないみたいで、StringBuilderを使用するとか、色々な方法を試しました。 結果は戻ってくるのですが、問題は DLLが文字列を返すときに、文字列内の項目区切文字として chr(0)を設定します。 このため、結果は Chr(0)の前までしか設定されません。 (VB.NETが Chr(0)を文字列の最後と判断する?) これを解決する方法はありますでしょうか。 現在は VB6で呼出す DLLを作成し、VB.NETはこれを使用していますが、 C#.Netならできるのでしょうか。 よろしくお願い申し上げます。

  • vc++ dll excel vba

    c++で作成したdllをexcel(vba)で使用する時エラー発生 >>>vs2005 vc++で作成したプロジェクト(プロジェクトはWindowフォームアプリケーションでフォームを使ってあるdllファイルからデータを読み出しポップアップ形でデータを表示する)をdllにした後、作られたdllをexcelに連結し読み出しボタンを押すとdllが実行されるようになっています。 問題はvisual studioがインストールされているパソコンではうまくいくのですが、vsがインストールされてないパソコンで実行すると "実行エラー'53':" "ファイルが見つかりません:xxxxx.dll" が表示され終了されてしまいます。 >>excelのvbaは "Private Declare Function test_func Lib "xyxyxy.dll" Alias "#1" (ByVal test As Integer) As Integer" >>c++のdll作成のほうは "[STAThreadAttribute] __declspec(dllexport) char __stdcall test_f(int dialog_no)" になってます。 ちなみにお客さんのパソコンを使ってテストしているためpath登録や参照登録などができません。 何でも良いのでコメント書いていただければと思います。 大雑把な質問で申し訳ないですが、宜しくお願いいたします。

  • Access Win32 API使用 検索方法

    32bit版で開発したAcceessを64bit版で開いたところ、Win32 APIのソースコードでエラーが発生しました。 ネットで検索したところ、対処法はすぐHITしました。 「#If~#Else~#End If」の条件付きコンパイルを使うそうです。 例) #If VBA7 And Win64 Then '64ビット版 Declare PtrSafe Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer #Else '32ビット版 Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer #End If ここで質問ですが、改修するにあたり、APIのソースコードを使用しているところって どう検索をすればいいでしょうか?

  • C++のDLLが見つからないVBAから見つからない

    こんにちは。質問させてください。 Visual C++ 2008 Express Editionで自作DLLを作成しました。 このDLLが、開発環境(WindowsXP、Excel2002)の Excelマクロで呼び出したところ、うまく動いたのですが、 WindowsVista、Excel2007のPCで同じマクロを実行すると 実行時エラー '53' ファイルが見つかりません [ファイル名] というエラーが出て実行できません。 どちらの環境でもDLLファイルはフルパスで指定していて ファイルはちゃんと存在しています。 原因が、Vistaなのか、Excel2007なのか またはその他の要因なのか、わからずに悩んでいます。 どなたか心当たりがある方がいらっしゃいましたらご教授願います。 よろしくお願いします。 その他詳細 ・DLLはdefファイルを使ってEXPORTしました。 ・Vistaのユーザーアカウント制限をoffにしてます。 ・Declear部分のソースコードは Declare Sub Prepare Lib "C:\test\API_test.dll" (ByVal FileName As String)です。

専門家に質問してみよう