dポイントプレゼントキャンペーン実施中!

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"に値のみペーストします。

しかし、処理が遅いので早くしたいです。
単純化できないでしょうか?

A 回答 (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

でも、あれこれ試してみるのが面倒だなって思ったら、パターンをいくつか拾って、それで以って考えてみるのも一つの方法です。後は、ご自身で考えてみてください。ネットでは、人のコードの中心になる部分だけにポイントを置いて、知らなければメモっておけばよいと思います。そういうメモがやがて、数百、数千にもなれば、かなりなものになっているかと思います。千を越えるには、数年は掛かります。

諦めなければ、きっと上達します。
    • good
    • 0
この回答へのお礼

ありがとうございます。地道に努力あるのみですね。

でも、自分の場合は仕事で使うものではないので、
あとから見てわかる程度のコードにしておいた方が無難かなという感じはします。。。
まぁ、でもベタベタなコードは避けたいところですが。(わがままですいません。。。)

今回は詳しく(考え方なども含めて)教えていただいてありがとうございました。

お礼日時:2006/10/10 22:26

#2の修正



 Dim Moto As Worksheet 元のシート(開いたアクティブシート)
 Dim Saki As Workbook 転送先のブック名

ここには、コメントアウトが抜けています。ヒラウチしたので、抜けてしまいました。すみません。

 Dim Moto As Worksheet '元のシート(開いたアクティブシート)
 Dim Saki As Workbook '転送先のブック名
    • good
    • 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分でも遅くは感じません。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせていただきます。

しかし、私の書いたものと全部違うのはなぜですか?
お察しのとおり、素人なものでマクロ自動記録をちょっといじった程度ですが、どこかおかしかったですか?

お礼日時:2006/10/09 20:58

>しかし、処理が遅いので早くしたいです。



何分かかるのでしょうか?

この回答への補足

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

補足日時:2006/10/06 15:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!