- ベストアンサー
エクセルマクロで効率的に繰り返し作業を行う方法
- エクセルでコーピー&ペーストの繰り返しをマクロに記録していますが、データ量が200を超え尚且つ異なるシート間のやり取りで途中間違いや時間がかかってしまっています。
- 「VBA」を使ってと思ったのですが、どこのサイトいっても簡単な作業の記述がなく、困っています。
- エクセルに興味を持ち始めて公私ともに使いこなせるよう勉強中です。エクセルを効率的に使うためのサイトも教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 ループのパターンとifと変数の使い方を覚えるといっきに開けます。 For Each ~ Next、For ~ Next、Do ~ Loop、if ~ then ~ End if Worksheets は Worksheet の集まりです。 ブック内の全シートを処理する場合、Worksheet型の変数を処理するループ文として For Each xx In Worksheets ~ Next を使います。取りあえずこれで出来るとのだと覚えれば良いと思います。xxは変数です。 Sub Test1() Dim a as Worksheet 'a は Worksheet ですよと宣言 For Each a In Worksheets Msgbox a.Name Next a End Sub 上記例で 変数 a には、次々にWorksheetが代入されます。a.Name は「ワークシート.名前」ですので、実行すると次々にブック内のシート名が表示されます。 ただ、ループで処理したく無いシートもあるでしょう。 シート名があらかじめ解るなら、if文で「もしシート名がSheet8じゃないなら次の文を処理する」というよな文で制御出来ます。 後は、どの部分がどんな変化をするかによって、変化する部分を変数にします。 8,10,12,14 ・・・ と2つずつ変化させたい 13,14,15 ・・・ と1つずつ変化させたい と言う2種類の要望があるので、それぞれ別々に変数にし、ループの中の必要な場所で値を変化させます。 Sub test1() ' ws はワークシートです、i は整数です、cntは長整数です、と宣言 Dim ws As Worksheet, i As Integer, cnt As Long 'cnt に 13 を代入(ifなどの条件文以外での = は右から左に代入すると言う意味です) cnt = 13 'ブック内の全シートをループ処理する処理。まずwsに最初のシート(例としてSheet1)が代入される。 For Each ws In Worksheets '※1 '代入されたシートの名前が Sheet8 以外ならIf ~ End Ifの間を実行。 If ws.Name <> "Sheet8" Then 'i に 8 ~ 26 までを2つ飛ばしで代入する。まずは i に 8 が代入される。 For i = 8 To 26 Step 2 '※2 'Sheet1のA8にSheet8のC13を代入 ws.Range("A" & i) = Worksheets("Sheet8").Range("C" & cnt) 'cnt に cnt +1 を代入(ここでcnt = 14となる) cnt = cnt + 1 '※2に戻る Next i End If '※1に戻る Next ws End Sub
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
#2です。 > sheet8のデータがひとつおきに > sheet1~7に張り付きます。 であれば、i のループを2ずつ進めれば良いのでこうでしょうか? Sub test1() Dim ws As Worksheet, i As Integer, cnt As Long cnt = 13 For Each ws In Worksheets If ws.Name <> "Sheet8" Then For i = 8 To 26 Step 2 ws.Range("A" & i) = Worksheets("Sheet8").Range("C" & cnt) cnt = cnt + 1 Next i End If Next ws End Sub
補足
ありがとうございます。 完璧です。思ったように動きましたm(__)m 他のことにも応用しようと 上記のプロシージャを読解中・・・ 奮闘してますが、さっぱりです(ToT) copyもpaestもないしかもこんな簡単に これを「言葉」に直すとどうゆうことに なりますか?時間があれば教えてください
- papayuka
- ベストアンサー率45% (1388/3066)
やりたい事が解かりません。 仮に、 左から Sheet1 ~ Sheet8 とあって、Sheet8 の C13~C145 までデータがある。 Sheet8のC13~C31のデータをSheet1のA8~A26まで写す Sheet8のC32~C50のデータをSheet2のA8~A26まで写す ・ ・ Sheet8のC127~C145のデータをSheet7のA8~A26まで写す としたら、↓こんな感じでしょうか? Sub test() Dim ws As Worksheet, i As Integer, cnt As Long cnt = 13 For Each ws In Worksheets If ws.Name <> "Sheet8" Then For i = 8 To 26 ws.Range("A" & i) = Worksheets("Sheet8").Range("C" & cnt) cnt = cnt + 1 Next i End If Next ws End Sub
補足
ありがとうございます やりたいことは 上記の通りなのですが・・・ 走らせてみると sheet8のデータがひとつおきに sheet1~7に張り付きます。 たぶん貼り付け先のセルが (A8,A9)(B8,B9)で結合されてるからと 思うのですが修正方がわかりません。 動作そのものは間違いではありませんでした。
- rhl
- ベストアンサー率37% (42/111)
そのマクロの内容(コード)を載せたほうが回答しやすい と思います。
補足
遅くなりましたが補足させてください Sub Macro1() Range("D13").Select Selection.Copy ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select Range("A8:B9").Select ActiveSheet.Paste ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select ActiveSheet.Next.Select Range("D14").Select Application.CutCopyMode = False Selection.Copy ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select ActiveSheet.Previous.Select Range("A10:B11").Select ActiveSheet.Paste End Sub (途中省略してます) ざっとこんな感じのマクロを記録してます。 実際にはこれを200回近くやらなければ ならない時もありシンドイです。 これで補足になりましたでしょうか?m(_ _)m
お礼
papayukaさん本当にありがとうございました。 先ほどの構文を参考に(といっても数値を 変えた程度ですが)いくつかの作業を 簡略化できました。 ご丁寧な説明も大変参考になりました。 本当は20P以上の喜びですが スミマセン最高点が20Pなので それで勘弁してくださいm(_ _)m