ユーザーフォームへのコントロール配置――このやり方があったじゃないか!

Controlsコレクションの引数

このやり方があったじゃないか!

前回

akashi-keirin.hatenablog.com

コチラの記事で、

オブジェクト名を「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

実行結果

f:id:akashi_keirin:20170923162917j:plain

うまくいった。

おわりに

同じ種類のコントロールを規則正しく配置するだけならこのやり方が一番いいかも。

ただ、実用的なものにするには当然イベント処理を追加していく必要があるわけで、そういうところも工夫する必要がありそうだ。

@akashi_keirin on Twitter