即効テクニック |
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