はじめに。
Microsoft Access Class Moduleに関する以前の投稿をまだご覧になっていない場合は、続行する前にそれらを確認してください。リンクは以下のとおりです。
- MS-AccessクラスモジュールとVBA。
- MS-AccessVBAクラスオブジェクト配列。
ClsArea クラスは別のクラスオブジェクトの基本クラスとして実行できます。基本クラスによって実行された計算は、新しいオブジェクトの計算の一部として使用できます。たとえば、何かの体積を計算するオブジェクトの一部にすることができます。
dbl dblLength およびdblWidth Get / Letのプロパティプロシージャ名 プロシージャは、クラスオブジェクトが倍精度の数値で長さと幅の値を期待していることを示しているにすぎません。同様に、プロパティプロシージャ名をQuantityとUnitPriceに変更すると、最初の値に2番目の値を掛けると、あるアイテムの合計価格がわかります。
これは、ClsAreaクラスを基本クラスとして使用できることを意味します。たとえば、合計価格*税額を計算するための税率、または合計価格*割引率を使用して割引額を見つけるなど、最初の値に2番目の値を掛けた結果が必要な場合はいつでも等々。
単純なクラスモジュールを開発しましたが、他の多くの派生クラスの一部にすることができます。可能性はあなたの想像力と創造性に開かれています。
ClsAreaクラスは、長さと幅のプロパティのみを使用して、マテリアル、部屋、または同様のアイテムの面積を計算します。三角形または円の面積は計算されません。ただし、ストレージ容量を見つけるために部屋、倉庫のボリュームを計算する新しいクラスオブジェクトの一部にすることができます。そのためには、部屋の高さ、倉庫など、もう1つの値が必要です。
ボリュームクラス:ClsVolume。
新しいクラスモジュールClsVolume、を作成しましょう ClsAreaを基本クラスとして使用します。クラスモジュールを挿入し、その名前を変更します ClsVolumeのプロパティ 。次のコードを入力するか、コピーしてクラスモジュールに貼り付けます。
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (p_Height > 0) Then Volume = p_Area.Area * p_Height Else MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume" End If End Function
ClsVolumeクラスオブジェクトのコードはまだ完成していません。コードを1行ずつ調べてみましょう。プライベートプロパティとして宣言された3行目p_Area ClsAreaクラスオブジェクトの。
次の行は、 p_Heightという名前の私有財産を宣言しています データ型Doubleの。
Class_Initialize()およびClass_Terminate()サブルーチン。
次の2つのサブルーチン( Initialize() およびTerminate() )ここでは非常に重要です。
Initialize() ClsAreaオブジェクトを実行してインスタンス化します ClsVolumeクラスを使用してインスタンス化するときにメモリ内に 標準モジュールプログラムのオブジェクト。
ステートメントを実行すると、 Set ClsVolume =Nothing 標準モジュールプログラムで、メモリからClsVolumeオブジェクトをクリアするには、 Terminate() サブルーチンが実行され、ClsAreaオブジェクトが占有していたメモリスペースが解放されます。
プロパティGetdblHeight プロシージャは、 p_Heightから値を返します 呼び出し側プログラムの所有物。
プロパティLetdblHeight プロシージャは、 NewValueに渡された値を検証します パラメータを設定し、それをプライベートプロパティ p_Heightに割り当てます 。
Public Function Volume()は、 p_Area.Area()を呼び出して、ボリュームを計算します。 関数と返された面積の値にp_Heightを掛けて、次の式でボリュームを計算します。ボリューム=p_Area.Area*p_Height。ただし、このステートメントを実行する前に、検証チェックを実行して、p_Area.Area()関数がゼロより大きい値を返すことを確認します。これは、p_Area.dblLength、p_Area.dblWidthプロパティに有効な値があり、p_Heightプロパティ値がより大きいことを示します。ゼロ。
注: 以来、 p_Area クラスClsAreaのオブジェクトは、プライベートとして定義されています ClsVolumeクラスのプロパティプロパティ( strDesc、)を作成する必要があります dblLength、 dblWidth およびArea() 関数) Get / Letのために外の世界に見える 操作とエリア値を返します。つまり、ClsVolumeクラスモジュールのClsAreaクラスオブジェクトのstrDesc、dblLength、dblWidthプロパティ、およびArea()関数のGet/Letプロパティプロシージャも定義する必要があります。
Let/Getプロパティプロシージャ。
次のプロパティを追加しますGet/ Let 手順とArea() ClsVolumeクラスモジュールコードへの機能:
Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
strDesc()プロパティプロシージャGet/Letコード行を確認してください。プロシージャ名の使用法strDesc 別の名前を使用したい場合は、単に選択の問題です。ただし、ClsAreaクラスで使用した元のプロパティ名はstrDescです。ここでその元の名前を使用すると、元のClsAreaクラスオブジェクトとの関係が思い出されます。
次のGetdblLength()プロパティプロシージャでは、 =の右側の式 p_Area.dblLengthに署名します ClsAreaクラスオブジェクトに格納されているdblLength値を読み取り、呼び出し元のプログラムに戻ります。
Letプロパティプロシージャは、NewValue変数のパラメータ値をClsAreaクラスオブジェクトのp_Area.dblLengthプロパティに割り当てます。ここでは、NewValueパラメーター変数で受け取った値に対して検証チェックを実行していません。検証チェックは、値を p_Area.dblLength に割り当てるときに、ClsAreaクラス自体の中で実行されます。 プロパティ。
同様に、Get/Letプロパティプロシージャもp_Area.dblWidthプロパティに追加されます。
次に、 p_Area.Area() 関数は、ClsVolumeクラスオブジェクトを介して呼び出し元のプログラムに表示されます。
ClsVolume派生クラスモジュールコード。
ClsVolumeクラスモジュールの完成したコードを以下に示します。
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() ‘Open ClsArea Object in Memory with the name p_Area Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() ‘Removes the Object p_Area from Memory Set p_Area = Nothing ‘ End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then Volume = p_Area.Area * Me.dblHeight Else MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume" End If End Function ‘ClsArea Class Property Procedures and Method are exposed here Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
「これは二重の作業です。何らかの方法で、ClsVolumeクラスでClsAreaプロパティプロシージャを繰り返すこれらの手順をスキップできると便利です」のように、あなたは今考えていることを知っています。または、ClsArea自体にdblWidthプロパティを追加し、そこからArea()メソッドとVolume()メソッドを実行することもできますよね?
ここで重要なのは、基本クラスオブジェクトが別のクラスオブジェクトの設計の一部になる方法です。
再利用可能なクラスモジュールオブジェクトを設計するというアイデア全体を忘れないでください クラスオブジェクトを使用するメインプログラムは単純であり、クラスオブジェクトに組み込まれている複雑さは隠されたままです。
はい、コンパクトなコードでも複数の方法で実行できます。後で調べますが、とりあえず、元の計画を続けましょう。
ClsVolumeクラスを使用するメインプログラム。
標準モジュールのメインプログラムで新しいClsVolumeクラスをテストしてみましょう。サンプルコードを以下に示します。
Public Sub TestVolume() Dim vol As ClsVolume Set vol = New ClsVolume vol.strDesc = "Warehouse" vol.dblLength = 25 vol.dblWidth = 30 vol.dblHeight = 10 Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume() End With End Sub
印刷ラインがなくても、メインプログラムがいかにシンプルであるかがわかりますか?
コードをコピーして標準モジュールに貼り付けます。 Ctrl + Gキーを押して、デバッグウィンドウがまだ開いていない場合は表示します。コードの途中をクリックして、 F5を押します。 コードを実行するためのキー。デバッグウィンドウの出力例を以下に示します。
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
説明長さ幅高さ面積体積
倉庫253010 750 7500
検証はパフォーマンステストをチェックします。
テストを実行して、基本クラスのClsAreaクラスの入力値検証チェックが、ClsVolumeクラスを介して値が渡されたときに機能することを確認します。 Area()関数とVolume()関数でもいくつかの検証チェックを実行しました。
1つずつ試してみましょう:
まず、ClsVolumeクラスを介してClsArea.dblLengthプロパティに負の値を渡します。エラーメッセージをトリガーし、DoWhile…Loop内でInputbox()関数を開いて、正しい値を入力する必要があります。
1. Vol.dblLength =25の行の値25を置き換えます。 、– 5 F5を押します コードを実行するためのキー。
検証チェックはエラーをトリガーし、ゼロより大きい値を要求します。 0より大きい値を入力します。その後、行の値25を復元し、–5を置き換えます。
2.次のように、行の先頭にコメント記号(‘)を挿入して、行Vol.dblHeight =10を無効にします。‘Vol.dblHeight =10 。変更後、F5キーを押してコードを実行します。
プロパティに渡される入力値がないため、Vol.Volume()関数は、3つのプロパティ(dblLength、dblWidth、およびdblHeight)すべてにVolume関数を実行するための値が含まれている必要があることを示すエラーを生成します。
同様に、Vol.Area()関数のパフォーマンスも確認できます。
データ印刷関数を作成し、ClsVolumeオブジェクトをパラメーターとして関数に渡して、デバッグウィンドウに値を出力できます。
メインプログラムの変更されたコード。
両方のプログラムで変更されたコードを以下に示します。
Public Sub TestVolume() Dim Vol As ClsVolume Set Vol = New ClsVolume Vol.strDesc = "Warehouse" Vol.dblLength = 25 Vol.dblWidth = 30 Vol.dblHeight = 10 Call CVolPrint(Vol) Set Vol = Nothing End Sub
Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume End With End Sub
来週は、より少ないコードでボリュームクラスオブジェクトを構築します。
このトピックのすべてのページのリンク。
- MS-AccessクラスモジュールとVBA
- MS-AccessVBAクラスオブジェクト配列
- MS-Accessの基本クラスと派生オブジェクト
- VBA基本クラスと派生オブジェクト-2
- 基本クラスと派生オブジェクトのバリアント
- Ms-Accessレコードセットとクラスモジュール
- アクセスクラスモジュールとラッパークラス
- ラッパークラスの機能変換
- Ms-Accessおよびコレクションオブジェクトの基本
- Ms-Accessクラスモジュールとコレクションオブジェクト
- コレクションオブジェクトとフォームのテーブルレコード
- 辞書オブジェクトの基本
- 辞書オブジェクトの基本-2
- 辞書オブジェクトのキーとアイテムの並べ替え
- 辞書からフォームへのレコードの表示
- クラスオブジェクトをディクショナリアイテムとして追加
- フォームのクラスオブジェクトディクショナリアイテムを更新する