マクロでコピー&ペースト処理が遅い、単純化したい

このQ&Aのポイント
  • マクロでコピー&ペースト処理が遅いので単純化したいです。
  • マクロの処理速度を向上させるために、コピー&ペーストの処理を単純化したいです。
  • コピー&ペースト処理が遅いため、効率的な処理方法を見つけたいです。
回答を見る
  • ベストアンサー

マクロでコピー&ペースト処理が遅いような気がします。単純化したいです。

Sub ***出力(file, num) Workbooks.Open (file) Cells.Clear Windows("xxx.xls").Activate Sheets("***").Select Range(num & "2:" & num & "2000").Select Selection.Copy Windows(file).Activate Range("A1").PasteSpecial Paste:=xlPasteValues End Sub 2行目から2000行目の中には計算値が入っています(結構ながい)。 その値を"file"に値のみペーストします。 しかし、処理が遅いので早くしたいです。 単純化できないでしょうか?

noname#66230
noname#66230

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

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

こんばんは。Wendy02です。 >私の書いたものと全部違うのはなぜですか? 私の書いたものは、そのベースになっているものは、一つの決まったパターンがあるのですが、実は、私も、以前、同じように思いました。それも、実際にVBEでやっても、さっぱりわかりませんでした。それで、大村あつしさんの『Excel VBA』の本などでも調べました。他人の書いたものを自分で応用して使ってみてて、初めて分かるようになりました。 ただし、私の書いたものは、余計な部分がありますから、それは差し引いたほうが分かりやすいです。 >どこかおかしかったですか? 悪くはないですよ、絶対に! だって、マクロでちゃんと仕事が出来ているのですから!! 質問のコードでも、十分だと思います。私は、いつもは、同じような質問のコードがちゃんと出来ている人には、それ以上、望まなくてもよいからって、ふだんは、レスをつけないのです。 しかし、こういうときに、時々、ヘンな原則論を述べる人がいます。その一つに「Select」を使うなっていうのです。言っている人いないのであえて書きますが、なぜ、使わないほうがよいか説明しない限りは、単なる意味のない原則なんだと思います。 オブジェクトは「コンテナ」で扱う、という基本原則があるのですね。(それらを含めて、VBAの最適化、または「実行速度の最適化」と呼んでいます。)こういうのは、いろいろ試して、マクロが通るかどうか、それをちょっと試してみればよいのです。本当に、Select してアクティベート(Activate)するべきかは、最初の頃は、やってみなければ分からないことが多いものです。 例えば、以下でいうなら、繋げてみて、 Set rng = Workbooks("xxx.xls").Worksheets("***").Range(num & "2:" & num & "2000") で、他のブックからでもマクロが通れば、使えるって分かります。 '私のマクロの場合は、開いていない場合は、開くようにさせています。 Workbooks.Open (file) Cells.Clear Windows("xxx.xls").Activate  '←Activate の必要がない Sheets("***").Select '←Select の必要がない Range(num & "2:" & num & "2000").Select '←Select の必要がない 'Selection = Workbooks("xxx.xls").Worksheets("***").Range(num & "2:" & num & "2000") 'とまとめられるということです。 Selection.Copy '当然、こちらも、Activesheet.Range("A1") ということになります。 Windows(file).Activate Range("A1").PasteSpecial Paste:=xlPasteValues でも、あれこれ試してみるのが面倒だなって思ったら、パターンをいくつか拾って、それで以って考えてみるのも一つの方法です。後は、ご自身で考えてみてください。ネットでは、人のコードの中心になる部分だけにポイントを置いて、知らなければメモっておけばよいと思います。そういうメモがやがて、数百、数千にもなれば、かなりなものになっているかと思います。千を越えるには、数年は掛かります。 諦めなければ、きっと上達します。

noname#66230
質問者

お礼

ありがとうございます。地道に努力あるのみですね。 でも、自分の場合は仕事で使うものではないので、 あとから見てわかる程度のコードにしておいた方が無難かなという感じはします。。。 まぁ、でもベタベタなコードは避けたいところですが。(わがままですいません。。。) 今回は詳しく(考え方なども含めて)教えていただいてありがとうございました。

その他の回答 (3)

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

#2の修正  Dim Moto As Worksheet 元のシート(開いたアクティブシート)  Dim Saki As Workbook 転送先のブック名 ここには、コメントアウトが抜けています。ヒラウチしたので、抜けてしまいました。すみません。  Dim Moto As Worksheet '元のシート(開いたアクティブシート)  Dim Saki As Workbook '転送先のブック名

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

