さまざまなモジュールにわたってユーザー定義型の管理
-
09-10-2019 - |
質問
VBAモジュール全体で一般的なユーザー定義タイプを管理する最良の方法は何ですか?
さまざまなモジュールで同じユーザー定義型タイプを使用しています。たとえば、私はしばしば(x、y)ポイントを表す必要があるので、これを持っていることになります Type
さまざまなモジュールで:
Type XYpointType
x As Double
y As Double
End Type
タイプの引数を渡します XYpointType
さまざまなモジュールの潜水艦と関数との間。
ただし、これはユーザー定義のタイプを管理する方法が悪いと思います。まったく同じ Type
定義コードは多くの異なるモジュールで終わります。
あるいは、これを持つこともできます Type
単一の中央「タイプ」モジュールの宣言、およびこの特定のタイプを必要とする他のすべてのモジュールは、タイプモジュールを参照する必要があります。欠点は、各モジュールが「モジュール性」を失い、「タイプ」モジュールがどこにいても付随する必要があるということです。
助言がありますか?
解決
これは興味深いことです。なぜなら、同じ名前のパブリックタイプを宣言する2つのモジュールができることを知らなかったからです。私が知っているので、私は恐ろしいです。
したがって、最初に、Eric Towersは、タイプの宣言を1つのモジュールにのみ配置したいのです。このタイプを使用する他のモジュールは、そのモジュールが利用可能であることに依存しますが、それはモジュール化に伴うものです。モジュール間の依存関係を管理する必要性は、すべてのソフトウェア開発に共通しています。 1つのVBAプロジェクト(単一のExcelワークブックにある種類のような)内で、モジュールの依存関係を管理する唯一のオプションがマニュアルであることは残念です。 (VBAでは、「モジュール」は本当に「ソースコードファイル」です。他の言語/環境には、さまざまな高レベルのパッケージングシステムがあります。)
恐ろしい部分のために。異なるモジュールで同じ名前のタイプを宣言すると、問題のために自分自身を設定します。 2つのVBAモジュールを検討してください。
'Module1
Public Type typ
x As String
End Type
Public Sub useTyp()
Dim t As typ
t.x = 42
Debug.Print t.x + t.x
End Sub
と
'Module2
Public Type typ
x As Long
End Type
Public Sub useTyp()
Dim t As typ
t.x = 42
Debug.Print t.x + t.x
End Sub
同じプロジェクトでは、コードは「コンパイル」されます(少なくともExcel VBAでは)。しかし、2つの「USETYP」サブは異なる出力を提供します。さらに悪いことに、モジュールの1つからタイプ宣言の1つを削除すると、同じモジュールの「USETYP」ルーチンの動作が突然変更されました。この種のあいまいさは決して望ましくありません。
起こっているのは、VBAが実際に2つの異なるタイプ「module1.typ」と「module2.typ」を作成していることです。同じモジュールにいて、タイプ名を適格にしないと、VBAは「正しい」タイプを静かに見つけて使用します。
別の「XypointType」宣言を持つモジュールに1つの「XypointType」のインスタンスを渡していることを聞いて、私は少し驚いています。それほど重要ではありませんが、コードを投稿できますか?私はこのようなニッピックなことに興味があります...
他のヒント
2番目の方法を使用します。ポイントは、再利用可能なタイプのブロブを作成することです。再利用可能であるためには、分離する必要があります。次に、はい、これらのタイプを使用するすべてのモジュールは、そのblobを参照する必要があります。しかし、互いに呼び出すモジュール、呼び出すモジュールを必要とするフォームについても同じことが言えるかもしれません。
Xypointsのクラスを作成することもできます。これにより、カスタム関数があり、その道を進む必要がある場合は方法が必要になります。タイプはクラスに比べて非常に限られています。
これがあなたを始めるための良いリソースです: http://www.cpearson.com/excel/classes.aspx