sql >> データベース >  >> RDS >> Access

Ms-AccessVBAクラスオブジェクト配列

    はじめに。

    先週、簡単なカスタムクラスオブジェクトについて簡単に紹介しました。 長さのプロパティは2つだけです および 値。 面積の計算方法 長さと幅の値で、何でも。 Ms-Accessカスタムクラスモジュールの基本を理解していただければ幸いです。そうでない場合は、次のリンクを参照してください:Ms-AccessClassModuleおよびVBA。続行する前に、このページにアクセスしてください。

    クラスモジュールオブジェクトは、プログラムに多くのコードを保存します。コードで繰り返し行うことを見つけたら、クラスモジュールオブジェクトについて考えてください。反復コードも効用関数に変えることができますが、クラスオブジェクトの場合は別のアプローチを取る必要があります。

    単純なタスクの場合、クラスモジュールオブジェクトの機能を改良するためにより多くのコードが必要になる場合がありますが、メインモジュールプログラムは単純であり、開発および改良されたすべての複雑なコードは他のコードから隠されたままになります。

    しかし今のところ、簡単なクラスモジュールが手元にあり、オブジェクトの配列を作成して多くのアイテムの面積を計算する方法を試してみます。

    ClassArray()サブルーチン。

    標準モジュールのサンプルVBAコードは、ClsAreaクラスの5つのオブジェクトの配列を作成し、それらのプロパティ値とメソッド結果をデバッグウィンドウに出力します。次のコードをコピーして貼り付けます(または、入力した場合は、各行の機能をよりよく理解するために)。

    Public Sub ClassArray()
    Dim tmpA As ClsArea
    Dim CA() As ClsArea
    Dim j As Long, title As String
    Dim L As Long, U As Long
    
    title = "ClassArray"
    For j = 1 To 5 ‘the Loop is set for 5 items
      'instantiate temporary ClsArea Object
      'to enter input
      Set tmpA = New ClsArea
    
    tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
         tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
         tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
        
      'Redimension Array
      ReDim Preserve CA(1 To j) As ClsArea
      Set CA(j) = tmpA   'Copy Object to Array
      
    Set tmpA = Nothing 'Remove temporary object from memory.
    Next
    
    
    ‘PRINTING SECTION
    'Print the Array contents into the Debug Window
    L = LBound(CA)
    U = UBound(CA)
    
    Debug.Print "Description", "Length", "Width", "Area"
    For j = L To U
      With CA(j)
        Debug.Print .strDesc, .dblLength, .dblWidth, .Area
      End With
    Next
    
    ’stop
    
    'Clear array objects from memory
    For j = L To U
       Set CA(j) = Nothing
    Next
    
    End Sub
     
    

    コードの中央のどこかをクリックし、F5キーを押してコードを実行します。 5つの異なるアイテムについて、キーボードから説明、長さ、幅の値を次々に入力します。

    プログラムの実行例を以下に示します。

    Description   Length        Width         Area
    Door Mat       5             8             40 
    Carpet         12            23            276 
    Bed Room       21            23            483 
    Store Room     15            25            375 
    Terrace        40            50            2000 

    行ごとのコードのレビュー。

    コードを1行ずつ調べてみましょう。宣言領域では、オブジェクト変数 tmpAを宣言しました。 ClsAreaタイプの。 2行目で、空の配列 CA()を宣言しました ClsAreaタイプの。必要な数の要素は、プログラムの後半で再寸法化されます。

    次の2行で、変数 titleを宣言しました 文字列タイプとj、L、 およびU 長整数型の変数。

    次に、タイトル変数は文字列「ClassArray」で初期化され、InputBox()関数でタイトルとして使用されます。 For….Next ループは制御変数jで設定されます ループを5回実行します。次の2つのコメント行の後、設定 ステートメントインスタンス化 (メモリを割り当てます) tmpAという名前のメモリ内のClsAreaクラスオブジェクト 。

    次の3行のコードは、 strDescの値を入力するのに役立ちます 、 dblLength、 およびdblWidth tmpAクラスオブジェクトのプロパティ。

    次のコメント行の後、ClsAreaクラスオブジェクト(CA)は1からjに再ディメンション化されます。 既存のオブジェクト要素(存在する場合)を保持することにより、回数(1〜1回)(これは配列内の最初のオブジェクトです)。これは、 ReDim を通じて増加し続けます For内の以前のオブジェクト値を保持することにより、1から2、1から3、1から4、および1から5へのステートメント。 。 。次のループ。 保存 キーワードは、既存の配列オブジェクトが失われないようにします。

    注: Re-Dimensionステートメントは、指定されたオブジェクト要素の数を増減しますが、保存を使用せずに、以前に配列にロードされた既存のオブジェクトを消去します キーワード。

    セット 次の行のステートメントは、データとともにtmpAオブジェクトを CA(j)にコピーします。 新しく作成されたClsAreaオブジェクトj 配列要素。

    次の行SettmpA =Nothing 一時オブジェクトをメモリから削除します。

    For…Nextループはこのアクションをさらに4回繰り返して、新しくインスタンス化された一時オブジェクトtmpAに他のアイテムを次々に入力し、オブジェクトをCAObjectArrayにコピーします。

    コメント行の後の次の2行は、オブジェクト配列のインデックス範囲を検索します(最小および最大のインデックス番号を検索します。

    次のDebug.Print ステートメントは、デバッグウィンドウの14列のゾーンに見出し行を出力します。 For。 。 。次へ Lでループする およびU バインドされた配列インデックス番号範囲は、内部ステートメントを実行して、配列 CA、から各オブジェクトにアクセスします。 制御変数jにインデックス番号があります。

    現在のオブジェクト参照はWith内に設定されます。 。 。で終わる オブジェクト名を繰り返すのではなく、構造体 CA(j).strDesc、CA(j).dblLength、CA(j).dblWidth およびCA(j).Area オブジェクトのプロパティ値とメソッドArea()の結果をデバッグウィンドウに出力します。

    「停止」からコメント記号を削除します Stopステートメントでプログラムに一時停止を作成するステートメント。コードを再度実行し、5つの項目の詳細を入力して、配列オブジェクトを試すことができるようにします。以下に示すように、任意のオブジェクトプロパティを配列インデックス番号で選択的にアドレス指定して、デバッグウィンドウで任意の値を編集または印刷できます。


    ステートメントSetCA(j)=Nothing For内。 。 。 Next Loopは、配列オブジェクトをメモリから1つずつクリアします。

    クラスオブジェクト配列を関数パラメータとして渡します。

    ユーザー定義のデータ型で行ったように、クラスオブジェクト配列をパラメータとしてプログラムに渡すことができます。

    メインプログラムの印刷セクションコードを切り取って、新しいプログラムに配置することにより、簡単な印刷サブルーチンを作成しましょう。

    ClassArray()サブルーチンコードをコピーし、同じ標準モジュールに貼り付けて、名前を ClassArray2()、に変更します。 以下に示すように。

    Public Sub ClassArray2()
    Dim tmpA As ClsArea
    Dim CA() As ClsArea
    Dim j As Long, title As String
    Dim L As Long, U As Long
    
    title = "ClassArray"
    For j = 1 To 5 ‘the Loop is set for 5 items
      'instantiate temporary ClsArea Object
      'to enter input
      Set tmpA = New ClsArea
    
         tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
         tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
         tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
        
      'Redimension Array
      ReDim Preserve CA(1 To j) As ClsArea
      Set CA(j) = tmpA   'Copy Object to Array
      
     Set tmpA = Nothing 'Remove temporary object from memory.
    Next
    
    ‘PRINTING SECTION
    'Print the Array contents into the Debug Window
    L = LBound(CA)
    U = UBound(CA)
    
    Debug.Print "Description", "Length", "Width", "Area"
    For j = L To U
      With CA(j)
        Debug.Print .strDesc, .dblLength, .dblWidth, .Area
      End With
    Next
    
    ’stop
    
    'Clear array objects from memory
    For j = L To U
       Set CA(j) = Nothing
    Next
    
    End Sub
     

    印刷セクションのないClassArray2コード。

    以下に示すように、新しいサブルーチンを作成します。

    Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
    Dim L As Long, U As Long
    Dim j As Long
    
    End Sub
    
    

    ClassArray2()プログラムの「Stopステートメント」までの印刷セクションを強調表示し、強調表示されたコードの領域を切り取って、 Dimの下に貼り付けます。 ClassPrint()のステートメント プログラム。両方のコードの修正バージョンを以下に示します:

    Public Sub ClassArray2()
    Dim tmpA As ClsArea
    Dim CA() As ClsArea
    Dim j As Long, title As String
    
    title = "ClassArray"
    For j = 1 To 5 ‘the Loop is set for 5 items
      'instantiate temporary ClsArea Object
      'to enter input
      Set tmpA = New ClsArea
         tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
         tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
         tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
        
      'Redimension Array
      ReDim Preserve CA(1 To j) As ClsArea
      Set CA(j) = tmpA   'Copy Object to Array
      
     Set tmpA = Nothing 'Remove temporary object from memory.
    Next
    
    Call ClassPrint(CA) ‘Pass the Object Array to print routine
    
    'Clear array objects from memory
    For j = L To U
       Set CA(j) = Nothing
    Next
    
    End Sub
    

    ClassPrint()プログラム。

    Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
    Dim L As Long, U As Long
    Dim j As Long
    
    'Printing Section
    'Print the Array Contents into the Debug Window.
    L = LBound(clsPrint)
    U = UBound(clsPrint)
    
    Debug.Print "Description", "Length", "Width", "Area"
    For j = L To U
      With clsPrint(j)
        Debug.Print .strDesc, .dblLength, .dblWidth, .Area
      End With
    Next
    
    End Sub
    
    

    両方のプログラムでコードの変更を確認し、該当する場合は修正を行います。 ClassArray2()コードの中央をクリックし、F5キーを押してプログラムを実行します。

    最初のプログラムのCallステートメントは、CAクラスオブジェクト配列をByRefパラメーターとしてClassPrint()サブルーチンに渡します。プログラムはオブジェクトプロパティを出力し、関数Area()を呼び出して計算し、出力する値を返します。

    来週は、ClsAreaクラスモジュールを基本クラスとして使用して、ボリュームを計算するための新しいVBAクラスオブジェクトを作成する方法を学習します。 何かの。

    1. MS-AccessクラスモジュールとVBA
    2. MS-AccessVBAクラスオブジェクト配列
    3. MS-Accessの基本クラスと派生オブジェクト
    4. VBA基本クラスと派生オブジェクト-2
    5. 基本クラスと派生オブジェクトのバリアント
    6. Ms-Accessレコードセットとクラスモジュール
    7. アクセスクラスモジュールとラッパークラス
    8. ラッパークラスの機能変換
    9. Ms-Accessおよびコレクションオブジェクトの基本
    10. Ms-Accessクラスモジュールとコレクションオブジェクト
    11. コレクションオブジェクトとフォームのテーブルレコード
    12. 辞書オブジェクトの基本
    13. 辞書オブジェクトの基本-2
    14. 辞書オブジェクトのキーとアイテムの並べ替え
    15. 辞書からフォームへのレコードの表示
    16. クラスオブジェクトをディクショナリアイテムとして追加
    17. フォームのクラスオブジェクトディクショナリアイテムを更新する


    1. 別のINSERTでINSERT...RETURNINGの戻り値を使用できますか?

    2. oracleSQL日付から時間を削除する方法

    3. SQLServerの日付と時刻のデータ型の比較

    4. T-SQLのピボットデータ