機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【Excel-VBA#6】ユーザーフォームのリストの使い方

ユーザーフォームのリストを使ってみる

f:id:stjun:20201025233242p:plain

Excelの中身をユーザーフォームのリストに表示できます。

 

1. はじめに

これまでVBAの基本的なコードの書き方やユーザーフォームの作り方を紹介してきました。

www.stjun.com

www.stjun.com

今回はVBAとユーザーフォームを組み合わせて、ユーザーフォームのリスト上にExcelの中身を表示させてみたいと思います。

 

2. 説明

まずExcelの中身を準備します。次のように左から、名前、住所、電話番号、その他としてください。私は3人分の情報を記載しましたが、何人分書いても問題ありません。ワークシートの名前は標準の「Sheet1」から変えないでください。

f:id:stjun:20201025234432p:plain

 

2.1 ユーザーフォームを作る

以下のようなユーザーフォームを作ってください。各部品のプロパティは以下のように設定してください。

プロパティの設定の仕方は以下の過去記事を参考にしてください。

www.stjun.com

f:id:stjun:20201025235200p:plain

⓪ユーザーフォーム

Height:180

Width:430


①ラベル

Caption:名前

Height:9

Left:18

Top:24

Width:26

 

②ラベル

Caption:住所

Height:9

Left:66

Top:24

Width:26

 

③ラベル

Caption:電話番号

Height:9

Left:204

Top:24

Width:37

 

④ラベル

Caption:その他

Height:9

Left:300

Top:24

Width:26

 

⑤リストボックス

オブジェクト名:List

Height:75

Left:6

Top:36

Width:405

 

⑥コマンドボタン

オブジェクト名:btnClose

Caption:閉じる

Height:18

Left:324

Top:126

Width:78

 

2.2 コードを書く

次にコードを書いていきます。

ユーザーフォーム作成画面とコード作成画面を切り替えるには以下の赤枠で囲まれたアイコンをクリックします。

f:id:stjun:20201115151937p:plain

次にコード作成画面が出てきたら、
左上のリストボックス:UserForm

右上のリストボックス:Initialize

を選択してください。

f:id:stjun:20201026000208p:plain

f:id:stjun:20201026000237p:plain

すると次のようなコードが現れます。

Private Sub UserForm_Initialize()
End Sub

 上記のコードの意味は、「ユーザーフォーム(UserForm)が初期化された時(Initialize)に自動でコード実行」という意味で、ここに書いたコードはユーザーフォームを開いた瞬間に自動で実行されます。

コードの中身は以下になります。

Private Sub UserForm_Initialize()

'ワークシート(Sheet1)をアクティブにする Worksheets("Sheet1").Activate 'リストボックスの設定 With List .Font.Size = 10 .ColumnCount = 4 .ColumnWidths = "50;130;100;120" .TextAlign = fmTextAlignLeft 'リストボックスに情報を追加 Dim i As Integer Dim Row As Integer Row = Range("A1048576").End(xlUp).Row For i = 2 To Row .AddItem .List(.ListCount - 1, 0) = Cells(i, 1).Value .List(.ListCount - 1, 1) = Cells(i, 2).Value .List(.ListCount - 1, 2) = Cells(i, 3).Value .List(.ListCount - 1, 3) = Cells(i, 4).Value Next End With End Sub

リストボックスの設定は以下になります。

'リストボックスの設定
With List
.Font.Size = 10 
.ColumnCount = 4 
.ColumnWidths = "50;130;100;120"
.TextAlign = fmTextAlignLeft

 ColumnCountは列の数で今回は「名前、住所、電話番号、その他」の4項目を表示させたいので4にしています。

ColumnWidthsは各列の幅を設定しており、例えば住所は長いため130と大きめにしています。

TextAlign=fmTextAlignLeftは文字を左詰めにするという意味です。

 

次に以下のコードでリストボックスにExcelの情報を記載していきます。

'リストボックスに情報を追加
Dim i As Integer
Dim Row As Integer
Row = Range("A1048576").End(xlUp).Row
For i = 2 To Row
    .AddItem
    .List(.ListCount - 1, 0) = Cells(i, 1).Value
    .List(.ListCount - 1, 1) = Cells(i, 2).Value
    .List(.ListCount - 1, 2) = Cells(i, 3).Value
    .List(.ListCount - 1, 3) = Cells(i, 4).Value
 Next

Row=Range("A1048576").End(xlUp).Rowですが、セル番号:A1048567(Excel2019の最終行)から上に探索していき、空欄じゃなくなった時の行番号を取得するコードになります。

今回は4行目にデータが入っているので、変数Row=4になります。もし5行目までデータが入っていたらRow=5になります。

次に以下のfor文ですが、AddItemはリストに新しい行を追加するコードになります。

ListCountはリストの個数を取得するコードで、上のAddItemで新しい行を追加したのでListCountは1になります。リスト番号は0から始まりますので「ListCount-1」はリストの0番目、つまり一番上のリスト番号を指定していることになります。

 

2.3 フォームを閉じる処理

次に「閉じるボタン」を押したらユーザーフォームが閉じる処理を追加します。

以下のように上部のリストから、

左上のリストボックス:btnClose

右上のリストボックス:Click

を選択してください。

f:id:stjun:20201026000015p:plain

f:id:stjun:20201026000039p:plain

そしたら以下のように「Unload Me」と記載してください。

Private Sub btnClose_Click()
Unload Me
End Sub

 上記のコードの意味は、「閉じるボタン(btnClose)がクリック(Click)された時ユーザーフォームを閉じる(Unload me)」という意味になります。

 

2.4 実行して確認

実行すると冒頭の画像のように、フォームが表示された瞬間にリストにExcelの中身が記載されます。閉じるボタンを押すとユーザーフォームは閉じます。

f:id:stjun:20201025233242p:plain

 

 

3. おすすめ書籍

このシリーズはプログラミング初心者にも非常に分かりやすくてお勧めです。

私はプログラミングを初めて勉強する際、3番目の本を大学時代に買ってすごく助かりました。今でも手元に置いてるくらいです。 

 

4. 最後に

次回はもう少し機能を拡張させてみます。

 次の記事はこちらです。

www.stjun.com