• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロでコピー&ペースト処理が遅いような気がします。単純化したいです。)

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

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

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

  • ベストアンサー
  • 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