Excelリストボックス操作の基本、データ追加・表示と削除:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、リストボックスにデータを追加するAddItemメソッドやリストボックスのデータを削除するRemoveItemメソッドの使い方を解説します。
今回はリストボックスコントロールの使い方として、「リストボックスにデータを追加して表示する方法」と、「リストボックスのデータを削除する方法」という2つの基本的なTipsを紹介する。
これらは2つとも、リストボックスを扱う上では、最も基本となる処理だ。コード自体は簡単なので、よく覚えておいていただきたい。
リストボックスにデータを追加するAddItemメソッド
まずは、リストボックスにデータを追加するTipsから解説しよう。Excelシート上にTips「Excelテキストボックスのフォーカス移動を使って複数選択状態にしたり検索したりする」と同じように、図1のようなデータと「フォームを表示」ボタンを作成しておく。
次に、ユーザーフォームを作成し、UserForm1のCaptionプロパティに、「リストボックスにデータを表示」と指定しておく。ユーザーフォーム上には、リストボックスを1個、図2のように配置する。プロパティから、リストボックスの「オブジェクト名」には、「一覧リストボックス」と指定しておく。
「テキストボックス」や、リストボックスの「書体」や「文字サイズ」は、「Font」プロパティから指定している。読者の皆さんの好きな指定にしてもらって構わない。
リストボックスにデータを追加するAddItemメソッドの書式
{オブジェクト}.AddItem {item}
{オブジェクト}には、対象となるリストボックスオブジェクトを指定する。{item}には、追加する項目を指定する。
プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。
ユーザーフォームがアクティブになったとき、「一覧リストボックス」に「氏名」を表示させるコードは、リスト1になる。UserForm_Activateイベント内に記述する。
Option Explicit Private Sub UserForm_Activate() Dim i As Integer For i = 3 To 11 一覧リストボックス.AddItem (Cells(i, 2)) Next End Sub
3行目でInteger型変数「i」を宣言し、4〜6行目では「i」が3〜11の間処理を繰り返す。この数値はセルの「行番号」に該当する。繰り返す過程の5行目で、「一覧リストボックス」に、AddItemメソッドで「Cells(行番号,列番号)」を使って、B列(2列目)の3〜11行目の内容を取得し追加していく。
次にVBE(Visual Basic Editor)のメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト2)
Option Explicit Sub フォームの表示() UserForm1.Show vbModeless End Sub
ShowメソッドでUserForm1をモードレスで表示する。
このリスト2のコードを、図1の「フォームを表示」ボタンに関連付け、実行した結果が図3だ。
リストボックスのデータを削除するRemoveItemメソッド
図1に、「削除フォーム表示」というボタンを追加しておく(図4)。
次に、今までに解説した手順でユーザーフォームを作成する。UserForm2のCaptionプロパティに、「選択した氏名の削除フォーム」と指定しておく。
ユーザーフォーム上には、リストボックスを1個と「ボタン」を1個配置しておく。氏名の一覧を表示させるリストボックスのオブジェクト名は「一覧リストボックス」としておく。
もう一つの「ボタン」のオブジェクト名は、「削除ボタン」とし、プロパティから「Caption」に「削除」と指定して、ボタン表面の文字を「削除」としておく。また「Enabled」プロパティに「False」を指定して、初期の状態では使用不可としておく。
コントロールを配置すると図5のようになる。
リストボックスのデータを削除する書式
{オブジェクト}.RemoveItem {index}
{オブジェクト}には、リストボックスブジェクトを指定する。RemoveItemメソッドを使って、選択した項目を削除する。{index}には、リストボックスから選択されたインデックス番号を指定する。
まず、ユーザーフォームがアクティブになったときの処理を記述するコードは、リスト1と同じなので省略する。リスト1を参照してほしい。
また、Integer型「プライベートモジュールレベル」変数の、「氏名インデックス」を宣言しておく。
Dim 氏名インデックス As Integer
リストボックスの値が選択されたときコードを解説してする(リスト3)。
Private Sub 一覧リストボックス_Change() 削除ボタン.Enabled = True 氏名インデックス = 一覧リストボックス.ListIndex End Sub
2行目で「削除」ボタンの使用を可能にし、3行目でプライベートモジュールレベル変数「氏名インデックス」に「一覧リストボックス」より選択されたインデックス番号を格納する。
次に、「削除」ボタンがクリックされたときのコードはリスト4になる。削除ボタン_Clickイベント内に記述する。
Private Sub 削除ボタン_Click() Dim 確認 As Integer If 氏名インデックス < 0 Then MsgBox "削除する氏名が選択されておりません。" Exit Sub Else 確認 = MsgBox("削除しますか", vbYesNo, "削除確認") Select Case 確認 Case vbYes 一覧リストボックス.RemoveItem 氏名インデックス Cells(氏名インデックス + 3, 2).Delete Case Else Exit Sub End Select End If End Sub
まず2行目でInteger型の変数「確認」を宣言する。3行目では、もし「氏名インデックス」に格納されている「一覧リストボックス」より選択したインデックス番号が、「0」より小さいかどうか判定している。小さい場合、つまり「氏名」が選択されていない場合は、警告メッセージを発して処理を抜ける。それ以外は7行目以下の処理を行う。
7行目では、「MsgBox」関数で、削除確認のメッセージを表示する。変数「確認」に格納された戻り値で、8行目以降Select Case文を使って条件分岐を行う。
9行目のように「確認」の値が、「vbYes」であった場合、つまり「はい」が選択された場合は、RemoveItemで選択された氏名を、「一覧リストボックス」から削除する(10行目)。
同時に11行目では、Excelシートのデータも削除する。「氏名インデックス」に「3」を加算しているのは、「氏名インデックス」には、「一覧リストボックス」より選択したインデックス番号が格納され、そのインデックス番号は「0」から始まり、Excelシート上の、「3行目」からを削除対象にするため、「3」を加算している。
実行結果は図6の通りだ。
Excelシート上のデータも同期する
今回は、リストボックスにデータを追加する方法と、リストボックスのデータを削除する方法の2つのTipsを紹介し、リストボックスコントロールの使い方を解説した。
リストボックスのデータを削除するTipsでは、リストボックスに表示されているデータと同時に、Excelシート上のデータも削除している。フォームを使ってデータを処理する場合は、単にフォームのデータを削除しただけで、元となるExcelシートのデータが残っていたのでは、大問題となる。ここは必ず元のExcelシートのデータも削除する必要がある。その意味でも今回紹介したTipsは、役に立つのではないかと思う。
読者の皆さんが、自分なりにアレンジして、ぜひ日常の業務にも取り入れてもらいたい。
著者プロフィール
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - [Esc]キーによるExcel VBAの実行中断を防止する
ExcelではVBA(Visual Basic for Applications)によってさまざまな処理を自動的に実行できる。しかし、VBAの実行中にユーザーが[Esc]キーあるいは[Ctrl]+[Break]キーを押すと、自動処理が止まってしまう。止めたくない場合は、Application.EnableCancelKeyプロパティの設定を変更する。 - Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel