プロが教えるわが家の防犯対策術!

連投になりますが、こういうのも見つけました。先ほどの選択削除の方法です。
Dim i As Integer, j As Integer
Dim ar

With ListView1
ReDim ar(.ListItems.Count - 1)
For i = 1 To .ListItems.Count
If .ListItems.Item(i).Selected Then
ar(j) = i
j = j + 1
End If
Next
ReDim Preserve ar(j - 1)
For i = UBound(ar) To 0 Step -1
.ListItems.Remove ar(i)
Next
End With

見ても何をどうしているのかわからなかったのですが、、どなたか、これで何をしているのか、教えてくださる方おられませんか、。

質問者からの補足コメント

  • うーん・・・

    Dim ar  → これは何の変数??
    ReDim ar(.ListItems.Count - 1) ar とかの変数を個数-1増やした でいいのかな、、
    For i = 1 To .ListItems.Count 1から行数 これはわかります
    If .ListItems.Item(i).Selected Then 項目のどれかを選んだら、これもわかります
    これがわからない、、選んだら、???
    ar(j) = i
    j = j + 1

    ReDim Preserve ar(j - 1) 動的配列とかいうやつなので、変数増やすから前の分をキープして
    ar(j - 1)に増やす、、??わからない、、

    For i = UBound(ar) To 0 Step -1 変数arの個数を後ろから数えた数がi
    .ListItems.Remove ar(i) ar i 番を削除

      補足日時:2020/10/14 01:35
  • へこむわー

    回答とかみていてなんとなくやってることはイメージできてきましたが、、
    ar(j) = i
    j = j + 1

    ReDim Preserve ar(j - 1) 

    ここがわからない、、

      補足日時:2020/10/14 04:57
  • うれしい

    皆様のご厚意に感謝いたします。顔を突き合わせることのないネットの世界ですが、画面の向こうから、心より感謝しております。原始人レベルの地頭しかない初心者には、心強い限りです。
     今後も、何かとご意見もあると思いますが、お付き合いくださいますよう心よりお礼申し上げます。

      補足日時:2020/10/15 00:02

A 回答 (7件)

疑問であるなら実際やってみて確認を繰り返すのもありですよ。



Next
'ReDim Preserve ar(j - 1) 'ここをコメント文にして

ReDim Preserve ar(j) 'jにしてみる
'で ar(j - 1)とar(j)にある値を確認
MsgBox "a(j - 1) : " & a(j - 1) & "___ a(j) : " & a(j)
Stop '先に行くとだめなのでストップ

For i = UBound(ar) To 0 Step -1

未検証ですけど多分 a(j) は何も表示されない。
表示されないって事はその後の Remove で削除するインデックスの指定が出来ずエラーになる(はず)。
a(j - 1) は選択している最後の値を表示するはず。
表示するって事はそのインデックスは有効な値なので、そこまでを要素数の上限として指定すれば良い事になる。
    • good
    • 0
この回答へのお礼

重ね重ねありがとうございます。そうですね。直球なので、そのまま顔面で受け止めます。
 何度か動かしましたが、わかるまで何度もやってみますね。

お礼日時:2020/10/14 23:55

No.6です。



ちょっと違ったかな?

>a(j - 1) は選択している最後の値を表示するはず。

a(j - 1) は選択している最後の【要素番号】を表示するはず。

・・・ですね。
    • good
    • 0
この回答へのお礼

すいません、本当に。なんども感謝いたします。

お礼日時:2020/10/14 23:56

私は逆に深読みしすぎずタダ場数を踏んでベテラン回答者さんの真似事をしましたね。


説明書読むより実際に動かして覚えようとして「あれ?」ってなったら説明書を調べる性格な者なので。
    • good
    • 0
この回答へのお礼

本日はたびたび返事が遅れて大変申し訳ございません。
パンシロンのおかげで、ar preserve ar(j - 1)がまだイメージつかないですが、それ以外は理解ができました。
 ネキシウム飲んで、もうちょっと脳みそ活性化させてみます。

