2

Excel から C# コードを呼び出す方法に興味があり、こちらの方法に従っていますhttps://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to -calling-a-net-library-from-excel/ .

C# コードは、DotNetClass.cs という "Hello World" の例です。

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetLibrary
{
    public class DotNetClass
    {
        public string DotNetMethod(string input)
        {
            return "Hello " + input;
        }
    }
}

ビルド構成には、「COM 相互運用に登録する」と「アセンブリを COM 可視にする」がチェックされています。オプション「.NET Framework 4.5」と「Any CPU」もあります(64ビットマシンで作業しています)。いくつかの NET バージョンと CPU オプションを試しましたが、成功しませんでした。何度か掃除して作り直しました。

Excel 2010 では、DotNetLibrary.dll への参照を作成できません。それをブラウズすることも、同じ場所 (DotNetLibrary.tlb) にあるファイルへの参照を作成することもできます。

Excelからの呼び出しは

Private Sub TestDotNetCall()
Dim testClass As New DotNetClass
MsgBox testClass.DotNetMethod(“World”)
End Sub

...そしてこれは機能します-ほとんど。VBA コード (F5) を実行すると、"Hello " ("World" がない - unwoot!) というメッセージが表示された MsgBox (woot!) が表示されます。そのため、これを行う目的を無効にしているように見える引数 (「世界」) を無視しているようです。

説明をいただければ幸いです。tlbファイルを参照するのは良いことですか? dll/tlb に引数を渡したり、結果を取得したりできないのはなぜですか? これを行うより良い方法はありますか?

4

1 に答える 1

1

私はそれを働かせました。C# は厳密に型指定され、VBA は型指定が緩いため、問題が発生します。

VBAラインで

MsgBox testClass.DotNetMethod(“World”)

"World" という値を持つ "物" (技術的には avarだと思います) が DotNetMethod に渡されます。問題は、DotNetMethod が「もの」「World」の種類を認識していないため、それを無視することです。

解決策は、次のように、VBA で "World" の型を明示的に定義することです。

Private Sub TestDotNetCall()
Dim testClass As New DotNetClass
Dim s As String
s = "World"
MsgBox (testClass.DotNetMethod(s))
End Sub

...そして、「Hello World」

于 2013-10-09T00:18:27.307 に答える