Chapter3-8 コレクション

コレクションとは

「人間」オブジェクトの階層図の中に、下図のような部分があります。「右手には5種類の指がある」という表現もできますが、どの指も”指”には変わりないので、「5本の指から手が成る」という表現もできます。

このような、同類のオブジェクトの集合体のことをVBAでは「コレクション」といいます。



■コレクションの例
英語で、1つの手を「Hand」、2つの手を「Hands」と表現するように、VBAでも次のように表記します(正確には、FormsとReportsは、現在開いているそれらのオブジェクトのコレクションです)。
  • テーブルオブジェクト(TableDef)のコレクション →→ TableDefs

  • フィールドオブジェクト(Field)のコレクション →→ Fields

  • フォームオブジェクト(Form)のコレクション →→ Forms

  • レポートオブジェクト(Report)のコレクション →→ Reports

■コレクションの表記
一方、5本の指それぞれに親指、人差指という名前があり、また第1指、第2指という数え方があるように、コレクション内の1つ1つのオブジェクトの指し方にも、次のような表記があります。
  • 右手("親指")、右手("人差指")、・・・・

  • 右手!親指、右手!人差指、・・・・

  • 右手(0)、右手(1)、右手(2)、・・・・・

  • Forms("顧客マスタフォーム") 、Forms("商品マスタフォーム") ・・・・・

  • Forms!顧客マスタフォーム、Forms!商品マスタフォーム・・・・・

  • Forms(0)、Forms(1)、Forms(2)、 ・・・・

■コレクションの階層表記
また、オブジェクトの階層があるように、コレクションにも階層があります。これも同様の表記で指し示すことができます。



■コレクションのプロパティ/メソッドの表記
また、コレクションの表記を使って指し示した1つのものも、”オブジェクト”には違いありません。その下位にプロパティやメソッドを指定してプログラミングすることができます。




■コレクションのプログラム例

別のフォームの値を参照する

With Forms!フォームプロパティの例
  Debug.Print .Name
  Debug.Print .Caption
  Debug.Print .Section("詳細").BackColor
  Debug.Print .InsideHeight
  Debug.Print .InsideWidth
  Debug.Print .AllowEdits
  With !データ
    Debug.Print .Value
    Debug.Print .FontName
    Debug.Print .FontSize
    Debug.Print .FontBold
  End With
End With


  • このプログラムでは、Withステートメントのネストに注意してください。複数のWithがネストされている場合、下位のWithは上位のWithの設定を引継ぐ形になります。上記プログラムの場合、「With !データ 〜 End With」内では、「Forms!プロパティの例!データ」というオブジェクトの各プロパティを扱っていることになります。

別のフォームの属性を設定する

With Forms!フォームプロパティの例
  .Caption = "標題を変更しました"
  .Section("詳細").BackColor = vbCyan
  .InsideHeight = .InsideHeight * 1.2
  .InsideWidth = .InsideWidth * 1.2
  With !データ
    .Value = "テストデータです!"
    .FontName = "MS P明朝"
    .FontSize = 14
    .FontBold = True
  End With
End With



開いているすべてのフォームを列挙する

Dim iintLoop As Integer

For iintLoop = 0 To Forms.Count - 1
  Debug.Print Forms(iintLoop).Name
Next iintLoop


  • 「Count」は、コレクションのプロパティです。「Forms.Count」によって、そのコレクション内にいくつのオブジェクトが存在するかを確認できます。また、各オブジェクトの番号はゼロから始まりますので、ループの上限を「Forms.Count - 1」としています。

開いているすべてのフォームを閉じる

Dim iintLoop As Integer

For iintLoop = Forms.Count - 1 To 0 Step -1
  DoCmd.Close acForm, Forms(iintLoop).Name
Next iintLoop


  • フォームを1つ閉じると、コレクション内の番号も1つずつ前にシフトします。そのため、番号の多い順からゼロに向かって閉じるようにします。Forステートメントで「Step -1」と指定することで、ループが実行されるたびにカウンタが−1されます。

別のフォーム内のすべてのコントロールを使用不可にする

Dim iintLoop As Integer

On Error Resume Next 'フォーカスのあるコントロールを無視します

With Forms!フォームプロパティの例
  For iintLoop = 0 To .Controls.Count - 1
    .Controls(iintLoop).Enabled = False
  Next iintLoop
End With

End Sub


  • 「Controls」はコントロールオブジェクト(Control)のコレクションです。

別のフォーム内のすべてのコントロールを使用可能にする

Dim ctl As Control
Dim iintLoop As Integer

With Forms!フォームプロパティの例
  For Each ctl In .Controls
    ctl.Enabled = True
  Next ctl
End With


  • ここで使われている「For Each〜Next」ステートメントは、コレクションの中から1つ1つのオブジェクトを取り出すループ用ステートメントです。
    「In」の次に指定されたコレクションから1つずつオブジェクトを取り出し、「Each」の次に指定された「オブジェクト変数」に代入します。ループ内では、そのオブジェクト変数に対して参照や代入などを行ないます。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved