連載
» 2014年12月02日 16時30分 UPDATE

VBA/マクロ便利Tips:Excelリストボックス操作の基本、データ追加・表示と削除

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、リストボックスにデータを追加するAddItemメソッドやリストボックスのデータを削除するRemoveItemメソッドの使い方を解説します。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回はリストボックスコントロールの使い方として、「リストボックスにデータを追加して表示する方法」と、「リストボックスのデータを削除する方法」という2つの基本的なTipsを紹介する。

 これらは2つとも、リストボックスを扱う上では、最も基本となる処理だ。コード自体は簡単なので、よく覚えておいていただきたい。

リストボックスにデータを追加するAddItemメソッド

 まずは、リストボックスにデータを追加するTipsから解説しよう。Excelシート上にTips「Excelテキストボックスのフォーカス移動を使って複数選択状態にしたり検索したりする」と同じように、図1のようなデータと「フォームを表示」ボタンを作成しておく。

ExcelVBA5TipsForm_01.png 図1 データと「フォームを表示」ボタンを配置

 次に、ユーザーフォームを作成し、UserForm1のCaptionプロパティに、「リストボックスにデータを表示」と指定しておく。ユーザーフォーム上には、リストボックスを1個、図2のように配置する。プロパティから、リストボックスの「オブジェクト名」には、「一覧リストボックス」と指定しておく。

ExcelVBA5TipsForm_02.png 図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
リスト1 「一覧リストボックス」に「氏名」を追加表示するコード

 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
リスト2 「フォーム」を表示するコード

 ShowメソッドでUserForm1をモードレスで表示する。

 このリスト2のコードを、図1の「フォームを表示」ボタンに関連付け、実行した結果が図3だ。

ExcelVBA5TipsForm_03.png 図3 フォームがアクティブになると、「一覧リストボックス」に、Excelシート上の「氏名」が追加表示される

リストボックスのデータを削除するRemoveItemメソッド

 図1に、「削除フォーム表示」というボタンを追加しておく(図4)。

ExcelVBA5TipsForm_04.png 図4 「削除フォーム表示」というボタンを追加

 次に、今までに解説した手順でユーザーフォームを作成する。UserForm2のCaptionプロパティに、「選択した氏名の削除フォーム」と指定しておく。

 ユーザーフォーム上には、リストボックスを1個と「ボタン」を1個配置しておく。氏名の一覧を表示させるリストボックスのオブジェクト名は「一覧リストボックス」としておく。

 もう一つの「ボタン」のオブジェクト名は、「削除ボタン」とし、プロパティから「Caption」に「削除」と指定して、ボタン表面の文字を「削除」としておく。また「Enabled」プロパティに「False」を指定して、初期の状態では使用不可としておく。

 コントロールを配置すると図5のようになる。

ExcelVBA5TipsForm_05.png 図5 各コントロールを配置した

リストボックスのデータを削除する書式

{オブジェクト}.RemoveItem {index}


 {オブジェクト}には、リストボックスブジェクトを指定する。RemoveItemメソッドを使って、選択した項目を削除する。{index}には、リストボックスから選択されたインデックス番号を指定する。

 まず、ユーザーフォームがアクティブになったときの処理を記述するコードは、リスト1と同じなので省略する。リスト1を参照してほしい。

 また、Integer型「プライベートモジュールレベル」変数の、「氏名インデックス」を宣言しておく。

Dim 氏名インデックス As Integer

 リストボックスの値が選択されたときコードを解説してする(リスト3)。

Private Sub 一覧リストボックス_Change()
  削除ボタン.Enabled = True
  氏名インデックス = 一覧リストボックス.ListIndex
End Sub
リスト3 「一覧リストボックス」内の「氏名」が選択されたときの処理

 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
リスト4 「削除」ボタンがクリックされたときのコード

 まず2行目でInteger型の変数「確認」を宣言する。3行目では、もし「氏名インデックス」に格納されている「一覧リストボックス」より選択したインデックス番号が、「0」より小さいかどうか判定している。小さい場合、つまり「氏名」が選択されていない場合は、警告メッセージを発して処理を抜ける。それ以外は7行目以下の処理を行う。

 7行目では、「MsgBox」関数で、削除確認のメッセージを表示する。変数「確認」に格納された戻り値で、8行目以降Select Case文を使って条件分岐を行う。

 9行目のように「確認」の値が、「vbYes」であった場合、つまり「はい」が選択された場合は、RemoveItemで選択された氏名を、「一覧リストボックス」から削除する(10行目)。

 同時に11行目では、Excelシートのデータも削除する。「氏名インデックス」に「3」を加算しているのは、「氏名インデックス」には、「一覧リストボックス」より選択したインデックス番号が格納され、そのインデックス番号は「0」から始まり、Excelシート上の、「3行目」からを削除対象にするため、「3」を加算している。

 実行結果は図6の通りだ。

ExcelVBA5TipsForm_06.png 図6 「一覧リストボックス」で選択した「氏名」が削除され、同時にExcelシート上の「氏名」も削除される

Excelシート上のデータも同期する

 今回は、リストボックスにデータを追加する方法と、リストボックスのデータを削除する方法の2つのTipsを紹介し、リストボックスコントロールの使い方を解説した。

 リストボックスのデータを削除するTipsでは、リストボックスに表示されているデータと同時に、Excelシート上のデータも削除している。フォームを使ってデータを処理する場合は、単にフォームのデータを削除しただけで、元となるExcelシートのデータが残っていたのでは、大問題となる。ここは必ず元のExcelシートのデータも削除する必要がある。その意味でも今回紹介したTipsは、役に立つのではないかと思う。

 読者の皆さんが、自分なりにアレンジして、ぜひ日常の業務にも取り入れてもらいたい。

著者プロフィール

kuniyasu.jpg

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。