こんばんは。
リストボックスでのマルチセレクトで選択した項目を削除する
方法で悩んでいます。
(リストボックスで3項目選択したとして、この3項目を削除する方法)
解答は現在勉強している本に掲載されているのですが意味が分からず。
解答のコードの方にはリストを後ろから削除しているみたいなのですが、
前から削除しても大丈夫だと思いやってみましたが、エラーが出てしまいます。
解説には、先頭から削除するとその時点でリストのインデックス値がずれて
しまう。と書いてあるのですが、後ろから削除しても一緒だと考えこんでいます。
解答コード
**********************************************************
Private Sub Command2_Click()
Dim i As Integer
'選択状態(Selected=true)の項目だけ削除
For i = List1.ListCount - 1 To 0 Step -1
If List1.Selected(i) = True Then
List1.RemoveItem i
End If
Next i
End Sub
*********************************************************
と言う解答コードを自分は、前から削除するように
自分なりのコード
*********************************************************
Private Sub Command2_Click()
Dim i As Integer
For i = 0 To listcount-1
If List1.Selected(i) = True Then
List1.RemoveItem i
End If
Next i
End Sub
*************************************************************
で作成してみましたが、やっぱりエラーが。
なぜ、前から削除するとエラーになってしまうのか、
もう少し具体的に教えてくれると助かります。
よろしくお願いします。m(__)m
No.5ベストアンサー
- 回答日時:
こんにちわ。
コードの処理に沿って順番に説明しますね。
リストの内容はA~Eの5個あり、BとDを選択した状態だとします。
*リストの内容**
1|A
2|B ←選択
3|C
4|D ←選択
5|E
**************
これを解答コードのように後ろから削除する場合、5から1まで繰り返し判定するわけですが、
1回目(5):Eは選択されていませんので何もしません。
2回目(4):Dが選択されているので削除します。
*リストの内容**
1|A
2|B ←選択
3|C
4|E
**************
3回目(3):Cは選択されていませんので何もしません。
4回目(2):Bが選択されているので削除します。
*リストの内容**
1|A
2|C
3|E
**************
5回目(1):Aは選択されていませんので何もしません。
結果、以下のようなリストになり正常に動作します。
*リストの内容**
1|A
2|C
3|E
**************
同じ様にmineral01さんのコードのように前から削除する場合、
1回目(1):Aは選択されていませんので何もしません。
2回目(2):Bが選択されているので削除します。
*リストの内容**
1|A
2|C
3|D ←選択
4|E
**************
3回目(3):Dが選択されているので削除します。
(この時点でインデックスがずれているためCの判定が飛ばされてしまいます。)
*リストの内容**
1|A
2|C
3|E
**************
4回目(4):4番目の要素が無いためエラーになります。
この段階ではもうリストの内容が3つしかないために、4番目の内容を取得しようとするとインデックスエラーとなってしまいます。
どうしても前から削除したい場合は、以下のコードで大丈夫だと思います。
mineral01さんのコードに追記してみました。
*********************************************************
Private Sub Command2_Click()
Dim i As Integer
For i = 0 To List1.listcount - 1
If List1.Selected(i) = True Then
List1.RemoveItem i
i = i - 1
End If
If i >= List1.ListCount - 1 Then
Exit For
End If
Next i
End Sub
*************************************************************
長文なってしまい、申し訳無いです。参考になれれば幸いです。
hersheさん、とても理解しやすい説明ありがとうございます。
おかげさまで理解できました。
リストを前から、判定してしまうと、
インデックス値(iの値)がずれてしまったために
判定処理が飛ばされてしまうんですね。
リストに最後の値がないにもかかわらず、リストの内容を取得しようとして
いるためにエラーが出ることがとても理解できました。
後ろから判定をすると全ての値を効率よく(インデックス値をずらすことなく)、
判定できるんですね。
また、前からの処理での削除方法ありがとうございます。
本当に勉強になりました。
iの値を引いてあげる点と、現時点でのインデックス値(iの値)を判定して
あげる処理がポイントだと分かりました。
本当に、分かりやすい説明ありがとうございました。m(__)m
No.4
- 回答日時:
BlueRayです。
少しばかり追加解説です。ダルマA
順|○|
1|A|
2|B|
3|C|
4|D|
5|E|
リストの順番は、下から1,2,3,4,5です。
そして、ダルマが一番最後を表しています。
No.3
- 回答日時:
ダルマ落しで表現しますね。
○をダルマでと思ってください(^^;ダルマA ダルマB
順|○| 順|○|
1|A| 5|A|
2|B| 4|B|
3|C| 3|C|
4|D| 2|D|
5|E| 1|E|
解答コードがダルマAで、mineral01さんのコードがダルマBです。
順と書いてある通りに崩していきます。
では、参考までに1番目を崩してみましょう。
ダルマA ダルマB
順 順
1|○| 5|○|
2|B| 4|A|
3|C| 3|B|
4|D| 2|C|
5|E| 1|D|
次に2番目を崩してみましょう。
ダルマA ダルマB
順 順
1 5
2|○| 4|○|
3|C| 3|A|
4|D| 2|B|
5|E| 1|D|
以下5番目まで崩して、ダルマを一番下に落とすことが出来るのはどちらですか。
明らかにダルマAですね。ダルマBは4回目で何も出来ないですね。
連続項目削除は、この様に最後までダルマを落とせる様にしなくてはいけないんです。
わかりにくかったら、補足してください。ではでは。
説明ありがとうございます。
皆様の説明で、理解するとことができました。
かなり悩んでいたので、本当に助かりました。
ありがとうございます。
No.2
- 回答日時:
こんにちは。
maruru01です。リストを1つ削除すると、その度にそれより後ろ(Indexが大きいもの)のIndexが変更(1つずつ繰り上がる)されてしまうからです。
前(Indexの小さい方)から削除すると、後ろの削除対象のリストのIndexが変更(1つ繰り上がる)されるので、選択したものと別のものを削除したり、エラーになったりします。
後ろ(Indexの大きい方)から削除すれば、その後ろのIndexが変更されても構わないわけです。(削除対象が前(Indexが小さい方)にしかないので。)
では。
後ろから削除することによって、削除対象が小さい方にしかないので、
全て効率よく(index値をずれなくして)削除できるんですね。
また、後ろからだと比較したインデックスが変更されても大丈夫と言うことが
分かりました。
説明、本当にありがとうございました。m(__)m
No.1
- 回答日時:
下記の「繰り上がりがあるときの」ロジックを考えてみられては。
下記(2)の下からの繰り上がりを考えに入れてないのでは。(下記でdeleteとかA(i)としているのは仮想の表現で、リストの場合RemoveItemです。セルの削除等の場合も念頭に入れているため)
5つアイテムがあったとして、
(1)後ろ(下と言いますか)から、3つ削除するときは、
上から5番目削除、次に上から4番目削除、次に上から3番目削除・・となります。iは5,4,3・・・です。
for i=5 to 3 step -1
a(i).delete
next i
(2)先(上と言いますか)から、3つ削除する時は、
まず上から1番目削除、「下から繰り上がってくるので」、2番が1番に繰り上がってくるので、次も1番を削除すればよい。次も同じ。
for i=1 to 3
a(1).delete
next i
説明ありがとうございました。
プログラミングの奥の深さを新ためて実感しました。
まだまだ、勉強不足です。
本当にありがとうございました。m(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) リストボックスに表示されたファイルを削除したい 1 2023/04/19 12:02
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBA 行削除した連番 4 2023/06/27 16:00
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
リストボックスで項目を選択し、データを削除・・・
Visual Basic(VBA)
-
リストボックスの選択解除
Visual Basic(VBA)
-
VBAで空白行を削除する
Excel(エクセル)
-
-
4
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
5
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
6
リストボックスをクリックすると、他フォームに値代入
Excel(エクセル)
-
7
別のシートから値を取得するとき
Visual Basic(VBA)
-
8
リストボックスの項目削除
その他(プログラミング・Web制作)
-
9
ListBoxで改行したい
Visual Basic(VBA)
-
10
【エクセル】シート内の表をUserFormに画像として表示させる方法
Excel(エクセル)
-
11
エクセルVBA「リストボックスで選択した値をテキストボックスで変更してシート上セルに反映したい」
Excel(エクセル)
-
12
エクセルVBAリストボックスに表示された検索結果をクリックして、該当するセルをアクティブセルにしたい
Excel(エクセル)
-
13
VBA リストボックスをダブルクリックしデータを修正したいのですが…。
Visual Basic(VBA)
-
14
AccessからExcelのファイルを起動する
その他(データベース)
-
15
ラベル内の文字(Caption)を縦表示にする方法
Visual Basic(VBA)
-
16
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
17
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
18
フォントの大きさ
Visual Basic(VBA)
-
19
[エクセルVBA] コンボボックスのリストの更新方法について
Excel(エクセル)
-
20
複数のtextboxの処理を一括で行えませんか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
特定のプロジェクトを削除するには
-
iPOD shuffle 曲の削除
-
iPhone7でドコモメール設定をし...
-
OKボタンが押せない
-
Windows VistaでCDからSDカード...
-
「K」のみのグレーと「K」を使...
-
PDFファイル印刷時、URLをフッ...
-
Word 2010で画面に2ページ並ん...
-
パワーポイントのプレゼンで
-
一太郎で封筒の宛名印刷したい...
-
フォトシショップのトンボの入れ方
-
bilibiliという動画サイトの動...
-
エクセルでPDFにB4サイズ...
-
一枚に裏表を印刷したい。
-
PCA会計
-
インターネット授業が始まり、...
-
Microsoft Office Visioの印刷...
-
PDFファイルを順番通りに印刷す...
-
PDFの一部のページを削除する方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
特定のプロジェクトを削除するには
-
リストボックスでの選択項目分...
-
メルカリに関しての質問です。 ...
-
ODBCの自動登録について
-
Excelで行挿入イベントをハンド...
-
行を削除する時に警告したい
-
MP3プレーヤーに書き込んだ曲を...
-
エクセルのVBAについて
-
Bamboo DockがDockから消えません
-
エクセルの編集(行間隔を一度...
-
SONY製RDR-HX50での「まる録の...
-
Word : ページ削除の仕方
-
Excelのチェックボックスの消...
-
Windows Mailで、アドレス帳の...
-
Wordで選択領域のバックスペー...
-
EXCEL2007で、挿入したチェック...
-
iPOD shuffle 曲の削除
-
FOMAカードの電話帳の削除の仕方
-
MSN Hotmailアドレスの削除
おすすめ情報