Accessのサブフォームコントロールの幅をいい感じに合わせる計算方法(VBAもあるよ)

【スポンサーリンク】


サブフォームコントロールの幅を手動で整えるの面倒じゃないですか?面倒ですよね。
最近サブフォームコントロールを6個くらい一度に設置する機会があったんですが、それがもう大変で……
基本的には設置してサイズ整えたらそれで終わりのものとはいえ、もっと効率良く幅設定する方法あるよな?と思ったので調べてみました。


「サブフォーム」と「サブフォームコントロール」

この記事での「サブフォーム」と「サブフォームコントロール」の記載について、ちょっと紛らわしいので書いておきます。

サブフォーム:サブフォームコントロールのコントロールソースに設定したフォームのこと
サブフォームコントロール:フォームを表示するコントロールのこと

コントロールの幅に関係するものについて

いい感じの幅を計算するために「垂直ルーラー」「レコードセレクタ」「垂直スクロールバー」「境界線1ポイント」の幅を知る必要があります。
私が調べた時のデータを載せておきますが、もしかしたら環境によって変わるかもしれないので、一応測り方も書いておきます。

サイズの測り方

幅に関係するもののサイズ一覧

垂直ルーラー:0.608cm
レコードセレクタ:0.503cm
垂直スクロールバー:0.45cm
境界線1ポイント(&細線):0.026cm
f:id:teali_s:20210109225137p:plain:w500


1.サブフォームコントロールを設置


2.四角形を設置

立体表示なし、境界線1ポイント、境界線色はわかりやすければ何色でもOK

3.測りたい箇所に四角形を移動&サイズ変更

サブフォームコントロールの下になっている箇所は黒い線で表示されるので、それを参考に調整してください。
f:id:teali_s:20210108230308p:plain:w500
※画像はイメージです。
ちなみにレコードセレクタはレイアウトビューじゃないと表示されません。

4.フォームビューで確認

画面のキャプチャをペイントなどに貼り付けて拡大すると確認しやすいです。
測る部位によっては、そうしないと境界線1~2本分ズレててもわからない場合があります。

5.デザインビューに戻し、プロパティから幅を取得


手動での計算手順

プロパティに入力した数値が変わる場合

計算した数値をプロパティに入力して確定すると数値が前後する場合がありますが、内部で使っている単位とプロパティ表示の単位が違うことから起こるようです。
実際のフォームサイズには影響しないので気にせず処理してください。

1.デザインビューを使用し、サブフォームコントロールの幅を手動で設定する

サブフォームの右端のコントロールにピッタリとスクロールバーを合わせたり、水平スクロールバーを非表示にして右端のコントロールを隠したり……
ここでは「最終的にフォームビューで表示したい状態」になるように設定してください。

2.手順1で求めた幅に対し,以下のパターンに基づいて計算を行う

手順1でルーラーを表示しているかいないかで、使う数値が変わります。

・デザインビューでルーラーを表示している場合
レコードセレクタなし:-0.608
レコードセレクタあり:-0.105(垂直ルーラーとレコードセレクタのサイズ差)

・デザインビューでルーラーを非表示にしている場合
レコードセレクタなし:計算なし(±0)
レコードセレクタあり:+0.503

3.手順2の計算結果に対し,スクロールバー分の計算を行う

垂直スクロールバーなし:-0.45
垂直スクロールバーあり:計算なし(±0)

4.手順3の計算結果をサブフォームコントロールの幅に設定する

サブフォームコントロールを選択し、プロパティの「幅」に計算結果を入力してください。

フォームビューに切り替え、いい感じの幅になっていたら終わり。なっていなかったら微調整してください。

VBAで設定する手順

前提条件

サブフォームに「フォームの右端に到達しているコントロールがある」こと。
サブフォームの幅を求めるために必要になります。
ない場合はサイズ設定用のコントロールを非表示で設置すればOKです。あるいはコードをアレンジして頑張ってください。

★計算に使うサイズ

レコードセレクタ:0.529cm
スクロールバー:0.476cm

スクロールバー無しの場合は0.529cm
レコードセレクタ無しの場合は0.476cm
両方ある時は0.979cmを使います。
※0.026cm(境界線1ポイント分)を追加しないと、サブフォームコントロールの境界線(またはスクロールバー)がサブフォーム右端のコントロールと被ります。
足すのは1回でいいので、両方ある時のサイズは「0.529cm + 0.476cm - 0.026cm」の0.979cmになります。

幅を設定する式

コード内の以下の文字列を自分で使っているものに置き換えてください。
※フルで書くとコードが長くなるので略しています。

メイン:メインフォーム名
サブ:サブフォームコントロール名
右端:サブフォーム右端のコントロール名(サイズ設定用のコントロール)
また、★をサブフォームの設定に合わせ、上で記載したサイズに置き換えてください。

パターン①
メイン.サブ.Width = メイン.サブ.Form!右端.Left + メイン.サブ.Form!右端.Width + (★ * 567)


①の図解

f:id:teali_s:20210109225044p:plain:w500

パターン②

左位置(Left)が0cmで右端の幅がフォームの端まであるコントロール(見出し的なラベルなど)がある場合はLeftの処理が不要になるので、こちらを使ってください。

メイン.サブ.Width = メイン.サブ.Form!右端.Width + (★ * 567)


②の図解

f:id:teali_s:20210109225121p:plain:w500

コード例

名前

メイン:F_Main
サブ:SubF_Test
右端:Lab_Size

設定

・レコードセレクタと垂直スクロールバー両方あり
・サブフォームコントロールはメインフォームに設置

F_Mainを開いた時の処理(Form_Open)に入れるので、メインはMeと記載。

Private Sub Form_Open(Cancel As Integer)
    Me.SubF_Test.Width = Me.SubF_Test.Form!Lab_Size.Width + Me.SubF_Test.Form!Lab_Size.Left + (0.979 * 567)
End Sub


サイズに掛けている567という数字について

プロパティではcm単位でサイズが表示されますが、内部的にはtwipという単位を使っているので、VBAでフォームのサイズをいじる時はcmをtwipにしてあげる必要があります。
1cm=567twipなので、cm単位で出した幅に567を掛けています。

参考

VBEの用語集 - twip
https://docs.microsoft.com/ja-jp/office/vba/language/glossary/vbe-glossary#twip

【スポンサーリンク】