自作メッセージボックスの作成その3です。
その2はこちら
今回はユーザーフォームやボタンのサイズを自動調節したいと思います。
オブジェクトがAutoSizeプロパティを持っているかどうかを確認
オブジェクトにはAutoSizeプロパティを持っているものがあります。
AutoSizeプロパティを持っていれば話は簡単です。
AutoSizeプロパティにTrueを設定してあげれば良いいだけだからです。
結論から言うと、今回使うオブジェクトの中でAutoSizeプロパティを持っているのは、ラベルとコマンドボタンの二つです。
ユーザーフォーム自体はAutoSizeプロパティを持っていません。
AutoSizeプロパティを持っていないユーザーフォーム自体のサイズの自動変更方法
ユーザーフォームのサイズをラベルやボタンに合わせて自動変更するには、先にラベルとボタンのAutoSizeプロパティにTrueを設定ます。
そしてそのサイズを取得してから全てのオブジェクトが見えるようにユーザーフォームのサイズを設定します。
(ラベルとボタンのAutoSizeプロパティにTrueを設定した後のサイズは、設定した後のそれぞれのHeightプロパティとWidthプロパティで取得できます。)
流れとしては次のようになります。
①ボタンとラベルのAutoSizeプロパティにTrueを設定
②ボタンとラベルのHeightプロパティとWidthプロパティを取得
③ボタンの高さとラベルの高さを合計する。(ラベルとボタンのすき間など微調整)
→ユーザーフォームの高さとして設定する。
④ボタンの幅とラベルの幅を比較する。(ボタンとボタンのすき間など微調整)
→大きい方の幅をユーザーフォームの幅として設定する。
これでラベルとボタンのサイズに合ったユーザーフォームのサイズを設定できます。
実際のコード
Me.lbl_Prompt.AutoSize = True
Dim CurrentControl As Control 'ループ用変数
For Each CurrentControl In Me.Controls 'コントロールをループ
If TypeName(CurrentControl) = "CommandButton" Then 'コマンドボタンのみ対象
If CurrentControl.Caption = "" Then CurrentControl.Visible = False 'ボタンが空白だったら非表示にする
CurrentControl.Font.Size = Button_FontSize 'ボタンのフォントサイズを設定
CurrentControl.AutoSize = True 'ボタンのサイズを自動設定
CurrentControl.Top = Me.lbl_Prompt.Height + 40 'ラベルとボタンの間にすき間をいれる
End If
Next
Me.Button2.Left = Me.Button1.Left + Me.Button1.Width + 10 'ボタン1とボタン2の間にすき間を入れる
Me.Button3.Left = Me.Button2.Left + Me.Button2.Width + 10 'ボタン2とボタン3の間にすき間を入れる
'ユーザーフォームのサイズを設定する
Me.Height = Me.lbl_Prompt.Height + Me.Button1.Height + 80
Me.Width = WorksheetFunction.Max(Me.lbl_Prompt.Width + 20, Me.Button1.Width + Me.Button2.Width + Me.Button3.Width + 100)
マジックナンバーを多用していますが、変数や定数を使うと逆に分かりにくくなる可能性があるので敢えてマジックナンバーを使用しています。
という事で実際に実行してみると
今回
前々回に実行した時
しっかりサイズが自動調整されているのが分かると思います!
ちなみに、第一回目で
【ラベルの横幅は出来るだけ広げて設置しておきます。(理由は後述します。)】
と言っていたのを覚えていますでしょうか?
その理由はラベルの幅はAutoSizeで狭くすることは出来ても、広げることが出来ないからです。
(方法はあるかもしれませんが見つけられませんでした。)
それでは、次回はどのボタンを押したかの判定を実装して終了となります。
次回【どのボタンを押したかを取得するには】