- ベストアンサー
マクロでコピー&ペースト処理が遅い、単純化したい
- マクロでコピー&ペースト処理が遅いので単純化したいです。
- マクロの処理速度を向上させるために、コピー&ペーストの処理を単純化したいです。
- コピー&ペースト処理が遅いため、効率的な処理方法を見つけたいです。
- みんなの回答 (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 でも、あれこれ試してみるのが面倒だなって思ったら、パターンをいくつか拾って、それで以って考えてみるのも一つの方法です。後は、ご自身で考えてみてください。ネットでは、人のコードの中心になる部分だけにポイントを置いて、知らなければメモっておけばよいと思います。そういうメモがやがて、数百、数千にもなれば、かなりなものになっているかと思います。千を越えるには、数年は掛かります。 諦めなければ、きっと上達します。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
#2の修正 Dim Moto As Worksheet 元のシート(開いたアクティブシート) Dim Saki As Workbook 転送先のブック名 ここには、コメントアウトが抜けています。ヒラウチしたので、抜けてしまいました。すみません。 Dim Moto As Worksheet '元のシート(開いたアクティブシート) Dim Saki As Workbook '転送先のブック名
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 遅い速いは別として、私なりの書き方で書いてみました。 これが遅いかは、こちらでは分かりませんので、調べてみてください。 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分でも遅くは感じません。
お礼
ありがとうございます。参考にさせていただきます。 しかし、私の書いたものと全部違うのはなぜですか? お察しのとおり、素人なものでマクロ自動記録をちょっといじった程度ですが、どこかおかしかったですか?
- hana-hana3
- ベストアンサー率31% (4940/15541)
>しかし、処理が遅いので早くしたいです。 何分かかるのでしょうか?
補足
(file, num)を変えて、10ファイル程度書き込んでいるのですが、 計算値の入ってないただの数値をコピー&ペーストする場合は、「いち」と数える間に処理されるのに対し、 計算値の入っている場合では、1ファイルにつき「いち、に、さん」と数える感じですかね。 感覚的な話で申し訳ないですが。
お礼
ありがとうございます。地道に努力あるのみですね。 でも、自分の場合は仕事で使うものではないので、 あとから見てわかる程度のコードにしておいた方が無難かなという感じはします。。。 まぁ、でもベタベタなコードは避けたいところですが。(わがままですいません。。。) 今回は詳しく(考え方なども含めて)教えていただいてありがとうございました。