
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

No.3ベストアンサー
- 回答日時:
追記します
ステップ実行 ステップイン
https://www.239-programing.com/excel-vba/basic/b …
対象シート(出力部分)とVBE(エディター) が両方目視できるように
ディスプレイに配置して
VBEの コード(プロシージャ)内にカーソルを置き F8キーで実行します
F8キーを押す度に1行ずつ実行されます
止まっている行は実行されていません
止まっている行で変数などにカーソルポインターを持っていくと格納されている値を見る事が出来ると思います
ステップインは簡易的な検証でイミディエイトウィンドウやローカルウィンドウなどを使うとさらに詳しく変数などの確認が出来ます
VBAのデバッグについてはVBEの操作と共に最も基本的な事になると思いますが、知らずにコードを書いている人が多いようですので 念のため・・
VBEの機能やデバッグ方法を学習すれば、今後のスキルアップに違いが出ますので是非覚えてください
No.2
- 回答日時:
こんにちは
ループ処理の学習だと思います。簡単なサンプルを下に書きますので
ステップ実行で処理方向、カウント変数の挙動を確認してみてください
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が外側の繰り返し処理になっているので同じような出力順序になります
しかし、少し違うような処理手順になっているようですね・・
そこを検証してみてください
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重ループにしたから、頭が混乱して、どうしていいか分からなくったのもあると思います。あともう一つ工夫すれば、完成したかもしれませんが、なかなか思うようにはいきませんでした。コメント+α、理屈を分かりやすく記載してあり、また、親切に答えて頂き、本当に有難うございました。超長丁場、やっと、分かったー、という感じです。大変、助かりました。重ね重ねになるんですが、有難うございました。大感謝です。
No.1
- 回答日時:
こんばんは
コードを見ると
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
ループと変数を少し整理(見直)して
ループのカウント変数をステップ実行などで観察してみては如何でしょう
ありがとうございます。c=c+1ではなく、r=r+1が正しいですね。トータル8時間近く、調べて、色々やってるんですが、やっぱり、分かりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
vb.netです。2次元配列の要素を...
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
VBAで3秒だけ時間を止めたい
-
エクセルの当番表を作っていま...
-
UWSCに制限時間を付けたいです
-
VB2010でCSVファイルの読み込み
-
ループ内での条件処理
-
vb.netからエクセル関数書き込み
-
円のHough変換をC言語で
-
alarmの使用について
-
PHPで今日の日付から3日後を表...
-
DoEventsが必要な理由について
-
GIFアニメをループさせたくない
-
objective-cの多重ループbreak
-
null 参照の例外が実行時に発生...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
UWSCに制限時間を付けたいです
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
流れ図(フローチャート)が分か...
-
DOSコマンドのループ内のTIMEコ...
-
pythonでファイルのコメント行...
-
素数表について。
-
VBAでの一時停止と再開の方法
-
「偶数・奇数の和」のフローチ...
-
DoEventsが必要な理由について
-
vb.netです。2次元配列の要素を...
-
Do whileでExitせず、ループの...
-
ループフリー
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
おすすめ情報
写真添付の為
気分を選ぶ