- ベストアンサー
for each の現在の配列ポインタ VBA
for each で配列内の値をいじるマクロを組んでいるのですが 「今 配列内のどこを見ているのか」を取りだすにはどうすればよいのでしょうか for each c in range(~ の時には「今 range内のどこを見ているのか」は c.address をすればわかったのですが、配列となるとどうすればよいのか… お分かりになるかたいらっしゃったらよろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
for each nextの制御には、取り出せるポインタの値はありません。敢えて言えばfor eachしている変数自体がポインタです。 ごく単純な1次元配列なら計算すれば求まりますが、2次元以上ではそれもできません。 たとえば: sub macro1() dim a, h a = array(1,2,"a","b","c") for each h in a msgbox h & "," & application.match(h, a, 0) next end sub #もっともこれでは、ループごとにカウンタを+1していくのと変わらないんですけどね。 どーしてもアドレス的な数字が必要なのでしたら、for each next制御はあきらめて、各次元のUboundまでfor to nextでぐるぐる数字を回してください。若しくは、前述したようにカウンタを用意してループした回数を数えて下さい。
その他の回答 (2)
- cj_mover
- ベストアンサー率76% (292/381)
あ、すみません、#2です。 Sub testの ' もしくは Dim matrix() これ↑は消し忘れなので無視してください。 Dim matrix()では動かない書き方だけのせたので。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは、お邪魔します。 (配列というのが配列変数のことなのだとして)(非オブジェクトの要素) ここら辺の書き振りについてはは、ある程度個性に委ねられる部分があってもいいとは思いますが。 基本的に配列変数はFor Nextでインクリメントしながら回すのが一般的ですし扱い易いです。 私個人の決め事としては 配列変数をFor Each Nextで回してもいいとする条件としては 1)配列の要素を上書きする必要がないこと(言わずもがな、ですけど) 2)Variant型の要素(内部型式オブジェクト型以外なら何でも)が収められた Variant型変数(もしくはVariant()型配列変数) 3)一次元、もしくは、二次元配列 4)二次元の場合は、単行、もしくは、単列、であること 5)ループ目的以外でUBoundを取得する必要がないこと という風に決めています。 特に4)5)の条件が揃った時ぐらいですね、For Each Nextで回すメリットがあると思えるのは。 例としては Sub test() Dim matrix ' もしくは Dim matrix() Dim v Dim ret As String Dim i As Long If TypeName(Selection) = "Range" Then matrix = Selection.Columns(1).Value i = 0 ' 省略可 If IsArray(matrix) Then For Each v In matrix i = i + 1 ret = ret & vbLf & CStr(i) & v Next v ret = Mid(ret, 2) Else ret = "1" & matrix End If MsgBox ret End Sub (1オリジン(LBound=1)の場合を例に挙げましたが 0オリジンならi = i + 1の位置を後ろにずらしたりして対応します。) 勿論、For Nextでも良いわけですし、むしろFor Each Nextで配列を回すのは 極限られた少数派だと思います。 ポインタに使えるのはVariant型だけですから、 仮にInteger配列をFor each Nextで回すのは、 例えば、スイカ一個をわざわざトラックの荷台に積む、ぐらいに違和感があるし コストはかかるけどメリットなく、却って面倒が増えそうですよね。 そういう意味でも用途は限定されると思います。 コレクションオブジェクトやコレクションをループする場合は 堂々とFor Each Nextでまわして良いと思いますが 非オブジェクトの値を要素に持つ配列の場合は素直に For Nextで回すのが優先ってことだけは頭に入れといてください。 失礼しました。
お礼
> コレクションオブジェクトやコレクションをループする場合は > 堂々とFor Each Nextでまわして良いと思いますが > 非オブジェクトの値を要素に持つ配列の場合は素直に > For Nextで回すのが優先ってことだけは頭に入れといてください。 お礼が遅れて申し訳ありません 独学でやっていたため基礎的なことが欠けている部分があるのですが、これもその一端でしょうか… この時以降気をつけるようにしています ありがとうございました。
お礼
お礼を入れ忘れていました、長い間の放置申し訳ありません。 ご助言に従って通常のfor文で処理したことで解決しました 「当然あるものだ」と思っていたせいで探すのに時間をかけてしまい、作業に使える時間が減ってこの時は大変でした 有難うございました