連投になりますが、こういうのも見つけました。先ほどの選択削除の方法です。
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
見ても何をどうしているのかわからなかったのですが、、どなたか、これで何をしているのか、教えてくださる方おられませんか、。
No.6ベストアンサー
- 回答日時:
疑問であるなら実際やってみて確認を繰り返すのもありですよ。
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) は選択している最後の値を表示するはず。
表示するって事はそのインデックスは有効な値なので、そこまでを要素数の上限として指定すれば良い事になる。
重ね重ねありがとうございます。そうですね。直球なので、そのまま顔面で受け止めます。
何度か動かしましたが、わかるまで何度もやってみますね。
No.4
- 回答日時:
>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 には何も入ってない(初期化状態)事がわかるかと。
お返事いただきましてありがとうございます。遅れて申し訳ございません。
脳みそが消化不良を起こしたので、パンシロン飲んで、ちょっとましになりました、、
理解は相当できてきましたが、もう少し頭痛めつけてみます、、。
地頭がいい人がうらやまし~。
No.3
- 回答日時:
arは配列。
redimでは、リスト数に合わせて可変する。
まず配列に、選択された行番号を格納する。
そのあと、行番号を基に削除する。
なぜ下からかと言うと、上からだと削除後に行番号が降り直されるため。やってみりゃわかる。
VBA 選択されたリストを削除
みたいなキーワードで検索してみて。
ちょっと寝れないから、丁寧に回答してみた。
これは特別な。
回答いただきまして、ありがとうございます。やってることはなんとなくイメージできてきました。
ar(j) = i
j = j + 1
ReDim Preserve ar(j - 1)
これがわからない、、
初心者改め原始人。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Excel(エクセル) vba 「Nextに対するForが見当たりません」のエラーが発生する原因 1 2022/10/21 15:46
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語
-
五目並べ
-
繰り返し1行~28行までを順順に...
-
H8マイコン C言語でのプロ...
-
MATLABにおける行の挿入方法
-
アセンブラの間接アドレッシング
-
!(否定)演算子について
-
パイソンのプログラミングにつ...
-
MATLABのfor文の使い方について
-
Excel・Word リサーチ機能を無...
-
UserForm1.Showでエラーになり...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
特定のPCだけ動作しないVBAマク...
-
合計3TBのデータのハッシュ値を...
-
String""から型'Double'への変...
-
メッセージボックスのOKボタ...
-
教えて下さい
-
EXCELのVBAでRange("A1:C4")を...
-
ExcelのVBA。public変数の値が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
繰り返し1行~28行までを順順に...
-
c言語
-
MATLABにおける行の挿入方法
-
H8マイコン C言語でのプロ...
-
C言語で余りがマイナスになる場合
-
!(否定)演算子について
-
フォートランで行列の計算
-
パイソンのプログラミングにつ...
-
cのプログラミングで虚数を含...
-
ダイナミックプログラミング
-
StandardMLで整数リストの奇数...
-
一般次元の逆行列を求めるプロ...
-
MATLABの参考書
-
Pythonの公式リファレンスガイド
-
MATLABからCへ
-
MATLABのfor文の使い方について
-
OPENCVを使ったエピポーラ幾何...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
おすすめ情報
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 番を削除
回答とかみていてなんとなくやってることはイメージできてきましたが、、
ar(j) = i
j = j + 1
ReDim Preserve ar(j - 1)
ここがわからない、、
皆様のご厚意に感謝いたします。顔を突き合わせることのないネットの世界ですが、画面の向こうから、心より感謝しております。原始人レベルの地頭しかない初心者には、心強い限りです。
今後も、何かとご意見もあると思いますが、お付き合いくださいますよう心よりお礼申し上げます。