こんばんは。 遅い速いは別として、私なりの書き方で書いてみました。 これが遅いかは、こちらでは分かりませんので、調べてみてください。 Sub OutPutCells(FileName As String, strCol As String)  Dim Moto As Worksheet 元のシート(開いたアクティブシート)  Dim Saki As Workbook 転送先のブック名  Set Moto = ActiveSheet  On Error GoTo ErrHandler  If Dir(FileName) = "" Then MsgBox "ファイルが存在していません。", 16: End  'ファイルが開いていれば、そのまま、そうでなければ、ファイルをオープン  Set Saki = Workbooks(FileName)  With Saki   With .Worksheets("Sheet1") '転送先のシート名    .Cells.Clear    .Range("A1").Resize(2000).Value = Moto.Range(strCol &"2").Resize(2000).Value   End With  End With  Set Moto = Nothing  Set Saki = Nothing  Exit Sub ErrHandler:  'ブックオープン  Set Saki = Workbooks.Open(FileName)  Resume End Sub #1の回答の補足 >ファイルにつき「いち、に、さん」と数える感じですかね。 それは、人の感覚の問題なので、それは一種のパラドックスだと思います。じっと、シートを見つめている分には、0.5秒を越えると、遅いように感じますが、ほとんど自動化して手を掛けなければ、仮に、10分でも遅くは感じません。

noname#66230
質問者

お礼

ありがとうございます。参考にさせていただきます。 しかし、私の書いたものと全部違うのはなぜですか? お察しのとおり、素人なものでマクロ自動記録をちょっといじった程度ですが、どこかおかしかったですか?

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>しかし、処理が遅いので早くしたいです。 何分かかるのでしょうか?

noname#66230
質問者

補足

(file, num)を変えて、10ファイル程度書き込んでいるのですが、 計算値の入ってないただの数値をコピー&ペーストする場合は、「いち」と数える間に処理されるのに対し、 計算値の入っている場合では、1ファイルにつき「いち、に、さん」と数える感じですかね。 感覚的な話で申し訳ないですが。

