1

私はここで何かに本当に苦労しています。私はクラス モジュールを持っています。それを FormMan と呼びましょう。これには、プロジェクトにある多数のユーザー フォームに関連するメソッドがたくさんあります。特定のメソッドの 1 つは、さまざまな場所から呼び出されるもので、非常に単純です。ユーザー定義の数のコントロールをフォームに追加し、これらの新しいコントロールに対応するようにフォームの高さを拡張するだけです。

ユーザーはコントロールの数とユーザーフォームを渡します。

oF.AddControlsToForm iNumberOfControls,frmTest

FormMan クラス モジュール内:

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

[ローカル] ウィンドウでは、oForm に高さのプロパティがないため、問題ありません。ただし、oForm は frmTest として定義されています。私は言うことができますoForm.BackColor = vbred、そして私はctl = oform.TextBox1例えば設定することができます

これは、フォームに多数のコントロールを追加できる一般的な手順であることを意図しています。oForm に割り当てる前に、フォームを読み込んで表示しようとしました。

ユーザーフォームの高さと表示のプロパティとメソッドがユーザーフォームとして宣言されているのに、オブジェクトのメソッドが宣言されていないのはなぜですか? 私は何を間違っていますか?

どんな助けにも本当に感謝します。

4

2 に答える 2

4

ここでの問題は、UserForm オブジェクトと frmTest オブジェクトが同じ型ではないことです。実際、frmTest は UserForm のサブタイプであり、他のメンバーの中でも Height プロパティを追加することでそれを拡張します。

おそらく、関数パラメーターを Object として宣言する必要があります。

Public Sub Addcontrols(iNum as integer, oForm as Object)

残念ながら、型の安全性を犠牲にすることになりますが、これはあなたが望むように機能するはずです。ほとんどの OO の概念は、VBA のコンテキストではバラバラになる傾向があります。

于 2009-02-12T21:17:15.710 に答える
1

VBA についてまず覚えておくべきことは、VBA は完全 OO ではなく準 OO だということです。私はこの問題に関して多くの奇抜な問題に遭遇したため、VBA の一貫性に完全に依存することを避ける傾向があります。

そうは言っても、これを試してください:

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

なんとも愉快で奇妙ではありませんか?!?! 準備ができて待っているコード例がないので、成功を保証することはできませんが、これは正しいアプローチのように感じます.

于 2009-02-12T21:20:51.287 に答える