25 フォーム系 - フォームの幅と各セクションの高さを収集する

カレントデータベース内にあるフォーム名の一覧とともに、それぞれのフォームの幅、および各セクションの高さ(セクションの有無も確認)を収集します。

※VBAで扱う幅や高さのプロパティ値の単位はすべて「twip」です。プロパティシートではcm単位で表示されますが、「1cm = 567twip」で換算できます。

  1. まず「Database」オブジェクトの変数である「dbs」に”カレントデータベース”をセットします。

  2. 次に「Container」オブジェクトの変数である「ctn」に、カレントデータベースの「Containers」コレクション内にある”フォーム(Forms)”をセットします。これによってそのオブジェクト変数に”データベース内のフォームのグループ全体への参照”がセットされます。

  3. Container内にあるすべてのフォームのコレクションである「Documents」の中から、For Each〜Nextステートメントでひとつずつフォーム情報を取り出し、「Document」オブジェクトの変数「doc」にセットしていきます。

  4. 取り出されたひとつのフォーム情報のうち、フォーム名である「Name」プロパティの値を、ここではそれを何度か使用するため、いったん変数「strFormName」にセットします。

  5. フォーム内のオブジェクトを参照するので、そのフォームを”デザインビュー”(引数に「acDesign」を指定)で開きます。

  6. まずフォーム名をイミディエイトウィンドウに出力します。

  7. 次に、そのフォームの「幅」を表す「Width」プロパティの値をイミディエイトウィンドウに出力します。

  8. 次に、そのフォームの”詳細セクション”の「高さ」を『フォームオブジェクト.Section(acDetail).Height』という書き方で取得し、イミディエイトウィンドウに出力します。

    「Section」はそのフォームに含まれるすべてのセクションのコレクションです。また「acDetail」は組み込み定数で、実際は「0」という値です。また「Height」はそのセクションの高さを表すプロパティです。
    つまり上記の記述は、「複数あるセクションの中の0番目の添字のセクションの高さ」を求めていることになります。

  9. ここまで出力したところで、各セクションの高さを表す変数(varFormHeaderHなど)をいったん「Null」に初期化します。

    その理由としては、詳細セクションはフォームに必ず存在していますが、他のセクションはデザインによってはない場合もあり、そのようなセクションを参照しようとするとエラーとなるためです。

    このサンプルコードではエラーが発生すると「Err_Handler」ルーチンへ飛びます。そこでエラー番号を確認し、それが「2462」であれば「セクションがないのに参照しようとした」ということで、その場合はエラー発生行の次の行からやり直すようにしています。

    そのとき、たとえばフォームヘッダーがない場合、変数「varFormHeaderH」には”直前に開いたフォーム”の当該値がすでにセットされている場合があります。そのあとに「varFormHeaderH」を参照した際、そのフォームではなく別のフォームの値を使ってしまうことになります。

    しかし事前に「Null」をセットしておけば、セクションがあればその値、セクションなしでエラールーチンから戻ってきた場合は「Null」のままですので、のちにNullかどうかでセクションの有無を確認できるというわけです。

  10. 4つのセクションについて、「Height」プロパティ値を取得し、それぞれの変数にセットします。

    4つのセクションについては、詳細セクションと同様に「Section」の添字に所定の組み込み定数を指定することで参照できます。
    • フォームヘッダー → acHeader
    • フォームフッター → acFooter
    • ページヘッダー → acPageHeader
    • ページフッター → acPageFooter

  11. 各変数にセットされたそれぞれのセクションの高さをイミディエイトウィンドウに出力します。

    なおここで、そのセクションがないときは上述のようにその値は「Null」になっていますので、その場合は「Nz」関数で”セクションなし”という文字列に置き換えて出力しています。

  12. そのフォームを閉じます。
    ここではデータ収集のみでデザイン変更はありませんので、引数に「acSaveNo」を指定することで意図的に変更を保存せずに閉じます。

Sub Sample_3_07()
'フォームの幅と各セクションの高さを収集する

  Dim dbs As Database
  Dim ctn As Container
  Dim doc As Document
  Dim sct As Section
  Dim strFormName As String
  Dim varFormHeaderH As Variant
  Dim varFormFooterH As Variant
  Dim varPageHeaderH As Variant
  Dim varPageFooterH As Variant

  On Error GoTo Err_Handler

  Set dbs = CurrentDb
  Set ctn = dbs.Containers!Forms
  For Each doc In ctn.Documents
    strFormName = doc.Name
    DoCmd.OpenForm strFormName, acDesign
    Debug.Print "■" & strFormName
    With Forms(strFormName)
      Debug.Print " フォームの幅:" & .Width
      Debug.Print " 詳細セクションの高さ:" & .Section(acDetail).Height
      varFormHeaderH = Null
      varFormFooterH = Null
      varPageHeaderH = Null
      varPageFooterH = Null
      varFormHeaderH = .Section(acHeader).Height
      varFormFooterH = .Section(acFooter).Height
      varPageHeaderH = .Section(acPageHeader).Height
      varPageFooterH = .Section(acPageFooter).Height
      Debug.Print " フォームヘッダーの高さ:" & Nz(varFormHeaderH, "セクションなし")
      Debug.Print " フォームフッターの高さ:" & Nz(varFormFooterH, "セクションなし")
      Debug.Print " ページヘッダーの高さ:" & Nz(varPageHeaderH, "セクションなし")
      Debug.Print " ページフッターの高さ:" & Nz(varPageFooterH, "セクションなし")
      Debug.Print "------------------"
    End With
    DoCmd.Close acForm, strFormName, acSaveNo
  Next doc

Exit_Here:
  Exit Sub

Err_Handler:
  If Err.Number = 2462 Then
    'セクションがないとき
    Resume Next
  Else
    MsgBox "エラー番号 : " & Err.Number & vbCrLf & _
            Err.Description, vbOKOnly + vbCritical
    Resume Exit_Here
  End If

End Sub

実行例:




| Index | Prev | Next |



Copyright © T'sWare All rights reserved