重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。

必要に迫られ、初めてマクロを組んでいます。

下記三つのコードの実行に時間がかかり、
その後の処理に支障が出てきているようです。
遅い時は、1分30秒程度かかる時もあります。
なんとか、高速化できないものかとなやんでいます。

内容
excel 2007
file size 約400kのブック

タイマーによりそれぞれ
(1)23時54分
(2)23時56分
(3)23時58分
に起動するようになっています。

(1)
Sub DB保存()

Dim bn As String
Dim 値 As String
Dim 本日 As String
Dim 新ブック As String
Dim 年 As String
Dim 月 As String
Dim 日 As String
Dim 時間 As String

bn = "温湿度管理表.xlsm"
年 = Year(Now)
月 = Month(Now)
日 = Day(Now)
時間 = 235400 '変更注意

本日 = Format(expression:=Date, Format:="yyyymmdd")
値 = (本日) & (時間)


新ブック = "C:\システム\管理者用\DB\DB" & (値) & ".xlsm" 'パス変更注意


Workbooks(bn).SaveCopyAs Filename:=新ブック

End Sub


(2)
Sub DBから日別保存へコピー()

On Error Resume Next

Dim bn As String
Dim sheetn As String
Dim セル As String
Dim 値 As String
Dim 本日 As String
Dim 元ファイル As String
Dim 新ファイル As String
Dim 年 As String
Dim 月 As String
Dim 日 As String
Dim 時間 As String


bn = "温湿度管理表"
sheetn = "管理2"
セル = "H13"
年 = Year(Now)
月 = Month(Now)
日 = Day(Now)
時間 = 235400 '変更注意
本日 = Format(expression:=Date, Format:="yyyymmdd")
値 = (本日) & (時間)

元ファイル = "C:\システム\管理者用\DB\DB" & (値) & ".xlsm" 'パス変更注意

'パス変更注意
新ファイル = "C:\システム\温湿度 管理\日別保存データ\" & Format$(Date, "yyyy年") & "\" & Format$(Date, "mm月") & "\" & Format$(Date, "mm月dd日") & ".xlsm" 'パス変更注意


Dim MyFile As String
Dim fso, f, ts

MyFile = "C:\システム\管理者用\DB\DB" & (値) & ".xlsm" 'パス変更注意

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(MyFile) = True Then

End If

On Error Resume Next

FileCopy 元ファイル

End Sub


(3)
Sub 表のクリア()

' 表のクリア Macro

ThisWorkbook.Worksheets("管理").Range("F11:P160").ClearContents


End Sub


特に(2)と(3)が遅くて、
場合により、(3)以降タスクマネージャーのCPU使用率が延々100%になったままになります。

なにぶんドのつく素人でして、困っています。
どうかお知恵を拝借願います。

A 回答 (2件)

>また、それぞれ標準モジュールに一つづつ記入しています。


>その都度、変数を入れることは必要ないですか?
>また、まとめて一つの標準モジュールにしたほうが、処理ははやいのですかね?

変数の宣言、代入はモジュールごとに必要です。
モジュールを一つにまとめてもバラバラにしても今回の場合は処理時間は変わらないでしょうね。

(2)で時間が掛かるとすれば、記載されているコードがすべてなら、FileCopy文くらいしか考えられませんが、いづれにしろ1ステップづつ実行しながら確認するしかありません。

(3)はセルのクリアだけですから、モジュールの自動実行ではなく、手動でモジュールを実行させたときの処理時間や、セルを直接手動でクリアした場合の処理時間を調べてみてはどうでしょうか。

もし、手動で実行したときは処理時間が掛からないけれど、自動実行にすると処理時間が掛かるという場合は、自動実行のときに何か別の処理も実行されている可能性があります。

タスクマネージャーのCPU使用率が100%のようですが、どのプロセスがCPUを使っているか、またメモリーの使用状況も確認したほうがいいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

問題解決しそうです。

これ以外のコードが邪魔していました。。。

それを記載せずすみません。

お礼日時:2009/06/17 00:13

やっていることは、(1)はBookの保存、(2)はファイルのコピー、(3)はセルのクリアのようですから、本来は時間がかかるはずがない処理です。



原因を究明するためには、デバッグモードで1ステップづつ実行し、どのステップで時間がかかっているか調べたほうがいいのではないですか。



それとは別に、コードを見て気になった点を。

(1),(2)の年,月,日は値を代入するだけでその後使用していないので不要では?

(2)の元ファイルとMyFileに同じファイル名を代入しているが、別名で使い分ける必要はある?

(2)の On Error Resume Next が2ヶ所で宣言していますが1つで充分です。

(2)で On Error Resume Next を宣言する意味が不明です。エラーとなりうるのは FileCopy のときですが直前にファイルが存在することを確認しているので On Error Resume Next は必要ありません。
逆に On Error Resume Next を宣言するならファイルの存在の確認をしなくても大丈夫です。

(2)の If fso.FileExists(MyFile) = True Then の後の End if は場所が違うのでは?(FileCopy文の後では)

(2)の FileCopy 元ファイル は構文ミスですね(コピー先ファイルが必要)

(2)に Dim fso, f, ts とありますが、f と ts は使っていません。何か理由があって宣言しているのですか?
    • good
    • 0
この回答へのお礼

nag0720様

こんばんは。
ありがとうございます。

コードはコピーペーストしてまして、
重複がかなりあるのが事実です。
また、それぞれ標準モジュールに一つづつ記入しています。
その都度、変数を入れることは必要ないですか?
また、まとめて一つの標準モジュールにしたほうが、処理ははやいのですかね?

コードは、ツギハギでして。。。
わけわからず、見よう見まねで書いて、とりあえず動いた状態です。
無駄や重複を削除しなければいけませんね。

FileCopy 元ファイル 新ファイルです。
抜けていました。

いじると動かなくなりそうで、見直しや改良をしていませんでした。


期日(明後日!!)が迫っているので、出来る限りをしようと思います。

お礼日時:2009/06/16 01:06

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