ユーザーフォームのサイズ変更 ② 画面のn分の1サイズ(約数を求める関数の利用)

先日はユーザーフォームのサイズを、スピンボタンで変更してみた。
infoment.hatenablog.com

今日は、その続きに挑戦する。
f:id:Infoment:20200119102227p:plain

先日は、ユーザーフォームの単位サイズを決め(例 50)、その倍数で横幅を変化させた。しかしもしユーザーフォームを複数枚横に並べるならば、ぴったり画面に収まった方が気持ちいい。

そこでまず、単位サイズをアクティブな画面の十二分の一にしてみた。

Private Property Get unit_width() As Long
' ユーザーフォームの単位幅。
' スピンボタンを押すたびに、この値の倍数で
' ユーザーフォームの幅を変化させる。
    unit_width = ActiveWindow.Width / 12
End Property

単位サイズを12で割ったのは、ピッタリで様々なパターンに並べるため。
 
f:id:Infoment:20200119103109p:plain

スピンボタンが一つずつ変化するごとに、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

早速、実験してみよう。
f:id:Infoment:20200119103628g:plain

これで、使用環境に合わせてユーザーフォームのサイズを
変更できるようになった。

次回に続きます。

参考まで。