関連するQ&A

  • マクロを使ったコピペがうまく動作しない。

    あるデータを転記用のブック(月毎にシートが分かれています。シートの内容は同一)に貼り付ける処理を行うため、下記のようなマクロを組んだのですが、何故か貼りつきません。処理終了時には、転記元ブック(シート)で最終処理の範囲(5番目のB287)を選択しています。一体何がいけないのでしょうか? データはA1からPまでで毎月可変しています。 また、転記用ブックが12枚あるため、月を指定してから貼り付けたいのですが、どのようにすればよいでしょうか?(下記は直接シ-トを指定しました) Sub test() Dim 最終行 As Integer '-------------------------------------------- 開始 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("1").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B1").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 1 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("2").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B83").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 2 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("3").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B157").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 3 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("4").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B227").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 4 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("5").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B287").PasteSpecial Paste:=xlPasteValues --------------------------------------------- 5 End Sub 

  • 値のみ貼りつけたい。

    値のみ貼りつけたい。 すみません。教えて頂いた内容でもう一つ追加で質問をさせてください。 マクロで別ファイルを二つ開いて、マクロファイルがWorkbooks(1)別ファイル二つがWorkbooks(2)、Workbooks(3)になります。Workbooks(2)のデーターをコピーしてWorkbooks(3)に値だけ貼りつけたいのですが、教えて頂けませんでしょうか。 Workbooks(2).Activate Sheets(1).Select Range("A1").Copy Workbooks(3).Activate Sheets(2).Select Range("B1:C1").Select ActiveSheet.Paste この部分を値のみ貼りつけたいのですが。 PasteSpecial xlPasteValuesをつけてもうまくいかないので、お願いします。

  • エクセルのマクロで繰り返し処理

    当方マクロ初心者ですが下記のマクロをCheckBox0~CheckBox23についてコピーするセルを変化させながら繰り返し処理を行いたいのですが、簡単なループ処理で行えますか? 教えていただければ幸いです。 If CheckBox0.Value = True Then Worksheets("sheets1").Activate  行 = Worksheets("sheets1").Range("e7")   行 = 行   Worksheets("sheets1").Range("g7:t7").Copy Windows("Books1.xls").Activate Sheets("sheets1").Select Range(Cells(行, 15), Cells(行, 15)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If

  • 複数シートをループさせてマクロを簡素化したい

    win7 Excel2007 でマクロ作成中の初心者です。 シート数の変動する複数シートの特定範囲を一枚のシートに右列方向に、値を貼り付けたいです。 自動記録でコード作成しましたが、もっと簡素化して軽くしたいです。 シートに対するループ等の作成ができません。どうかご指導お願いします。 Sub 勤怠最終データ作成() Worksheets(1).Select '1番左のシートを選択 ActiveSheet.Unprotect Range("B29:BM60").Select '複写範囲はすべて同じ Selection.Copy Sheets("総括").Select '値の貼り付けシートはすべて同じ Range("A2").Select '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(2).Select '2枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(3).Select '3枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(4).Select '4枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues 以下省略 End Sub

  • 【Excel VBA】シートコピー時、マクロコードはコピーしたくない

    ws.copy Before:=Workbooks(File).Sheets(1) Windows(File).Activate Cells.Select Selection.copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 上記コードで、シートのコピー・貼付を行っていますが、 コピー元シートのコードも引き継がれてしまいます。 引き継がれないようにコピーしたいのですが、可能でしょうか? 可不可について、 可能ならばそのやり方(コード)を教えていただけないでしょうか? よろしくお願いします。

  • Excelでマクロを繰り返したい。

    Excelでマクロを記録したら以下のようになりました このマクロを以下の条件で繰り返したいのですが。 Sub Macro1() '------------- '----------------------- ' Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=5*", Operator:=xlAnd, _ Criteria2:="<>5@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=6*", Operator:=xlAnd, _ Criteria2:="<>6@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=7*", Operator:=xlAnd, _ Criteria2:="<>7@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=8*", Operator:=xlAnd, _ Criteria2:="<>8@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 条件= Field:は4~35位まで変動します 一連の動作をコピーして手作業で数字を変えてみたのですが プロージャが大きすぎてエラーになってしまいます。 何か良い方法は無いでしょうか?。

  • マクロ実行後、画面がちかちかしない方法

    こんばんわ! VBAを実行すると、画面がちかちかします。 シートを行ったり来たりしているせいでしょうね? 自分で、色々やってみたのですが、エラーばかりで全然できません。 シートを行ったり来たりしなくてもいいVBAを作るには、どこを直せばいいでしょうか。 教えて頂けませんか? (現在のVBA) (1)「Data!FB63376,FG63376,FI63376」を「拾い出し!K4」にコピー&ペースト 値が入っている場合、下の行に貼付け。 Sub Macro1() Range("FB63376,FG63376,FI63376").Select   Range("FI63376").Activate Selection.Copy Sheets("拾い出し").Select If Range("K4").Value = "" Then Range("K4").Select Else Range("K" & Rows.Count).End(xlUp).Offset(1).Select  End If ActiveSheet.Paste Sheets("Data").Select (2)「Data!FO63367:FQ63372」を「拾い出し!O4」に値のみをコピー&ペースト 値が入っている場合、下の行に貼付け。 Range("FO63367:FQ63372").Select Selection.Copy Sheets("拾い出し").Select If Range("P4").Value = "" Then Range("P4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Else Range("P" & Rows.Count).End(xlUp).Offset(1).Select End If Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Data").Select Application.CutCopyMode = False End Sub 以上です。 お分かりになる方教えて頂けませんか? 宜しくお願いします。

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • マクロを使って不特定のファイルからコピー&ペーストしたい(エクセル)

    エクセルのデータの必要な列を別のブックに入っているフォーマットにどんどん追加していけるようなマクロを作りたいと思っています。 マクロの自動記録を使ってみたのですが、特定のファイル名が入っているので、使えません。 中を見てみると Windows("A.xls").Activate Columns("b:b").select Selection.copy workbooks.open Filename:="B.xls" Windows("B.xls").Activate Range("D9").select Windows("A.xls").Activate Application.CutCopyMode = False Range("b:b").select Selection.copy Windows("B.xls").Activate Selection.Pastespecial Paste:=xlValues,Operation:=xlNone,SkipBlanks:=False,Transpose:=False . . . となっています。 このファイルAとなっている部分を、どのファイルでも実行できるようにしたいです。 後、ファイルBに貼り付けるときに一番最終行に追加していくにはどのような構文を足せばいいか教えていただきたいです。 初心者で質問の意図が伝わりにくかったらすみません.. よろしくお願いします。

  • マクロのコピペについて

    に実装する際の2回目の処理について助けてください。 Sub Action1or2() Static ChkNext As Boolean If ChkNext = False Then ChkNext = True MsgBox "1回目の押下です。" ' ' Macro1 Macro Range("L9").Select Selection.Copy Sheets("様式2(管理表)").Select Range("C10").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("様式1-1(作業用) ").Select Range("C9:K9").Select Application.CutCopyMode = False Selection.Copy Sheets("様式3(チェック表)").Select Range("B9").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("様式1-1(作業用) ").Select Range("L9").Select Application.CutCopyMode = False Selection.Copy Sheets("様式4(22F倉庫用) ").Select Range("D9").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("様式1-1(作業用) ").Select Else ChkNext = False Call Action2 End If End Sub Sub Action2() MsgBox "2回目の押下です。" 'ここに2回目の実行コードを記述 End Sub 2回目に実行ボタンをクリックした際にSheets("様式1-1(作業用) ")のアクティブセルと("Sheets様式2(管理表"))&"様式3(チェック表)")&"様式4(22F倉庫用) ")のA列にアクティブセルの値とイコールの値がある場合、アクティブセルの2行下の行を選択してコピーを行い、各シートの対象セルの行へ貼り付けをする場合どのような記述をすれば良いかご教示ください。 よろしくお願いします。

専門家に質問してみよう