アプリ版:「スタンプのみでお礼する」機能のリリースについて

ExcelVBAで、index、match関数を使用して、 Cells(c, r) = .Index(myrng, .Match(key, Range("a2:a11"), 0), l)、Cells(c, r) = .Index(myrng, .Match(key, Range("a2:a11"), 0), l)c、r、lの2~3重ループで、同じ色の列で出力できるように、a2:f12→h2:m12、出力したのですが、上手くいきません。大変お手数ですが、どなたか、分かる方、教えて頂けないでしょうか?
初心者なので、意味不明かもしれません。ご了承下さい。

コード↓
Sub i_m3()
Dim myrng As Range
Dim c, r, k, l As Long
Dim key As Variant
Dim maxrow As Long
Set myrng = Range(Cells(2, 1), Cells(11, 6))


maxrow = Cells(Rows.Count, 1).End(xlUp).Row

For c = 2 To maxrow
For r = 8 To 13
For k = 2 To 11
l = 1 '←for l= 1 to 6 にしたかったのですが、4重ループになり分からなくなりそうなので、forにしませんでした
key = Cells(k, 1)

With Application
Cells(c, r) = .Index(myrng, .Match(key, Range("a2:a11"), 0), l) '←ここの部分です
c = c + 1
If c = 12 Then
Exit For
End If
End With
Next
Next
Next
' Next

End Sub

「ExcelVBAで、index、matc」の質問画像

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

  • 写真添付の為

    「ExcelVBAで、index、matc」の補足画像1
      補足日時:2022/10/18 22:01
  • どう思う?

    気分を選ぶ

      補足日時:2022/10/18 22:24

A 回答 (3件)

追記します


ステップ実行  ステップイン
https://www.239-programing.com/excel-vba/basic/b …

対象シート(出力部分)とVBE(エディター) が両方目視できるように
ディスプレイに配置して
VBEの コード(プロシージャ)内にカーソルを置き F8キーで実行します

F8キーを押す度に1行ずつ実行されます
止まっている行は実行されていません

止まっている行で変数などにカーソルポインターを持っていくと格納されている値を見る事が出来ると思います

ステップインは簡易的な検証でイミディエイトウィンドウやローカルウィンドウなどを使うとさらに詳しく変数などの確認が出来ます

VBAのデバッグについてはVBEの操作と共に最も基本的な事になると思いますが、知らずにコードを書いている人が多いようですので 念のため・・
VBEの機能やデバッグ方法を学習すれば、今後のスキルアップに違いが出ますので是非覚えてください
    • good
    • 0

こんにちは


ループ処理の学習だと思います。簡単なサンプルを下に書きますので
ステップ実行で処理方向、カウント変数の挙動を確認してみてください

Sub i_m3_Test()
Dim myrng As Range
Dim c, r, k, l As Long
Dim key As Variant
Dim maxrow As Long
Set myrng = Range(Cells(2, 1), Cells(11, 6))
maxrow = Cells(Rows.Count, 1).End(xlUp).Row
For c = 2 To maxrow '行方向ループ 2~最終行
key = Cells(c, 1) 'Matchのキーワード A2~最終行
'(11行までに限定したい場合は別変数でmaxrow>11の時の定義などをする)
l = 1 'for c の初めに変数lを初期化
For r = 8 To 13 '列方向のループ
With Application
Cells(c, r) = .Index(myrng, .Match(key, Range("a2:a11"), 0), l)
l = l + 1 'Index関数の取得列を出力列移動ごとに変更
End With
Next r
Next c
End Sub

この例は、列方向に出力した後 下行に移動していきます
ご質問の場合もFor c = 2 To maxrowが外側の繰り返し処理になっているので同じような出力順序になります

しかし、少し違うような処理手順になっているようですね・・
そこを検証してみてください
    • good
    • 0
この回答へのお礼

F8は既に知っていました。F8のクリックを何十回とループの動きを確認しながら、やっていたんですが、全然、答えには辿り着けませんでした。key(k,1)=cells(k,1)ではなく、key=cells(c,1)と、For c = 2 to maxrowと同じにcにすれば良かったんですね。それと、 For l = 2 To 11の余計なForがあり、ループが上手く回らず、l=1 l=l+1とすれば、いいですね。c,rの2重ループで回せばいいですね。For分を3重ループにしたから、頭が混乱して、どうしていいか分からなくったのもあると思います。あともう一つ工夫すれば、完成したかもしれませんが、なかなか思うようにはいきませんでした。コメント+α、理屈を分かりやすく記載してあり、また、親切に答えて頂き、本当に有難うございました。超長丁場、やっと、分かったー、という感じです。大変、助かりました。重ね重ねになるんですが、有難うございました。大感謝です。

お礼日時:2022/10/19 15:31

こんばんは


コードを見ると
For c = 2 To maxrow のカウント変数cをなぜループ内で
c = c + 1 しているのでしょうか?

If c = 12 Then
Exit For
End If
をしているところを見るとmaxrow行まで処理したら
次みたいにしたいのでしょうか?

ちなみに現状の場所でExit ForしてもFor kを抜けるだけなので
変数cの値は増えると思います

kは要りますか?
セルのインデックスを決める変数・・・c r
ループと変数を少し整理(見直)して
ループのカウント変数をステップ実行などで観察してみては如何でしょう
    • good
    • 0
この回答へのお礼

ありがとうございます。c=c+1ではなく、r=r+1が正しいですね。トータル8時間近く、調べて、色々やってるんですが、やっぱり、分かりません。

お礼日時:2022/10/19 11:13

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