こんばんは。
リストボックスでのマルチセレクトで選択した項目を削除する
方法で悩んでいます。
(リストボックスで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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと タイムマシンを破壊すべきか。
これはディベートの論題だと仮定したうえでの回答お願いします。あなたは、その末にタイムマシンを壊してしまうのか、使い道を探すのかどうかを考えてもらいたいです。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
リストボックスの選択解除
Visual Basic(VBA)
-
リストボックスで項目を選択し、データを削除・・・
Visual Basic(VBA)
-
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
-
4
ListViewで複数選択された項目を一度に削除する方法
Visual Basic(VBA)
-
5
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
6
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
7
ExcelVBA でリストリストボックスに列見出しをコーディングでつける
Excel(エクセル)
-
8
テキストボックスやラベルのクリア
Visual Basic(VBA)
-
9
エクセル ユーザーフォームにオートシェープ(図形)を貼り付けるこは可能なのでしょうか?
Excel(エクセル)
-
10
エクセルVBAでマルチページの切り替え方法の件で
Excel(エクセル)
-
11
ボタンの枠線の様なものを消したい
Visual Basic(VBA)
-
12
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
13
EXCEL リストボックスのRowSouce欄が表示されない
Excel(エクセル)
-
14
複数のtextboxの処理を一括で行えませんか?
Visual Basic(VBA)
-
15
リストボックスをクリックすると、他フォームに値代入
Excel(エクセル)
-
16
VBAで空白行を削除する
Excel(エクセル)
-
17
「選択範囲を解除してアクティブセルを選択」をマクロで行うにはどうすればよいでしょうか
Excel(エクセル)
-
18
入力済み、選択したセルに連動した行のデータをユーザーフォームで呼び出すには
Excel(エクセル)
-
19
エクセルで指定回数だけ別セルに繰り返す方法
Excel(エクセル)
-
20
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
リストボックスでの選択項目分...
-
特定のプロジェクトを削除するには
-
アドウェアの対処法で・・・
-
Excelで行挿入イベントをハンド...
-
PDFファイル印刷時、URLをフッ...
-
長いURLをうまく反転させる方法
-
フロッピーディスクが取り出せない
-
VBA=一定時間エクセルの入...
-
PDFファイルを印刷後、自動でフ...
-
bilibiliという動画サイトの動...
-
Teams会議の上のメニューが消え...
-
clibor について質問です。 ctr...
-
宛先に頭文字を入れると、メー...
-
Word 2010で画面に2ページ並ん...
-
PDFデータを印刷、複製、スクシ...
-
ワードのサイズ変更による文字...
-
pdf-xchange スタンプツールと...
-
IE-11 の全画面表示を通常表示...
-
OKボタンが押せない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onenoteでノートブックを削除出...
-
特定のプロジェクトを削除するには
-
Excelで行挿入イベントをハンド...
-
リストボックスでの選択項目分...
-
メールソフトBecky2の使い...
-
メルカリに関しての質問です。 ...
-
Excelのチェックボックスの消...
-
FOMAカードの電話帳の削除の仕方
-
Word : ページ削除の仕方
-
Bamboo DockがDockから消えません
-
シュレッダーという名のアイコ...
-
iPhone7でドコモメール設定をし...
-
iPod nano の撮影したビデオの...
-
エクセルのピボットテーブルに...
-
MP3プレーヤーに書き込んだ曲を...
-
メーラーThunderbirdの左に有る...
-
iPOD shuffle 曲の削除
-
メディアプレイヤーの削除の仕...
-
EXCEL2007で、挿入したチェック...
-
ODBCの自動登録について
おすすめ情報