• ベストアンサー

エクセルの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 と、範囲を小さく取っていますが、これはテスト用なので、 実際のデータ範囲はもっと広いです。 また、メッセージボックスは、カウンタ変数の進捗状況をチェックする為に置いてあるだけで 完成用のコードでは消去する予定です。

質問者が選んだベストアンサー

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

ん~、ループを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 繰り返しの回数も指定できると思います。

yaki1013
質問者

お礼

教えていただいた通りにやってみたところ、うまくいきました。 for nextというものを理解できていなかったようです。 Int(Range("A65536").End(xlUp).Row / 4) + 1 というのは見たことが無いですが、これから勉強してみます。 どうもありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 「始めにコードありき」というのは、コードにある程度自信がある人だけです。丸投げというのを嫌う人がいますが、内容によりけりです。 この場合は、言葉で説明をしたほうが良く分かります。それと、こういう、位置決めでうまく出来ない場合は、シートで、数列を解いてからコードにしたほうがよいです。簡単な数列の問題と同じですから。 以下の場合は、(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

yaki1013
質問者

お礼

丁寧にコードを書いていただいて、どうもありがとうございます。 自分には見慣れない記述が多いですが、少しずつ教えていただいたものを理解してみようと思います。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

ループをネストさせているので、ご質問の様な動作になります。 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 ご参考まで。

yaki1013
質問者

お礼

すみません、お礼を投稿したつもりが反映されていませんでした。 思ったとおりに動かない原因はネストしたせいだったんですね。 おかげさまで解決できました。 ありがとうございました。

関連するQ&A

  • EXCELのマクロがわかりません・・・

    現在、A列にデータが並んでいるのですが、 これを7つ区切り(例:A1~A7、A15~A21)にして、 別シートに用意した表に行列を入れ替えて、 貼り付けるマクロを作っているのですが、 なにぶんVBは素人ですので、よくわかりません。 今作ろうとしているマクロは、 「元データ」セルのA1からA7までをコピーして、 「作成データ」セルのB2を起点として、 コピーした内容の行列入れ替えを行い貼り付け、 以後、「元データ」のコピー範囲を7つづつ 下にずらし、「作成データ」の貼り付け起点を 1つづつ下にずらして、「元データ」のA列の 最後までくりかえすものです。 必ず「Range」文で引っかかってしまうのですが、 何か構文的におかしいでしょうか? かなり急ぎですので、 わかる方、よろしくお願いしますっ!! 下に、作成したマクロを貼り付けます。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2005/12/5 ユーザー名 : *** Worksheets("元データ").Activate 開始行 = -6 終了行 = 0 ペースト行 = 0 Do 開始行 = 開始行 + 7 終了行 = 終了行 + 7 ペースト行 = ペースト行 + 1 開始セル番号 = "A" & 開始行 終了セル番号 = "A" & 終了行 ペーストセル番号 = "B" & ペースト行 Range("開始セル番号:終了セル番号").Select Selection.Copy Sheets("作成データ").Select Range(ペーストセル番号).Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _ , Transpose:=True Loop End Sub

  • エクセルのマクロ中で

    飛び飛び(ctrl+クリック)で選択された値を 別シートに貼り付けるマクロを作成中です。  元はD列にある値なのでRange("D" & cnt)として (cntは変数)  cnt = Selection.Row.Countで行番号を取得しようと しましたがうまくいきません。 D1から順番に縦方向に最終データまでは行けるのですが ・・・  初心者に「産毛」が生えたくらいです。ご教授お願いします

  • エクセルマクロ セルの貼り付けについて

    マクロ初心者でわからないことばかりで困っております。 For i = 1 To 721 Step 80 Sheets("Sheet2").Activate Range("G3").Select ActiveCell.FormulaR1C1 = i Range("A1:D80").Select   Selection.Copy Sheets("Sheet3").Activate このあとにコピーしたもの「Range("A1:D80").Select」をセルに貼り付ける時に一回ごとに80行ずつずらして貼り付けたいのですが、そのような場合は どのようにRange指定して貼り付ければよろしいのですか? sheet2で演算した結果をsheet3のセルA1からA721まで貼り付けたいのです。一回の演算で80行まで計算されます。 わかりずらくて申し訳ありません。

  • EXCEL 関数をふくむ行列の入れ替え

    いまSheet1に3列*2行で A1+A10 B1+B10 C1+C10 A2+A11 B2+B11 C2+C11 といった関数が入っているとして、 別のシートに、この関数から導き出される値の行列を入れ替えた状態で表示したいのですが、どういった方法があるのでしょうか? ちなみに値だけを行列の入れ替えをしたいのではなく、関数を活かしたまま行列を入れ替えたいのですが、一般的な「形式を選択して貼り付け」で行列の入れ替えにチェックをいれても、エラーが返ってきてしまいうまくいきません。 さらに、その別のシート上でSUMなどの関数で縦・横・の集計など計算をしたいのですが・・・ いい方法があったら教えてください。

  • エクセルマクロの件

    AとBにあるデータの一覧をCにコピーして、全体を日付順にソートするという処理をしたいと思っています。 そこでエクセルマクロにて (1) Aのデータの必要部分をコピー、Cに貼り付け (2) Bのデータの必要部分をコピー、Cに貼り付け (3) 全体を日付順にソート というものができました。 ただ、Bのデータを貼り付ける位置で問題が発生しています。 仮に、Aに200行までのデータが入っている場合、Bのデータを201行目に張り付けすれば問題ありませんが、Aのデータが増えたときにはAのデータの201行目以降はBのデータで上書きされてしまいます。 そこで、Bのデータを上記の例だと250行目あたりに張り付けするようにマクロを変えると、なぜかBのデータは一切Cに反映されなくなってしまいます。 この理由と、上記の対策があれば教えていただければと思います。 ちなみに、現在設定されているマクロは以下の通りです。 自動記録にてつくってあるので無駄な部分もあるかと思いますが、よろしければご覧いただければと思います。 Sheets("Aのシート").Select ActiveWindow.SmallScroll Down:=-138  Range("A4:O200").Select Selection.Copy Sheets("Cのシート").Select ActiveWindow.SmallScroll Down:=-162  Range("A4").Select ActiveSheet.Paste Application.CutCopyMode = False  Sheets("Bのシート").Select Range("G25:G28").Select Range("G28").Activate ActiveWindow.SmallScroll Down:=-30 Range("A4:O120").Select Selection.Copy Sheets("Cのシート").Select ActiveWindow.SmallScroll Down:=147 Range("A181").Select ActiveSheet.Paste Cells.Select Range("A4:O200").Select Selection.Sort Key1:=Range("C4"), Order1:=xlAscending, Key2:=Range("D4") _ , Order2:=xlAscending, Key3:=Range("E4"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _ xlSortNormal, DataOption3:=xlSortNormal End Sub

  • EXCEL シート保護するとマクロが正常動作しない

    こんにちは。 よく使うコピー&貼り付けを、マクロにして、ボタンの設定をしました。 他人に計算式をいじられたくないので、シート保護をかけています。 が、そのマクロを一度使うと、計算式が正常にコピーされません。 そこ自体の計算式は非常に単純なものなのですが・・・ 例) A1 B1+C1 A3 B3+C3 A5 B5+C5 (上下でセルを結合させています) A20 B20C+C20 (A21とA22でセルを結合させています) マクロ 1)「A1:A6」コピー&値貼り付け&コピー 2)A8:A13 貼り付け ※上記もそれぞれ上下2セルを結合しています。 3)「A20」コピー 4)「A1:A6」へ貼り付け ※消えた計算式を復活 これだけのことです。 ですが、シート保護を外すと何度も繰り返し使えますが、 保護した途端一度きりになってしまいます。 一体に何に問題があるのでしょうか?

  • Excel マクロAが動作した時にマクロBをクリア

    Excelのマクロで、 マクロAを動作した時に、マクロBで変数(cnt)に格納していた値を「0」にする方法を教えて下さい。 現在やっていることは、 テンプレートをマクロBを使って1回ないし複数回セルの下に続けてコピーし、データを入力、 マクロAを使って別シートにそのデータを転記して清書すると言う形にしています。 マクロBで実行回数をcntに格納し、次にコピーする位置をcntを使って出しています。 cntの定義は、「Static cnt As Integer」になっています。 この変数cntを、マクロAを実行した時に、0にしたいのですが、 どの様に記述するのか独学なのでうまくいきません。 ご教授下さいますようお願いいたします。

  • Excel 2007 マクロ 表の貼り付け

    Excel 2007 マクロ 表の貼り付け Excel 2007 マクロ 表の貼り付けについて教えてください。 <Sheet1>の表にあるA2からD4を <Sheet2>に値貼り付けをします。 表は画像を添付します。 マクロの記録では下記内容になります。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A2:D4").Select Selection.Copy Sheets("Sheet2").Select Range("A2:D4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub <Sheet1>のA列の行の増減にかかわらず、<Sheet2>に貼り付けることができるように するにはどのようにマクロを修正すればよろしいでしょうか。

  • vbaでfor nextの計算

    vbaでfor nextを使って計算しています。 excelのシートの値を使って計算しています。 for nextが3重になっていて中のyとxのfor next が計算し終わったらjのfor nextで次のセルを参照したいのですがうまくいきません。 どうしたらいいか教えてください。 コードは以下の通りです For j = 1 To 2 Step 1 For y = 3 To 90 Step 3 γ = y / 180 * π For x = -180 To 180 Step 6 α = x / 180 * π γs = Range("A:A").Rows(j).Value / 180 * π αs = Range("B:B").Rows(j).Value / 180 * π Eeg = Range("C:C").Rows(j).Value Eed = Range("D:D").Rows(j).Value 計算式(省略) Next x Next y Next j

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。

専門家に質問してみよう