リスト間のアイテム移動について

このQ&Aのポイント
  • 左のリストボックスから右のリストボックスへのアイテム移動について問題が発生しています。
  • アイテムを複数同時に選択すると違うアイテムが移動したりすべてのアイテムが移動してしまう問題があります。
  • 現在のコードでは指定した動作がうまく実行されず、解決策を探しています。
回答を見る
  • ベストアンサー

リスト間のアイテム移動について

現在独学でhttp://www4.plala.or.jp/tamo/vb/vb99.htmlの問題の10番を解いてるのですが、どうしてもうまくいきません。 左のリストボックスから右のリストボックスへの1つ1つのアイテム移動はできたのですが、アイテムを複数同時に選択すると違うアイテムが移動したりすべてのアイテムが移動してしまいます。 今のコードは Private Sub Command1_Click() For i = List1.ListCount To 1 Step -1 If List1.Selected(i - 1) = True Then List2.AddItem List1.Text List1.RemoveItem List1.ListIndex End If Next End Sub Private Sub Form_Load() With List1 .AddItem "FreeBSD" .AddItem "Linux" .AddItem "Macintosh" .AddItem "MS-DOS" .AddItem "Slaris" .AddItem "Windows 95" .AddItem "Windows CE" .AddItem "Windows NT" End With End Sub このように指定しています。 解決法がありましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

VB6で開発なのでしょうか? # 開発環境の情報も質問に盛り込みましょう であるなら リストボックスのItemDataを使って順序の制御をすることになりそうです 登録時に Private Sub Form_Load() With List1   .AddItem "FreeBSD"   .AddItem "Linux"   .AddItem "Macintosh"   .AddItem "MS-DOS"   .AddItem "Slaris"   .AddItem "Windows 95"   .AddItem "Windows CE"   .AddItem "Windows NT"   for n = 0 to .ListCount-1     .ItemData(n) = n   next End With としておきます リストの移動時に Private Sub Command1_Click()   dim m as Integer   m = 0   For i = List1.ListCount - 1 to 0 step - 1     If List1.Selected(i) = True Then       if list2.ListCount > 0 then         for m = 0 to List2.ListCount-1           ' ここで ItemData比較する           if list2.itemData(m) > list1.ItemData(i) then             exit for           end if         next       end if       ' 挿入位置が mに求められている       list2.additem List1.List(i), m       list2.ItemData(m) = List1.ItemData(i)       List1.RemoveItem i     End If   next End Sub といった具合でしょう VB.NET2002以降の場合は別途対応が必要です

rafa94420
質問者

お礼

失礼しました 開発環境はVB6.0になります redfox63さんのおかげで無事動作しました 本当にありがとうございました

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ListBoxのListコレクションは0ベースになります つまり "FreeBSD"   ... 0 "Linux"    ... 1 "Macintosh"  ... 2 "MS-DOS"   ... 3 "Slaris"   ... 4 "Windows 95" ... 5 "Windows CE" ... 6 "Windows NT" ... 7 といった具合になります List1からList2へ移すのは List2.AddItem List1.List( i - 1 ) List1から移動した項目を削除するのは List1.RemoveItem i - 1 といった具合です 毎回 i-1 を引数に与えるより for i = List1.ListCount - 1 to 0 Step -1   if List1.Selected( i ) then     List2.AddItem List1.List(i)     List1.RemoveItem i   end if next とすることもあります

rafa94420
質問者

お礼

なるほど。 おかげでうまく動作させることができました! しかし右のリストにアイテムが移動した時に左のリストの並びとの上下が逆になってしまうのですが、これはどう対応したらよろしいのでしょうか・・・

