非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

VBAでフォーム上に同じようなコントロールを配置する場合はプログラムで動的に生成すると良い

   

VBAでフォームを作る時って、Visual Basic Editorのフォーム作成画面で作ると思います。↓こんな感じにツールボックスからコントロールを選んで、フォーム上に貼り付けるというやり方です。

 

じゃあ、例えばこんなものを作る場合どうするか。ちなみに、1個の四角はLabelコントロールで15×15のサイズにしています。背景色は各Labelで微妙に変えています。四角は150個あります。

 

普通のやり方だと、こんな風に150個分のLabelを貼り付けるわけです。しかし、これはしんどい

 

それでは僕がとった方法をご覧いただきましょう。実行前のフォームはこんな感じ。

・・・あれ?何も貼ってない

 

でも実行すると↓こうなります。なぜでしょう??

[ad#top-1]

コントロールをプログラム上で貼り付ける方法

要は、最初からフォーム上にコントロールを貼っておくのではなく、プログラム上で動的に生成しているわけです。この方法のメリットは同じようなコントロールを複数貼り付ける場合、Forループで簡単に設置できます。

こちらがプログラム上でラベルを貼る例です。これでLabelが1個貼れます。

Set l1 = UserForm1.Controls.Add("Forms.Label.1", "label")
 

 

実行すると以下の通りです。サイズや色がデフォルトなのですが、背景色(フォームの色)と一緒なので存在が確認できません・・・。でもちゃんとある(はず)です。

 

次に、背景色とかサイズとか位置を設定する方法です。これも1個パターン。

Set l1 = UserForm1.Controls.Add("Forms.Label.1", "label")
l1.BackColor = RGB(200, 200, 220)
l1.BorderStyle = fmBorderStyleSingle
l1.Top = 10
l1.Left = 10
l1.Height = 15
l1.Width = 15
 

 

ご覧のとおり、15×15のLabelが現れました。

 

次に、横15個×縦10個を配置させます。ForループでLabelを生成させてあげます。Labelの色はちょっとずつ変えてあげます。

cnt = 1
For r = 1 To 10
  For c = 1 To 15
    Set l1 = UserForm1.Controls.Add("Forms.Label.1", "label")
    l1.BackColor = RGB(200 + (5 * r), 200 + (5 * c), 220)
    l1.BorderStyle = fmBorderStyleSingle
    l1.Top = 10 + (r - 1) * 18
    l1.Left = 10 + (c - 1) * 18
    l1.Height = 15
    l1.Width = 15
    cnt = cnt + 1
  Next c
Next r
 

 

こうすれば、以下のようなタイル状にコントロールを並べることができるわけですね。色も計算でちょっとずつ変えているのできれいな色合いになりました。

 

で、こいつをこちらが、UserForm_Initializeプロシージャ内に入れてやればフォームが現れる前に配置してくれるってわけです。

 

カラーパレットとか、似たようなコントロールを多数配置させるのに便利です。VBAってカラーパレットコントロールがないから作ってみようかな。

[ad#ad-1]

スポンサーリンク

 - Excel, VBA