エクセルマクロで効率的に繰り返し作業を行う方法

このQ&Aのポイント
  • エクセルでコーピー&ペーストの繰り返しをマクロに記録していますが、データ量が200を超え尚且つ異なるシート間のやり取りで途中間違いや時間がかかってしまっています。
  • 「VBA」を使ってと思ったのですが、どこのサイトいっても簡単な作業の記述がなく、困っています。
  • エクセルに興味を持ち始めて公私ともに使いこなせるよう勉強中です。エクセルを効率的に使うためのサイトも教えてください。
回答を見る
  • ベストアンサー

マクロにて

エクセルでコーピー&ペーストの 繰り返しをマクロに記録していますが データ量が200を超え尚且つ 異なるシート間のやり取りで途中 間違いやなんかでもうかれこれ 2時間やってます。「VBA」を 使ってと思ったのですが どこのサイトいってもこんな簡単な 作業の記述がなく、泣きそうです。 Sheet8の「D13」をコピー sheet1の「A8」にペースト(ただしセル結合してます)sheet1の「A26」(10枠目)まで 行ったらsheet2の「A8」・・・以下繰り返し sheet8のデータが終了したら完了。 エクセルに興味を持ち始めて 公私ともに使いこなせるよう 勉強中です。是非ご教授ください あと超初心者でもわかり易いサイト あったら教えてください

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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

yanyanyanyan
質問者

お礼

papayukaさん本当にありがとうございました。 先ほどの構文を参考に(といっても数値を 変えた程度ですが)いくつかの作業を 簡略化できました。 ご丁寧な説明も大変参考になりました。 本当は20P以上の喜びですが スミマセン最高点が20Pなので それで勘弁してくださいm(_ _)m

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#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

yanyanyanyan
質問者

補足

ありがとうございます。 完璧です。思ったように動きましたm(__)m 他のことにも応用しようと 上記のプロシージャを読解中・・・ 奮闘してますが、さっぱりです(ToT) copyもpaestもないしかもこんな簡単に これを「言葉」に直すとどうゆうことに なりますか?時間があれば教えてください

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

やりたい事が解かりません。 仮に、 左から 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

yanyanyanyan
質問者

補足

ありがとうございます やりたいことは 上記の通りなのですが・・・ 走らせてみると sheet8のデータがひとつおきに sheet1~7に張り付きます。 たぶん貼り付け先のセルが (A8,A9)(B8,B9)で結合されてるからと 思うのですが修正方がわかりません。 動作そのものは間違いではありませんでした。

  • rhl
  • ベストアンサー率37% (42/111)
回答No.1

そのマクロの内容(コード)を載せたほうが回答しやすい と思います。

yanyanyanyan
質問者

補足

遅くなりましたが補足させてください 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