関連するQ&A

  • リスト間のアイテム移動について - VBAで

    http://okwave.jp/qa/q4903870.html を読んで、No.2の回答にあるようなコードをExcel2000のVBAで組みたいと思いました。VBではitemdataというプロパティがありましたがVBAではなかったようで、かわりにListプロパティなどを使ってみましたが、うまくいきません。アドバイスをお願いできますでしょうか? VBでの元のコードは以下のとおりです。 Private Sub Form_Load() With List1   .AddItem "FreeBSD"   .AddItem "Linux"   .AddItem "Macintosh"   .AddItem "MS-DOS"   .AddItem "Slaris"   .AddItem "Windows 95"   .AddItem "Windows CE"   .AddItem "Windows NT"   for n = 0 to .ListCount-1     .ItemData(n) = n   next End With としておきます リストの移動時に Private Sub Command1_Click()   dim m as Integer   m = 0   For i = List1.ListCount - 1 to 0 step - 1     If List1.Selected(i) = True Then       if list2.ListCount > 0 then         for m = 0 to List2.ListCount-1           ' ここで ItemData比較する           if list2.itemData(m) > list1.ItemData(i) then             exit for           end if         next       end if       ' 挿入位置が mに求められている       list2.additem List1.List(i), m       list2.ItemData(m) = List1.ItemData(i)       List1.RemoveItem i     End If   next End Sub

  • リストボックスから削除、「いいえ」でも削除される

    Windows7 Excel2007でマクロ作成中の初心者です。 リストボックスから、シート(顧客名)を選んで削除するマクロです。 削除がうまくいくのですが、「いいえボタン」を押しても シートが削除されてしまいます。どう修正したらよろしいでしょうか。 Private Sub 顧客削除_Click() Dim i As Integer Dim btn Dim name As String With 顧客リスト For i = 0 To .ListCount - 1 If .Selected(i) Then name = .list(i) '選択されたリストを変数に格納 btn = MsgBox("本当に、 " & name & " さんを削除していいですか?", _ vbYesNo, "削除の確認") End If Next i Application.DisplayAlerts = False Worksheets(Mid(.list(.ListIndex - 0), InStr(.list(.ListIndex - 0), " ") + 1)).Delete Application.DisplayAlerts = True '顧客リスト.RemoveItem (顧客リスト.ListIndex) '顧客リスト.ListIndex = -1 リストボックスの項目削除 Worksheets(1).Activate End With If btn = vbYesNo Then Exit Sub End If ActiveWorkbook.Save End Sub ----------------------------------------------- Sub リストボックスの項目削除() Dim i As Integer For i = 顧客リスト.ListCount - 1 To 0 Step -1 If 顧客リスト.Selected(i) Then 顧客リスト.RemoveItem (i) Exit For End If Next i End Sub

  • エクセルVBA ユーザーフォームのリストボックス

    エクセルVBAのユーザーフォームのリストボックスについて教えてください。 現在、以下のようにコードがされています。 Private Sub UserForm_Initialize() With UserForm.ListBox1 .AddItem "ABC" .AddItem "DEF" .AddItem "GHI" .ListIndex = 0 End With End Sub Private Sub ListBox1_Click() With ListBox2 .Clear Select Case UserForm.ListBox1.List(ListBox1.ListIndex) Case "ABC" .AddItem "123" .AddItem "456" .AddItem "789" Case "DEF" .AddItem "456" .AddItem "789" Case "GHI" .AddItem "789" End Select .ListIndex = 0 End With End Sub それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。 よろしくお願いします。

  • リストボックス

    すいません以下の処理に困っております。 リストボックスで値を取得して他のリストボックスにその値を 出力したいのですがまったくできません。 <例> リストボックス1 a b c リストボックス2(上で選択した値を出力) a ちなみに構文は、 ------------------------------------------------------------ Private Sub btn選択_Click() ListBox2.Text = ListBox1.Text 'ListBox1.ListIndex + 1 & ": " & ListBox1.Text End Sub Private Sub CommandButton1_Click() End Sub Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) btn選択_Click End Sub Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) btn選択_Click End Sub Private Sub UserForm_Initialize() With ListBox1 .AddItem "スケジューラ" .AddItem "データ変換" .AddItem "DWH Server" .AddItem "PPP Server" .AddItem "ファイヤーウォール" .AddItem "暗号オプション" End With End Sub ---------------------------------------------------- 初心者でまったくできません。 御教授をお願いします。

  • リストボックスからシート削除のマクロを合体したい

    Windows7 Excel2007でマクロ作成中の初心者です。 やりたいことは、リストボックスからシートを選択し、そのシートを削除する。 削除したら、リストボックスの中の、シート選択状態を解除し、その項目だけを 削除することです。 以下のコードで出来たのですが、これを統合して一個のコードにしたいです。 どうしたらよろしいでしょうか。 Private Sub 顧客削除_Click() Dim i As Integer Dim btn Dim name As String With 顧客リスト For i = 0 To .ListCount - 1 If .Selected(i) Then name = .list(i) '選択されたリストを変数に格納 btn = MsgBox("本当に、 " & name & " さんを削除していいですか?", _ vbYesNo, "削除の確認") If btn = vbYes Then Application.DisplayAlerts = False Worksheets(Mid(.list(.ListIndex - 0), InStr(.list(.ListIndex - 0), " ") + 1)).Delete Application.DisplayAlerts = True リストボックスの項目削除 End If End If Next i Worksheets(1).Activate End With ActiveWorkbook.Save Application.ScreenUpdating = True End Sub ----------------------------- Sub リストボックスの項目削除() Dim i As Integer For i = 顧客リスト.ListCount - 1 To 0 Step -1 If 顧客リスト.Selected(i) Then 顧客リスト.RemoveItem (i) Exit For End If Next i End Sub

  • リストボックスの内容を検索したいが...

    エクセル2019を使っています。 添付画像のようにユーザーフォームにテキストボックスとリストボックスを作り、テキストボックスに入力した文字でリストボックスの内容を検索しようとコードを作成しました。 Private Sub TextBox1_Change() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A1").AutoFilter 1, "*" & TextBox1.Value & "*" If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then Set rng = .Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible) Else Me.ListBox1.Clear Exit Sub End If End With Me.ListBox1.Clear With Me.ListBox1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With End Sub Private Sub UserForm_Initialize() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row Set rng = .Range("A2:A" & LastRow) End With With Me.ListBox1 .ColumnCount = 1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With ListBox1.ListIndex = 0 End Sub とりあえず検索はできるのですが、使用されていない文字や記号を入力したあとにバックスペースキーで入力した文字や記号を削除するとリストボックスの内容が意図した内容で表示されません。 どこを修正したらいいでしょうか。

  • リストボックスからシートを選びアクティブにしたい

    Excel2007でマクロ作成の初心者です。 リストボックスで選択した、リスト項目のワークシートを表示したいのですが、 「インデックスが有効範囲にありません」というエラーがでます。 どうしたらよろしいでしょうか? よろしくお願いします。 ’-------------------------------- Private Sub 顧客リスト_Click() With 顧客リスト Worksheets(.list(.ListIndex - 0)).Activate’----ここでエラー発生します End With End Sub ----------------------------- Private Sub UserForm_Initialize() Workbooks("請求.xls").Activate Dim i As Integer Const EXCEPT_NAME = "経理●一覧●基本●" For i = 1 To Worksheets.Count If InStr(EXCEPT_NAME, Worksheets(i).Name & "●") = 0 Then 顧客リスト.AddItem i & " " & Worksheets(i).Name End If Next i End Sub ’---------------------------

  • リストボックスから選択したシートを削除したい

    Excel2007でマクロ作成の初心者です。 リストボックスの選択項目のワークシートを削除したいのですが、 「インデックスが有効範囲にありません。」のエラーが発生し、 先に進めません。どうしたらよろしいでしょうか? ’--------------------- Private Sub 顧客削除_Click() Application.ScreenUpdating = False Unload Me Unload DS請求フォーム Dim i As Integer With 顧客リスト For i = 0 To .ListCount - 1 If .Selected(i) Then ' Worksheets(.list(.ListIndex)).Delete Worksheets(Split(.list(.ListIndex - 0), " ")(1)).Activate '←ここでエラー発生 ActiveSheet.Delete End If Next i End With MsgBox "選択の顧客を削除しました。" End Sub ’------------------------- Private Sub UserForm_Initialize() Workbooks("請求.xls").Activate Dim i As Integer Const EXCEPT_NAME = "経理●一覧●基本●" For i = 1 To Worksheets.Count If InStr(EXCEPT_NAME, Worksheets(i).Name & "●") = 0 Then 顧客リスト.AddItem i & " " & Worksheets(i).Name End If Next i End Sub ’----------------------

  • コンボボックスにリストが表示されません・・・

    ユーザーフォーム(UserForm)にコンボボックス(ComboBox1)を作ってリストを入れました。 しかしユーザーフォームを実行してもコンボボックスに何もリストが出てきません。 なにが悪いのでしょうか?チュートリアルどおりにやっているのですが・・・(T T) Private Sub UserForm_Initialize() With ComboBox1 .AddItem "東京" .AddItem "名古屋" .AddItem "福岡" End With End Sub Windows2000+Excel2000です。

  • リストボックスから項目を選択してセルに入力したいのです

    EXcel2003でマクロ作成中です。エクセルシートのN列を右クリックすると、ユーザーォームが現れ、その中のリストボックスから項目を選択すると選択文字が白色に反転します。 ユーザーホームの下方に設置した「入力する」ボタンをクリックする、アクティブセルにテキスト文字列が挿入されます。 Option Explicit Private Sub CommandButton1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub --------------------------- Private Sub CommandButton2_Click() Unload UserForm1 End Sub ------------------------------ これと同じものをB列につくりました。エクセルシートのB列を右クリックすると、リストボックスが表示されますが、その中の項目を選択しようとすると、一瞬にしてユーザーフォーム自体が消えてしまい項目を 選択できません。 Private Sub CommandButton1_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex) End If End With Unload UserForm2 End Sub ----------------------------- Private Sub CommandButton2_Click() Unload UserForm2 End Sub ------------------------------------------ まったく同じものを作って内容だけかえたのですが、できません。 どうしてでしょうか?ご教授おねがいします。

専門家に質問してみよう