目次
はじめに
ユーザーフォームのリストボックスにシートの表を表示した後、「特定の列の数値を3桁のゼロ埋めにしたい」「商品名の後ろに特定の文字列を追加したい」といったように、表示されている内容を整形・加工したい場合があります。
一度リストボックスに読み込んだデータを、VBAコードを使って直接書き換えることが可能です。これにより、元のシートのデータを変更することなく、フォーム上での見た目だけを分かりやすく調整することができます。
この記事では、リストボックスの項目をループ処理で一つずつ取得し、表示されている値を直接変更(再フォーマット)するための、実用的なテクニックを解説します。
リストボックスの値を変更するVBAサンプルコード
このマクロは、「フォーマット実行」ボタンがクリックされたときに、DataTableBox
という名前のリストボックスに表示されている内容を整形します。
- 1列目(ID): 4桁のゼロ埋めにする (例:
12
→0012
) - 2列目(項目名): 末尾に
【済】
を追加する - 3列目(数量): 3桁区切りのカンマを追加する (例:
1500
→1,500
)
ユーザーフォームのコード
' 「フォーマット実行」ボタン(FormatButton)がクリックされたときの処理
Private Sub FormatButton_Click()
'== 変数を定義します ==
Dim i As Long
' Withブロックで対象のリストボックス(DataTableBox)を明示
With Me.DataTableBox
'== リストの全行をループ処理(0行目はヘッダーと想定し、1行目から開始) ==
For i = 1 To .ListCount - 1
'--- 1列目(インデックス=0)の値をゼロ埋め4桁にフォーマット ---
.List(i, 0) = Format(.List(i, 0), "0000")
'--- 2列目(インデックス=1)の値に文字列を追加 ---
.List(i, 1) = .List(i, 1) & "【済】"
'--- 3列目(インデックス=2)の値を桁区切りにフォーマット ---
.List(i, 2) = Format(.List(i, 2), "#,##0")
Next i
End With
MsgBox "リストの表示をフォーマットしました。", vbInformation
End Sub
コードの解説
For i = 1 To .ListCount - 1
この For
ループが、リストボックスの項目を順番に処理するための基本構造です。
.ListCount
: リストボックスの総行数を返します。i = 1 To ...
: リストのインデックスは0から始まりますが、ここでは1行目(インデックス0
)が見出し行であると仮定し、2行目(インデックス1
)から処理を開始しています。もし見出し行がなければi = 0 To .ListCount - 1
とします。
.List(i, 0) = Format(...)
この一行が、リストの値を直接書き換える核心部分です。
.List(i, 0)
: 左辺と右辺の両方で使われています。- 右辺の
.List(i, 0)
は、現在の値(例:12
)を取得するために使われます。 - 左辺の
.List(i, 0)
は、フォーマット後の新しい値(例:"0012"
)を**代入(設定)**するために使われます。
- 右辺の
Format(...)
: VBAのFormat
関数は、数値や日付を指定した書式の文字列に変換します。"0000"
: 4桁のゼロ埋め。"#,##0"
: 3桁ごとのカンマ区切り。
このように、For
ループと .List(行, 列)
プロパティを組み合わせることで、リストボックス内のデータを自在に操作することができます。
まとめ
今回は、ユーザーフォームのリストボックスに表示されている内容を、後からVBAで変更する方法を解説しました。
.ListCount
プロパティでリストの行数を取得し、ループの回数を決める。.List(行インデックス, 列インデックス)
プロパティを使って、特定のセルの値を取得したり、新しい値を設定したりできる。Format
関数を組み合わせることで、数値や日付の表示形式を整えることができる。
このテクニックは、シート上の元データはそのままに、フォーム上の表示だけをユーザーにとって見やすい形に整えたい場合に非常に有効です。