- 締切済み
ループが重いです
エクセル20000ですが ループでウエブからデータをコピーして保存するコードを 作りましたが実行後すぐに固まってしまいます。 作業は コピー先のベースのブックを開き データをコピー 名前を変えて保存。ブックの保存は .xls形式です。 メモリは512です。メモリ不足でしょうか。 また途中で Application.Wait DateAdd("s", 10, Now) で 間をおいています。 宜しくおねがいします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Masa2072
- ベストアンサー率51% (94/182)
もう見ていないかもしれませんが、締め切り前なので一応 > 1 どうも Workbooks("base").SaveAs Filename:=code > のところで時間を食っているとおもいます。 そう思う根拠は分かりませんが、実際にこの前後に Debug.print now と入れて時間を計測してみればどうでしょう? ここで時間がかかっているとすれば、プログラムで同行できる問題ではないと思います。 > 2 Application.Wait DateAdd("s", 5, Now)は効果あるのでしょうか これも実際、前後にDebug.Print Nowと入れてみれば分かりますがきちんと5秒停止しますよ。 実際に処理に時間がかかるといっている割に、無意味なWaitをかけている理由が分かりませんが、ソースを見ると100件処理するのに1件につき5秒ずつWaitをかけているのですから500秒(8分20秒)ロスしており、こちらの方が問題だと思います。
こんにちは。 ほんとーーーに憶測で恐縮ですが、 エクセルは書き込まれるたびに再計算されますので、 少し重い計算式などを同ブック内に保持していると激遅になります。 コード最初でmanualに設定し、 必要であればシート再計算のコードをそのたびにいれ、 最後にAutmatic戻す。。。 しかしWindow単位に設定が変更されますので、 同時に空けている他のエクセルブックに対しても変更されてしまいます。 基本的過ぎたりして失礼だったらほんとにすみません。。。
- Masa2072
- ベストアンサー率51% (94/182)
貴方の作成したソースを拝見出来ない限り具体的な回答はまず無理です。 データの構造と取得している方法、保存先のレイアウト もともと時間がかかる作業をしているのか、貴方ソースのロジックの間違いか・・・ これでは丸投げ以前の問題です。
補足
質問の仕方が安易でした。大変失礼しました。 以下にコードを書きます。 Sub Calc() Dim code As Range Workbooks("get").Activate Worksheets("sheet1").Activate For Each code In Worksheets("Sheet2").Range("A1:A100") Worksheets("sheet1").Range("a5").Value = code.Value ' 途中省略 ウエブから Workbooks("get"). Worksheets("sheet1")にデータをコピー Workbooks.Open Filename:="C:\base.xls" Workbooks("get").Activate Workbooks("get.xls").Worksheets("sheet1").Range("a1:ao3000").Copy _ Destination:=Workbooks("base.xls").Worksheets("sheet1").Range("a1") Workbooks("base.xls").Activate Worksheets("sheet1").Name = code Workbooks("base").SaveAs Filename:=code Application.Wait DateAdd("s", 5, Now) ActiveWorkbook.Close Next End Sub 1 どうも Workbooks("base").SaveAs Filename:=code のところで時間を食っているとおもいます。 2 Application.Wait DateAdd("s", 5, Now)は効果あるのでしょうか 宜しくお願いします。
お礼
ご回答ありがとうございます。 今回の事例はVBAのことです。 ご指摘の方法は以前使っていたこともあり懐かしさを感じました。 今後とも宜しくお願いします。