HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > リストボックスのデータを移動する

即効テクニック

ユーザーフォーム関連のテクニック

リストボックスのデータを移動する

(Excel 97/2000/2002/2003/2007)
UserFormにリストボックスを配置します。
UserFormのInitializeイベントに次のコードを記述すると、"Sample1"から"Sample10"までのデータが登録されます。

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 10
        ListBox1.AddItem "Sample" & i
    Next i
End Sub
このように登録されたリストボックスのデータを、上下に移動してみましょう。  : Sample3 Sample4 ← 選択されているデータ Sample5  : 上記のように選択されている"Sample4"を、  : Sample4 ← 移動したデータ Sample3 Sample5  : のように、1つ上の"Sample3"と入れ替えるには、次のようなステップで考えます。 (1)現在選択されている位置を記憶する(仮にnとする) (2)現在選択されているデータを記憶する(仮に"Sample4"とする) (3)現在選択されている位置(n)のデータを削除する (4)1つ上の位置(n-1)にデータ("Sample4")を追加する ここでは、コマンドボタン(CommandButton1)がクリックされたときに移動してみます。
Private Sub CommandButton1_Click()
    Dim n As Long, buf As String
    n = ListBox1.ListIndex        ''(1)現在選択されている位置を記憶する
    buf = ListBox1.List(n)        ''(2)現在選択されているデータを記憶する
    ListBox1.RemoveItem n         ''(3)現在選択されている位置のデータを削除する
    ListBox1.AddItem buf, n - 1   ''(4)1つ上の位置にデータを追加する
End Sub
これで選択したデータを1つ上に移動できました。 移動はできましたが、少し見栄えが変です。移動した後に、1つ下のデータが選択状態になってしまいます。 これは、選択したデータを削除したためです。 そこで最後に、挿入したデータが選択された状態にしてやります。
Private Sub CommandButton1_Click()
    Dim n As Long, buf As String
    n = ListBox1.ListIndex        ''(1)現在選択されている位置を記憶する
    buf = ListBox1.List(n)        ''(2)現在選択されているデータを記憶する
    ListBox1.RemoveItem n         ''(3)現在選択されている位置のデータを削除する
    ListBox1.AddItem buf, n - 1   ''(4)1つ上の位置にデータを追加する
    ListBox1.ListIndex = n - 1    ''挿入したデータを選択する
End Sub
実は、まだ完成とはいえません。 一般的に、リストボックス最上部(先頭)のデータは、それより上に移動できません。 上記のマクロでは、最上部のデータも移動しようとしてエラーになります。 選択されているデータの位置が最上部かどうかを判定して、もし最上部だったら処理を中止するようにしておきましょう。
Private Sub CommandButton1_Click()
    Dim n As Long, buf As String
    n = ListBox1.ListIndex        ''(1)現在選択されている位置を記憶する
    If n = 0 Then Exit Sub        ''選択されているのが最上部なら終了
    buf = ListBox1.List(n)        ''(2)現在選択されているデータを記憶する
    ListBox1.RemoveItem n         ''(3)現在選択されている位置のデータを削除する
    ListBox1.AddItem buf, n - 1   ''(4)1つ上の位置にデータを追加する
    ListBox1.ListIndex = n - 1    ''挿入したデータを選択する
End Sub
同じ考え方で、選択したデータを1つ下に移動することもできます。 ポイントは、選択されているデータが最下部(最後)かどうかを判定することです。
Private Sub CommandButton2_Click()
    Dim n As Long, buf As String
    n = ListBox1.ListIndex
    If n = ListBox1.ListCount - 1 Then Exit Sub
    buf = ListBox1.List(n)
    ListBox1.RemoveItem n
    ListBox1.AddItem buf, n + 1
    ListBox1.ListIndex = n + 1
End Sub