- ベストアンサー
エクセルのfor nextマクロが思ったとおりに動作しません・・・。
Sub 行列入替貼り付けの繰り返し() Dim cnt1 As Integer Dim cnt2 As Integer For cnt1 = 3 To 17 Step 4 For cnt2 = 1 To 39 Step 8 Sheets("元データ").Select Range("A" & cnt1 & ":C" & cnt1 + 3).Select Selection.Copy MsgBox ("A" & cnt1 & ":C" & cnt1 + 3) Sheets("貼り付け先").Select Range("A" & cnt2 & ":D" & cnt2).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True MsgBox ("A" & cnt2 & ":D" & cnt2) Next cnt2 Next cnt1 End Sub **************************************************************** 以上が自分で作ったコードなんですが、いかんせんマクロ超初心者なもので処理が思った通りにいきません。 <やりたい処理> 1「元データ」シートのA3:C6をコピー 2「貼り付け先」シートのA1:D1へ、行列入替・値貼り付け 1’「元データ」シートのA7:C10をコピー 2’「貼り付け先」シートのA9:D9へ、行列入替・値貼り付け ・・・以降、「元データ」シートの入力されている範囲のセルまでコピーして行列入替・値貼り付けの繰り返し 以上がやりたい処理なんですが、上記のようにはならず実際には 1「元データ」シートのA3:C6をコピー 2「貼り付け先」シートのA1:D1へ、行列入替・値貼り付け 1’「元データ」シートのA3:C6をコピー 2’「貼り付け先」シートのA9:D9へ、行列入替・値貼り付け の繰り返しになってしまい困っています。 (1と2まではできていますが、1’の所がうまくいっていません) どうか解決方法をご教授お願いいたします。 ※「元データ」シートの入力されている範囲はあらかじめ分かっています。上記のコードでは、 For cnt1 = 3 To 17 Step 4 For cnt2 = 1 To 39 Step 8 と、範囲を小さく取っていますが、これはテスト用なので、 実際のデータ範囲はもっと広いです。 また、メッセージボックスは、カウンタ変数の進捗状況をチェックする為に置いてあるだけで 完成用のコードでは消去する予定です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ん~、ループを2重にする必要性ありますか? 元データ 貼り付け先 1回目 3~6 1 2回目 7~10 9 3回目 11~14 17 ・・・と変化すればよいのですよね。 For cnt1=1 to 100 で Range("A" & cnt1 * 4 - 1 & ":C" & cnt1 * 4 + 2).Select と Range("A" & cnt1 * 8 - 7 & ":D" & cnt1 * 8 - 7).Select で満足しませんか。 >「元データ」シートの入力されている範囲のセルまでコピーして行列入替・値貼り付けの繰り返し ですので For cnt = 1 To Int(Range("A65536").End(xlUp).Row / 4) + 1 ・・・ Next 繰り返しの回数も指定できると思います。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 「始めにコードありき」というのは、コードにある程度自信がある人だけです。丸投げというのを嫌う人がいますが、内容によりけりです。 この場合は、言葉で説明をしたほうが良く分かります。それと、こういう、位置決めでうまく出来ない場合は、シートで、数列を解いてからコードにしたほうがよいです。簡単な数列の問題と同じですから。 以下の場合は、(17 \ 4)は、範囲がはっきりしないので、このような書き方にしました。 なお、貼り付け側に、範囲を決めることはなく、セルひとつで足りますが、分かりやすくするために書いてあるだけです。 本来は、これでよいです。 Worksheets("貼り付け先").Cells(i * 8 + 1, 1).PasteSpecial _ ----------------------------------------------- Sub CopyReverse() Dim i As Long For i = 0 To (17 \ 4) Worksheets("元データ").Cells(i * 4 + 3, 1).Resize(4, 3).Copy Worksheets("貼り付け先").Cells(i * 8 + 1, 1).Resize(3, 4).PasteSpecial _ Paste:=xlValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=True Next i Application.CutCopyMode = False End Sub
お礼
丁寧にコードを書いていただいて、どうもありがとうございます。 自分には見慣れない記述が多いですが、少しずつ教えていただいたものを理解してみようと思います。
- mitarashi
- ベストアンサー率59% (574/965)
ループをネストさせているので、ご質問の様な動作になります。 For cnt1 = 3 To 17 Step 4 For cnt2 = 1 To 39 Step 8 ここでは、cnt2のループが一回りして抜けるまでは、ct1は3のまま Next cnt2 Next cnt1 これに代えて、下記の様にやれば良いかと思います。 For i = 1 To 4 cont1 = 3 + (i - 1) * 4 cont2 = 1 + (i - 1) * 8 '処理を記述 Next i ご参考まで。
お礼
すみません、お礼を投稿したつもりが反映されていませんでした。 思ったとおりに動かない原因はネストしたせいだったんですね。 おかげさまで解決できました。 ありがとうございました。
お礼
教えていただいた通りにやってみたところ、うまくいきました。 for nextというものを理解できていなかったようです。 Int(Range("A65536").End(xlUp).Row / 4) + 1 というのは見たことが無いですが、これから勉強してみます。 どうもありがとうございました。