お礼日時:2020/10/14 21:27

>Dim ar  → これは何の変数??



『変数の宣言の基本』
宣言をした際にその型を指定しなければVBAの場合『不特定な型を入れられるValiant型になる』とされていると思いました。
正確に書くなら

Dim ar As Valiant

ですけど上記の件もあり面倒くさいと思う人はあえて型の指定をしないだけの事。


>ReDim ar(.ListItems.Count - 1) ar とかの変数を個数-1増やした でいいのかな、、

基本カウントって1~nになりますけど、配列のインデックス(要素番号)は0からスタートなので、先頭は1-1=0と言う事は最後尾はn-1になると言う事です。


>ar(j) = i
>j = j + 1

j はループの最初では宣言された後何も値を入れていないので初期値の 0 となり For ~ Next が始まった時の i回目で
ar(0) = i
とインデックス:0 に i の 値が代入されます。
i の値は If .ListItems.Item(i).Selected Then で True(選択されてた番号)を満たした値になります。

j = j + 1

により次に格納する ar のインデックスを準備します。


>ReDim Preserve ar(j - 1)

まず ar(j - 1) ですが、インデックスの加算が代入の後に行われているため ar(j) とすると ar の最後尾は値の代入がありません。無駄でもあるしエラーの原因にもなりかねません。
よって j - 1 により最後尾を代入された最後のインデックスで指定します。

次に Preserve ですけど、これをつけないで ReDim してしまうとそれまで代入してきた値が全て初期化されてしまいます。
付ける事により初期化を防ぎ値を保持したままインデックスの上限を変更させることが出来ます。
これについては

Dim a, b
Dim i As Integer

ReDim a(5)
ReDim b(5)

For i = 0 To 4
a(i) = i
b(i) = i
Next

ReDim a(5)
ReDim Preserve b(5)

Debug.Print "a", "-", "b"

For i = 0 To 4
Debug.Print a(i), "-", b(i)
Next

結果:

a - b
- 0
- 1
- 2
- 3
- 4

で配列変数:a には何も入ってない(初期化状態)事がわかるかと。
    • good
    • 0
この回答へのお礼

お返事いただきましてありがとうございます。遅れて申し訳ございません。
脳みそが消化不良を起こしたので、パンシロン飲んで、ちょっとましになりました、、
 理解は相当できてきましたが、もう少し頭痛めつけてみます、、。
地頭がいい人がうらやまし~。

お礼日時:2020/10/14 14:08

arは配列。


redimでは、リスト数に合わせて可変する。
まず配列に、選択された行番号を格納する。
そのあと、行番号を基に削除する。
なぜ下からかと言うと、上からだと削除後に行番号が降り直されるため。やってみりゃわかる。

VBA 選択されたリストを削除
みたいなキーワードで検索してみて。

ちょっと寝れないから、丁寧に回答してみた。
これは特別な。
    • good
    • 0
この回答へのお礼

回答いただきまして、ありがとうございます。やってることはなんとなくイメージできてきました。
ar(j) = i
j = j + 1

ReDim Preserve ar(j - 1) 
これがわからない、、
初心者改め原始人。。。

お礼日時:2020/10/14 04:56

リストビューの削除。


Removeで検索してみて。
    • good
    • 0
この回答へのお礼

お返事いただきましてありがとうございます。
分からないところ補足にしました、、
削除するって最後の1文はわかりますが、それ以前の構文でなにをしてるのか、、わからない、、

お礼日時:2020/10/14 01:37

複数行の選択を可としているリストビューにおいて、選択されている行をすべて削除している。

    • good
    • 0
この回答へのお礼

お返事いただきましてありがとうございます。
最後のコードでなんとなくわりかますが、、途中の構文の意味がわからないところだけです、、

お礼日時:2020/10/14 01:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!