2

サードパーティの ActiveX グリッド コントロール (10Tec による iGrid) の複数のインスタンスを持つユーザー フォームがあります。同じステートメントを使用してすべてのグリッドを初期化するサブがあります。

Sub SetupIgrid(ig as iGrid)
   ig.RowMode = True
   ig.MultiSelect = True
   ig.Appearance = igAppearanceFlat
   ig.Editable = False
End Sub

このサブに iGrid インスタンスを渡すことはできません。Excel VBA は、次のような呼び出しで常に「型の不一致」エラーを表示します。

SetupIgrid igAuds

他に何も助けませんでした。たとえば、Variant または Object パラメータのように iGrid を渡すことができますが、そこから実際の iGrid タイプを抽出しようとすると、同じタイプの不一致が発生します。

Sub SetupIgrid(igObj as Object)
   Dim ig as iGrid
   Set ig = igObj

ハックを使用して、ObjPtr で取得した Long ポインターを iGrid に渡し、それを API CopyMemory で iGrid タイプに変換しても、MS Excel VBA は iGrid メンバーにアクセスできません。

このタスクの重要なポイントは、IntelliSense 機能を使用するために SetupIgrid サブに実際の iGrid オブジェクトを用意することです。これで、オブジェクト (バリアント) またはその他のものとしてそれを取得できますが、ドットを押したときに IntelliSense リストが表示されないことを確認してください。

4

2 に答える 2

2

上記のコメントに加えて、テストしたところ、これは機能します(つまり、エラーメッセージはありません)

宣言する必要がありますig As Control

ここからグリッドをダウンロードしました

Option Explicit

Private Sub CommandButton1_Click()
    SetupIgrid iGrid1
End Sub

Sub SetupIgrid(ig As Control)
   ig.RowMode = True
   ig.MultiSelect = True
   ig.Appearance = igAppearanceFlat
   ig.Editable = False
End Sub

スクリーンショット

ここに画像の説明を入力

コマンドボタンをクリックした後

ここに画像の説明を入力

于 2012-10-05T16:49:29.397 に答える
2

これは、コントロールがこの方法でホストの外部に渡されることを意図していないためです。「舞台裏」で渡されているのは、ラッパーの事前にバインドされた「エクステンダー」コントロールであり、これにより、表示されている型の不一致が発生します。

この問題については、Microsoft からの詳しい説明があります。

于 2012-10-05T15:16:31.460 に答える