はじめに。
先週、セットを介して基本クラスオブジェクトを渡す例を試しました。 プロパティプロシージャ、メモリ内のオブジェクトの一部になります。渡されたオブジェクトは、メモリ内のメインオブジェクトの拡張オブジェクトまたは子オブジェクトになります。以前のプログラムでは、子オブジェクトをターゲットオブジェクトに渡すことは、テストプログラムのインスタンス化フェーズで行われました。プログラムの後半で、渡されたオブジェクトプロパティに値を割り当てました。次の例は少し異なります。
MS-Accessクラスモジュールに関する以前の記事を読みたい方のために、リンクを以下に示します。
- MS-AccessクラスモジュールとVBA
- MS-AccessVBAクラスオブジェクト配列
- MS-Accessの基本クラスと派生オブジェクト
- VBA基本クラスと派生オブジェクト-2
今回は、テストプログラムで両方のオブジェクト(ClsArea –基本クラス、ClsVolume2 –ターゲットクラス)を別々に開きます。ターゲットクラスClsVolume2オブジェクトに値を渡す前に、基本クラスClsAreaプロパティに値を割り当てます。 Volume2クラスには、 p_Heightという独自のプロパティが1つしかないことに注意してください。 プロパティとそのメソッドVolume() 長さが必要です および幅 ボリュームを計算するための基本クラスClsAreaの値。
- 次のサンプルテストコードをコピーして標準モジュールに貼り付けます。
SetNewVol2_2プロシージャ。
Public Sub SetNewVol2_2() 'Method 2/2 Dim CA As ClsArea Dim Vol As ClsVolume2 Set CA = New ClsArea Set Vol = New ClsVolume2 CA.strDesc = "Bed Room" CA.dblLength = 90 CA.dblWidth = 10 Stop 'Here ClsArea class Object CA is passed to the ‘Property procedure Set CArea of ClsVolume2 object Vol Set Vol.CArea = CA 'Pass ClsArea obj to ClsVolume2 Vol.dblHeight = 10 'assign height to ClsVolume2 Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" With Vol.CArea Debug.Print .strDesc, .dblLength, .dblWidth, .Area(), Vol.dblHeight, Vol.Volume() End With Stop Set CA = Nothing Set Vol = Nothing End Sub
VBAコードレビュー。
最初の薄暗い ステートメント、 CA ClsAreaObjectおよびVolとして定義されます ClsVolume2オブジェクトとして。次の2つのステートメントは、メモリ内の両方のオブジェクトをインスタンス化します。
次の3つのステートメントは、ClsAreaクラスオブジェクトのプロパティに値を割り当てます。
停止 ステートメントはコードの実行を一時停止して、ローカルウィンドウでオブジェクトプロパティの値を確認できるようにします。
Set Vol.CArea =CA ステートメントは、ClsAreaクラスオブジェクトCAを子オブジェクトとして Volに割り当てます。 (ClsVolume2)オブジェクト。
次のステップではdblHeight ClsVolume2クラスオブジェクトのプロパティには、値10が割り当てられています。
Stopステートメントの前の次のステートメントは、値をメモリからデバッグウィンドウに出力します。
次の2つのセット ステートメントは、プログラムを終了する前に、オブジェクトをメモリから削除します。
ローカルウィンドウを表示します。
- ローカルウィンドウを選択します 表示メニューからのオプション。
- コードの途中をクリックして、 F5を押します プログラムが停止で一時停止するまでコードを実行します 声明。または、 F8を押すこともできます コードを一度に1ステップずつ実行して、各ステップでローカルウィンドウの変更を検査します。
- [+]をクリックします オブジェクトのプロパティと値の両方を展開して表示するための記号。
- CAreaを確認してください およびp_Area 値のオブジェクト参照 巻の列 オブジェクト。 そこにある値は何もないと表示されています CAオブジェクトをVolオブジェクトにまだ渡していないためです。
- ローカルウィンドウのコンテンツの表示が終了したら、次の停止までコードを実行します 声明。さて、 CArea プロパティプロシージャとp_Areaを取得します オブジェクトにはClsAreaクラスオブジェクトが割り当てられます。
これら2つのクラスClsAreaとClsVolume2の両方の別のバリアントの例を試してみます。
新しいクラスモジュールClsVolume3。
1.新しいクラスモジュールを挿入し、その名前のプロパティ値を ClsVolume3に変更します。 。
2.次のVBAコードをコピーしてClsVolume3クラスモジュールに貼り付けます。
Option Compare Database Option Explicit 'Method three Private p_Height As Double Public p_Area As ClsArea Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) p_Height = dblNewValue End Property Public Function Volume() As Double Volume = p_Area.dblLength * p_Area.dblWidth * Me.dblHeight End Function Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub
コードを最初から確認してください: p_Height プライベートプロパティとして宣言されています。 p_Area パブリックとして宣言されたClsVolume3クラスのプロパティ ClsAreaオブジェクト。つまり、 p_Area 直接Get/ Let用の独自の表示可能なプロパティを持つClsVolume3クラスのプロパティとして表示されます 標準モジュールのユーザープログラムでの操作。 ClsAreaクラスオブジェクトはClsVolume3クラスのパブリックプロパティとして宣言されていますが、そのプロパティはClsAreaクラス自体にカプセル化されています。
Class_Initialize()を確認してください およびClass_Terminate() サブルーチン。 ClsAreaオブジェクトは、Class_Initialize()コードでインスタンス化され、ユーザープログラムが終了すると、Class_Terminate()コードでメモリからオブジェクトを削除します。
テストプログラム。
サンプルのテストVBAコードを以下に示します。
コードをコピーして標準モジュールに貼り付けます。
Public Sub SNewVol3() 'Here ClsArea class is declared as a Public Property of ClsVolume3 Dim volm As ClsVolume3 Set volm = New ClsVolume3 volm.p_Area.strDesc = "Bed Room" volm.p_Area.dblLength = 15 'assign length volm.p_Area.dblWidth = 10 'assign width in clsArea volm.dblHeight = 10 'assign height to ClsVolume2 Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" With volm.p_Area Debug.Print .strDesc, .dblLength, .dblWidth, .Area, volm.dblHeight, volm.Volume End With Set volm = Nothing End Sub
まだ開いていない場合は、ローカルウィンドウを表示します([表示]-> [ローカルウィンドウ])。
コードの途中をクリックして、 F8を押します。 一度に1行ずつVBAコードを実行し、ローカルウィンドウを監視して、各ステップで何が発生するかを追跡します。
ClsVolumeクラスの最初の例を除いて、上記のClsVolumeクラスのすべてのバリアントは、より少ないコードで記述されています。
レコードセットオブジェクトの操作。
来週は、組み込みのオブジェクト DAO.Recordsetを使用します。 クラスモジュールを作成します 宛先:
- フィールドの計算と更新
- データを並べ替える
- ソートされたデータをデバッグウィンドウに出力します
- 並べ替えられたデータを使用してテーブルのクローンを作成します。
それは来週のたくさんの行動です。
このトピックのすべてのリンクのリスト。
- MS-AccessクラスモジュールとVBA
- MS-AccessVBAクラスオブジェクト配列
- MS-Accessの基本クラスと派生オブジェクト
- VBA基本クラスと派生オブジェクト-2
- 基本クラスと派生オブジェクトのバリアント
- Ms-Accessレコードセットとクラスモジュール
- アクセスクラスモジュールとラッパークラス
- ラッパークラスの機能変換
- Ms-Accessおよびコレクションオブジェクトの基本
- Ms-Accessクラスモジュールとコレクションオブジェクト
- コレクションオブジェクトとフォームのテーブルレコード
- 辞書オブジェクトの基本
- 辞書オブジェクトの基本-2
- 辞書オブジェクトのキーとアイテムの並べ替え
- 辞書からフォームへのレコードの表示
- クラスオブジェクトをディクショナリアイテムとして追加
- フォームのクラスオブジェクトディクショナリアイテムを更新する