ユーザーフォームへのコントロール配置――このやり方があったじゃないか!
Controlsコレクションの引数
このやり方があったじゃないか!
前回
コチラの記事で、
オブジェクト名を「Object1」、「Object2」、……とかにしておいて、「Object & i」とかで指定できるか
ということなんだが、当然そんなことはできない。
などと、テキトーなことをぶっこいてしまったが、そんなことはない。
Controls("Object" & i)
という指定の仕方があったじゃないか!
コードの書き換え
というわけで、コードを修正。
前回記事のリスト1を次のように書き換える。
リスト1 フォームモジュール
Public Sub init(ByVal btnHeight As Double, _ ByVal btnWidth As Double, _ ByVal offsetBtnsRow As Double, _ ByVal offsetBtnsCol As Double, _ ByVal numOfCols As Integer, _ ByVal btnName As String) numOfBtns_ = 10 Dim i As Integer For i = 1 To numOfBtns_ With Controls("Btn" & Format(i, "0#")) .Height = btnHeight .Width = btnWidth .Top = offsetBtnsRow + ((offsetBtnsRow + btnHeight) * ((i - 1) \ numOfCols)) .Left = offsetBtnsCol + ((offsetBtnsCol + btnWidth) * ((i - 1) Mod numOfCols)) .Caption = btnName & StrConv(i, vbWide) & "号" End With Next With Me .Height = offsetBtnsRow _ + ((btnHeight + offsetBtnsRow) * (((numOfBtns_ - 1) \ numOfCols) + 1)) _ + TOP_BOTTOM_MARGIN .Width = offsetBtnsCol + ((btnWidth + offsetBtnsCol) * numOfCols) + offsetBtnsCol End With End Sub
ちょっとスッキリした。
実行
次のコードで実行。
リスト2 標準モジュール
Public Sub controlTest() Dim testFrm As TestForm Set testFrm = New TestForm With testFrm .init btnHeight:=20, _ btnWidth:=50, _ offsetBtnsRow:=10, _ offsetBtnsCol:=5, _ numOfCols:=5, _ btnName:="クズ" .Caption = "ち~んw" .Show End With End Sub
第6引数だけちょっと変えてみたw
実行結果
うまくいった。
おわりに
同じ種類のコントロールを規則正しく配置するだけならこのやり方が一番いいかも。
ただ、実用的なものにするには当然イベント処理を追加していく必要があるわけで、そういうところも工夫する必要がありそうだ。