0

私は、ユーザー向けに数学的モデルを構築し、それらをさまざまな形式で出力できるプロジェクトに取り組んでいます。現在、Python、Java、C++ での出力をサポートしています。これは機能します。コードを自動生成して、1 日と呼ぶだけです。

ただし、新しい要求が行われました。ユーザーは、Excel 内からモデルを使用できるようにしたいと考えています。私はいくつかの検索を行い、http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/を見つけました

これは良いスタートですが、プログラムでこれを行う必要があります。モデルは、より大きなプログラムにオブジェクトとして格納されます。ユーザーが Excel の DLL としてエクスポートすることを選択した場合、ボイラープレート コードを使用して、使用するメソッドを挿入します。

ただし、COM Interop 用のコードを登録する必要があるようです。私のテスト コードは、C# を使用してそのメソッドにアクセスできる DLL を作成します。しかし、Excel 2000 で参照を追加しようとすると (わかっています、わかっています、企業は最悪です)、VBA は機能しません。TLBファイルが作成されていないようで、ロードするものがありません。

生成されたコードをスタンドアロンとしてコンパイルし、COM を表示可能にし、com 相互運用ボックスに登録すると、TLB は生成されますが、Excel VBA は自動化エラーをスローします。

それでは実際の質問です。

1) Com Visible で、COM Interop 用に Reistered である DLL を実行時に作成するにはどうすればよいですか?

2) どうすれば Excel をうまく操作できるようになりますか。

簡単な DLL コードの例は次のとおりです。

using System;
using System.Runtime.InteropServices;

namespace VSN
{

  [ComVisibleAttribute(true)]
  [ClassInterface(ClassInterfaceType.AutoDual)]
  public class VSNFunctions
  {
      public VSNFunctions()
      {
      }

      /// <summary>
      /// Adds 2 variables together.
      /// </summary>
      /// <param name=\"v1\">First Param</param>
      /// <param name=\"v2\">Second Param</param>
      /// <returns>Sum of v1 and v2</returns>
      public double Add2(double v1, double v2)
      {
          return v1 + v2;
      }
      public double Sub2(double v1, double v2)
      {
          return v1 - v2;
      }
      public double Mul2(double v1, double v2)
      {
          return v1 * v2;
      }
      public double div2(double v1, double v2)
      {
          return v1 / v2;
      }

      [ComRegisterFunctionAttribute]
      public static void RegisterFunction(Type t)
      {
          Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{"+t.GUID.ToString().ToUpper() + "}\\Programmable");
      }


      [ComUnregisterFunctionAttribute]
      public static void UnregisterFunction(Type t)
      {
          Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\\{"+t.GUID.ToString().ToUpper() + "}\\Programmable");
      }
  }
}

プログラムで DLL をビルドするコードは次のとおりです。

CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
String exeName = String.Format(@"{0}\{1}.dll", System.Environment.CurrentDirectory, "VSNTest");
MessageBox.Show(exeName);
parameters.OutputAssembly = exeName;

parameters.CompilerOptions = "/optimize";

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, DLLString);
4

1 に答える 1

0

方法: Visual C# プロジェクトでコードを VBA に公開する

VBA コードが Visual C# プロジェクトのコードを呼び出せるようにするには、COM に表示されるようにコードを変更し、デザイナーで ReferenceAssemblyFromVbaProject プロパティを True に設定します。

于 2012-03-20T15:40:46.417 に答える