ユーザーフォームのサイズ変更 ② 画面のn分の1サイズ(約数を求める関数の利用)
先日はユーザーフォームのサイズを、スピンボタンで変更してみた。
infoment.hatenablog.com
今日は、その続きに挑戦する。
先日は、ユーザーフォームの単位サイズを決め(例 50)、その倍数で横幅を変化させた。しかしもしユーザーフォームを複数枚横に並べるならば、ぴったり画面に収まった方が気持ちいい。
そこでまず、単位サイズをアクティブな画面の十二分の一にしてみた。
Private Property Get unit_width() As Long ' ユーザーフォームの単位幅。 ' スピンボタンを押すたびに、この値の倍数で ' ユーザーフォームの幅を変化させる。 unit_width = ActiveWindow.Width / 12 End Property
単位サイズを12で割ったのは、ピッタリで様々なパターンに並べるため。
スピンボタンが一つずつ変化するごとに、12の約数を上下させたい。
そこで、指定した数値の指定番目の約数を求める関数を作成してみた。
' 約数を求める関数。 ' 約数を求めたい関数を1から順に割り、 ' 余りが0の値を約数として辞書に格納する。 ' ※MicroSoft Scripting Runtime 参照済み。 Private Function Devisor(source_number As Long) As Scripting.Dictionary Dim Dict As Scripting.Dictionary Set Dict = New Scripting.Dictionary Dim i As Long Dim Counter As Long: Counter = 1 For i = 1 To source_number If source_number Mod i = 0 Then Dict(Counter) = i Counter = Counter + 1 End If Next Set Devisor = Dict End Function
スピンボタンの上下に伴うイベントは、値のChangeイベントに集約。
Private Sub SpinButton1_Change() Static Dict As Scripting.Dictionary If Dict Is Nothing Then Set Dict = Devisor(12) End If ' ユーザーフォームのサイズ変更。 ' 高さは、高さの約71%(1/√2倍)とした。 ' ※馴染みのあるAサイズ(A3やA4など)の比率。 UserForm1.Width = unit_width * Dict(SpinButton1.Value) UserForm1.Height = UserForm1.Width / 2 ^ 0.5 End Sub
これにより、初期化部分も簡素化出来た。
Private Sub UserForm_Initialize() ' スピンボタンの最大値と最小値を設定。 SpinButton1.Min = 1 SpinButton1.Max = 6 ' 初期値。 SpinButton1.Value = 3 End Sub
早速、実験してみよう。
これで、使用環境に合わせてユーザーフォームのサイズを
変更できるようになった。
次回に続きます。
参考まで。