関連するQ&A

  • EXCEL マクロの記録で並べ替えのマクロをつくるとそのシートでしか使えないのでしょうか?

    EXCEL マクロの記録で並べ替えのマクロをつくるとそのシートでしか使えないのでしょうか? EXCEL2007を使っています。 マクロの記録で並べ替えのマクロをつくるとそのシートでしか使えないのでしょうか? シート1 1 3 2 というデータを「マクロの記録」で昇順に並べ替えるマクロを作成します。 シート2 3 5 4 というデータに適用したいのですが、マクロを実行するとシート1のデータが 並べ替えられてしまいます。 マクロを読むと「シート1」という記述があるのでシート1にしか適用できないようです。 マクロの記録だけで別のシートにも適用できるマクロを作成できないでしょうか? (ただの並べ替えだけだったらマクロを作成する必要はないのですが、実際にはもっと複雑な 動作をさせたいのです)

  • エクセル:シート1のセルA1が0でなければ任意のマクロを実行したい

    エクセルマクロ(VBA)初心者です。よろしくお願いします。 (1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ (2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。) このようなマクロ(標準モジュール)の書き方を教えてください。 よろしくお願いいたします。

  • エクセルのデータ入力をマクロで行う方法は?

    はじめまして。初めて質問させていただきます。 Excelで作業を行っていたのですが、マクロ(VBA?)で分からないことが出てきました。 Sheet1のQ6セルとQ7セルが結合されています。そこにはデータ(数式)が入力されています。 同様に、Q8とQ9、Q10とQ11・・・というように、データ(数式)が続いています。データ数は300個です。 他のシート(Sheet2)の A4セルから下に、先程のQ6セルのデータ A5セルにQ8のデータ・・・ というように書きたいのです。 これをマクロを組んで行うことは出来るのでしょうか? さらに、Sheet1で数式だったデータを文字列で保存できるとなお嬉しいです。 マクロ初心者ですいませんが、皆様のお知恵をお貸しください。よろしくお願いいたします。

  • エクセルのブック間のコピペのマクロ構文を教えて下さい

    はじめまして。 マクロは初心者なので、ご教授いただけるとありがたいです。 エクセルのワークブック1のシート1をコピーして、ワークブックAのシートaにペーストをする構文をお願いします。 マクロの記録で作って実行してみましたが、コピーするファイルが開いているときはうまくいって、開いていないとないとうまくいきませんでした。 コピーするファイルが開いていない状態でもコピーできる方法はないのでしょうか… よろしくお願いいたします。

  • Excelマクロ

    50枚くらいの別々のExcelスプレッドシート(別ブック)に入っている様々な文字列を変更したいと思っています。 (例えば、rose→daisy, pink→red, apple→orangeなど) この場合、この一連の「置換」を使った操作をマクロに記録させ、そのマクロを別のブックに入っているスプレッドシートにも適用することはできますか? 聞いたところでは、「マクロの記録」で記録されたマクロは、VBAで編集できるとのことなのですが、 そのVBAは、エクセルのどこから取得することができるのでしょう? そのVBAを別のスプレッドシートに都度コピーペーストすることにより、あるスプレッドシートに記録されたマクロを他のスプレッドシートに記録することはできますか? また、この方法がワークしない場合、別のやり方で目的を達成することはできますでしょうか? どなたかどうぞお知恵をお授け下さい。宜しくお願いいたします。

  • エクセルのマクロについて

    エクセル2010でのマクロについて、教えてください。 「全体を選択」→「昇順で並び替え」というマクロはどのように書けばできますか? マクロの記録でやると、そのシートでしか使えないマクロになってしまいますが、 データ量も違う色々なシートで使用したいのです。よろしくお願いします。

  • LibreOffice_Calcマクロの使い方

    旧いWin10PCを再生するためLinuxOSに入れ替えました。LibreOffice_Calcの関数はExcel代替ソフトとして十分活用できます。マクロはExcelのVBAマクロのように使いこなすまでには到っていませんがマクロの自動記録機能もあり、有効に使っています。 Windowsでは、Selenium WebDriverとVBAマクロを使い、Web上の株価データを自動で取り込み、思いのままに活用していますが、LibreOfficeではWeb上のデータを自動で取り込むことは難しく、手動(Control+A,Control+C)でクリップボードにコピー、ペーストしてテキストで取り込み、その後、マクロ処理しています。 この過程で、テキストのインポートのダイアログボックスが表示され、OKボタンを押すことになるのですが、次の処理には進まず、そこで終了。次のステップを手動でマクロ処理ボタンを押し継続実行しています。 LibreOffice_calcマクロの自動記録の限界と思われますが、他に何かいい方法はないでしょうか?

  • エクセルマクロ VBAで順次下セルからコピペする方法

    VBA初心者です。教えてください。 同一bookに"sheet1"と"sheet2"があります。 "sheet1"セルA1のデータ(数字or文字)をコピーして"sheet2"セルA1にペースト。 次に "sheet1"セルA2のデータ(数字or文字)をコピーして"sheet2"セルA2にペースト。 "sheet1"セルA3のデータ(数字or文字)をコピーして"sheet2"セルA3にペースト。 ↓ セルAxにデータがあれば、繰り返し。 ↓ "sheet1"セルAxが空欄になったら終了。 このような処理は、どう記述したらよいのでしょうか? お願いします。教えてください^^;

  • Excelでマクロ実行中に画面を固定する方法

    Excelでマクロ(VBA)を実行しているとお考えください。 内容は他のシートのデータを別のシートにコピー&ペーストするとお考えください。 すると、画面がめまぐるしく動きます。 これをとめる方法をご存知の方教えていただければうれしいです。 (以前、やったことがあるんですが、忘れてしまいました) (また、検索で調べようとしたのですが、どのようなキーワードで検索すればいいのかわかりませんでした(私のキーワードでは見つかりませんでした)) よろしくお願いいたします。

  • エクセルマクロ Vlookupに似たマクロはありますか?

    度々すみません。 わからない事がいくつか出てきてしまって。どなたかご教示いただけると嬉しいです。 今は手作業で以下のような作業をしております。 データ元のシート(以下(1))とそれ加工して作るシート(以下(2))があります。 (1)のデータを2度sortするのですが、一度目のsortでtotalが入っている行は全てdelete。 残ったデータでもう一度sortし、種類別に並び変えます。 その後、コラムAがUSDである物はシート(2)のUSDページに貼り付け、コラムAがEURであればシート(2)のEURページに貼り付け・・・としていきたいのですが、マクロの記録を使おうにも、毎回コラムAは目視で確認しコピー・貼り付けをしていますのでマクロの記録は使えないですし、エクセル関数ではVLOOKUPがありますが、それをマクロに書き込む方法もどこにも載っておらず、どうしていいか息詰まった状態です。 sortするのはマクロの記録を使って作成できましたので、 ・コラムAがtotalになっている行より下はdelete ・コラムAがUSDならシート(2)のUSDシートへ貼り付け・・・ のマクロを作成したいです。 どうか宜しくお願い致します。

専門家に質問してみよう