はじめに。
特定のアプリケーションに同様の値のセットを使用するために、特定のクラスモジュールを複数回インスタンス化する必要がある場合があります。
たとえば、ClsAreaクラスモジュールは、Roomsのカーペット面積を計算するために設計されており、同様のアプリケーションの候補です。部屋に何枚の床タイルを置く必要があるかを知りたいとすると、床の寸法値に加えて、タイルの長さと幅の値も入力できるはずです。 FloorとTileはどちらも入力と同様のプロパティ値を持っているため、ClsAreaクラスモジュールの2つのインスタンスを使用できます。1つはFLOOR領域用で、もう1つはTILE領域用です。床面積/タイル面積は、特定の部屋のタイルの総数を示します。
同じクラスモジュールの2つのインスタンス。
これを行うには、ルームが1つしかない場合に、標準モジュールプログラムでClsAreaクラスモジュールの2つの異なるインスタンスを作成します。
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
オブジェクトの配列の処理。
しかし、タイルのサイズや色が異なる複数の部屋の配列に上記の方法を適用する必要がある場合はどうなりますか?その答えは、同じ ClsAreaの2つのインスタンスを使用して新しいクラスモジュールを作成することです。 クラス、フロアの1つのインスタンス もう1つはタイル用です プロパティ。両方のインスタンスは新しいクラスモジュールにラップされています。
やってみましょう。
- データベースを開き、コード編集ウィンドウ(ALT + F11)を表示します。
- クラスモジュールを選択します 挿入から メニュー。
- 名前を変更します ClsTilesへのプロパティ値 。
- 次のVBAコードをコピーしてClsTilesクラスモジュールに貼り付け、コードを保存します。
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
pFLOORとpTILESの両方のインスタンスは、ClsTilesクラスオブジェクトのプライベートプロパティとして宣言されています。
Class_Initialize() ClsTiles の場合、サブルーチンはメモリ内の両方のオブジェクトをインスタンス化します クラスモジュールは、ユーザープログラムでインスタンス化されます。
Class_Terminate() ClsTilesクラスモジュールインスタンスがユーザープログラムでNothingに設定されている場合、サブルーチンは両方のインスタンス(pFLOORとpTILES)をメモリから削除します。
入手 およびセット プロパティプロシージャを使用すると、ClsTilesクラスオブジェクトで、pFLOORインスタンスとの間でそれぞれ値を取得および割り当てることができます。
次のGetandSet Property Procedureは、ClsAreaクラスのpTILESインスタンスで同じ操作を許可します。
新しい関数NoOfTiles()を追加しました 新しいクラスモジュールでは、床面積とタイルの寸法に基づいてタイルの数を計算します。
新しいクラスモジュールClsTilesで、プログラムを作成し、同じクラスオブジェクトの複数のインスタンスの使用法を学びましょう。
- 次のVBAコードをコピーして標準モジュールに貼り付けます。
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- デバッグウィンドウを開いたまま(CTRL + G)にして、テストデータを印刷します。
- VBAコードの途中をクリックして、 F5を押します。 コードを実行するためのキー。結果はデバッグウィンドウに出力されます。
高層ビルの複数の部屋または複数の階の部屋のタイル要件を計算する場合は、上記のプログラムを何度も実行し、値を書き留める必要がありますが、これは実際には非常に困難です。
複数の部屋のタイル要件を見つける。
次に、 ClsTiles の配列を使用して、複数の部屋のタイル要件を見つける別のプログラムを作成しましょう。 キーボードから直接プロパティ値を入力してオブジェクトを作成します。
- 次のVBAコードをコピーして標準モジュールに貼り付けます。
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- デバッグウィンドウを開いたままにして、そこに出力を印刷します。
- 前と同じようにコードを実行し、3つの部屋の床とタイルの寸法の値を入力します。
上記のコードからわかるように、RoomディメンションとTileディメンションの両方の値が、同じクラスオブジェクト配列インスタンスに並べて配置されます。
上記のプログラムは、For内の3セットの値に対してのみ実行されるデモです。 。 。次のループ。条件付きブレークコードがプログラムを終了するまで、必要な回数だけ実行される条件付きループで変更できます。
プログラムを変更して、データ値と計算結果の各セットを将来の参照用にテーブルに保存することができます。
ラッパークラス コンテナです 他のクラスのインスタンス、データ構造、または他のオブジェクトのインスタンスコレクションのクラス。ここでは、同じクラスObjectの2つのインスタンスを保持するために使用しました。
このトピックのすべてのリンクのリスト。
- MS-AccessクラスモジュールとVBA
- MS-AccessVBAクラスオブジェクト配列
- MS-Accessの基本クラスと派生オブジェクト
- VBA基本クラスと派生オブジェクト-2
- 基本クラスと派生オブジェクトのバリアント
- Ms-Accessレコードセットとクラスモジュール
- アクセスクラスモジュールとラッパークラス
- ラッパークラスの機能変換
- Ms-Accessおよびコレクションオブジェクトの基本
- Ms-Accessクラスモジュールとコレクションオブジェクト
- コレクションオブジェクトとフォームのテーブルレコード
- 辞書オブジェクトの基本
- 辞書オブジェクトの基本-2
- 辞書オブジェクトのキーとアイテムの並べ替え
- 辞書からフォームへのレコードの表示
- クラスオブジェクトをディクショナリアイテムとして追加
- クラスオブジェクトをディクショナリアイテムとして追加
- フォームのクラスオブジェクトディクショナリアイテムを更新する