8

VBAでできる限り関数ポインタ/抽象クラスに近づけようとしています。

と呼ばれるクラスがVerificationManagerあり、いくつかのスプレッドシートのセルの束が一致することを確認します。これは、使用されている情報とスプレッドシートに応じて、さまざまな方法で行われます。

関数を使って呼び出すメソッドを文字列で指定してコードを再利用できるようにしたいApplication.Runです。だから私は変化する関数を書き直すことができます。

Java または C# を使用している場合は、抽象クラスを拡張して内部を関数に書き直すことができます。JavaScript を使用していた場合、関数を変数に格納し、その変数をクラスに渡して、そこから呼び出すことができます。

クラス内には、呼び出したい関数の名前に設定した「verificationModule」というパブリック プロパティがあります。

Sub VerifyWorkLocations(empLoc As EmployerLocation)
...
    For i = 0 To empLoc.numOfEmp
        Application.Run verificationModule, empLoc.taxdescmatch, empLoc.employees(i)
    Next i
...
End Sub

ただし、電話をかけようとするとApplication.Run、次のエラーが表示されます。

コンパイル エラー:

「パブリック オブジェクト モジュールで定義されたユーザー定義型のみが、バリアントとの間で強制変換したり、遅延バインディング関数に渡すことができます」

すでにユーザー定義型を配置しようとしましたClass Moduleが、基本的に、クラスモジュールは型の場所が間違っていると言われました。

4

2 に答える 2

8

エラーは、ActiveX dllプロジェクトを作成し、そこにパブリッククラスを作成し、そのクラスにUDTを配置できる本格的なVBから発生します。

VBAでは、バリアントとの間で強制的に変換する必要がある場合は、UDTの代わりにクラスを使用します。

したがって、UDTにあるすべてのフィールドを使用してクラスを宣言し、UDTを削除するだけです。

または、タイプの宣言のみを含むDLLをVB6で作成し、VBAからそのdllを参照します。または、IDLに慣れている場合は、TLBファイルを直接作成するだけです。

于 2012-09-24T20:13:56.163 に答える
-2

モジュールを VBA アプリケーションに追加するには、次の手順を試してください (既に VBA IDE に入っていることを前提としています)。

  1. Project Explorer から、プロジェクトを右クリックします。
  2. [挿入...] をクリックします。
  3. 「モジュール」を選択します。
  4. モジュールが存在しない場合、VBA/Excel プロジェクト内に「Modules」という名前の新しいフォルダーが作成され、デフォルト名が「Module1」のモジュールが作成されます。
  5. モジュールをダブルクリックして、ソース エディタで開きます。

これは、UDT を配置する必要がある場所です。これは、クラスとして宣言/操作された要素/オブジェクトのCOMスタイルの構造と比較して、そのような型がVBAによって内部的に格納される方法の違いによるものだと思います...

ここに画像の説明を入力

于 2012-09-24T20:06:26.667 に答える