こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【Excel VBA】エクセルファイルを新規作成し、それを画面に表示せずに内容を変更するには?

いつもお世話になっております。

今回はExcelのVBAについて質問があります。

例えば、以下のようにVBAを書くと、C:\test\1.xlsが作成され、その内容が変更されます。
Workbooks.Add.SaveAs dirName + "C:\test\1.xls"
Workbooks("1.xls").Worksheets("Sheet1").Cells(1, 2).Value = 777
Workbooks("1.xls").Save
Workbooks("1.xls").Close

しかし、Workbooks.Add.SaveAsしてWorkbooks("1.xls").Closeするので、C:\test\1.xlsが一瞬画面に現れます。
それに、ちょっと動作が遅い感じがします(わざわざ画面に表示しているから?)。

C:\test\1.xlsを画面に表示させずに、その内容を変更する方法はありませんでしょうか?
実は、一つのExcelファイルの内容から、1000件程度のExcelファイルを作成する必要があります。
毎回、画面を表示していると大変遅くなってしまう恐れがあるのです。

上記の解決方法、又は参考になるWebサイトをご教示いただけると助かります。

以上、よろしくお願いします。

投稿日時 - 2008-05-28 11:22:54

QNo.4056695

すぐに回答ほしいです

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

しょうがないから別のプロセスでやりますか

Dim APL, WBK, WKS
Set APL = CreateObject("Excel.Application") '別プロセスを立ち上げる
Set WBK = APL.Workbooks.Add
Set WKS = WBK.WorkSheets(1)
WKS.Cells(1, 2).Value = 777
WBK.SaveAs "C:\test\1.xls"
WBK.Close
APL.Quit
Set APL = Nothing '★これ大事

投稿日時 - 2008-05-28 19:38:46

お礼

おはようございます。

ご回答ありがとうございます。これこそ、私が知りたかった回答です!
本当にありがとうございました。

以下のスクリプトでパフォーマンスの比較を行ってみました。
ご教示いただいた方法では約32秒、今までの方法では63秒でした。
単純な処理ですが速度が2倍となりました。

Sub testBtn3_Click()
Dim APL, WBK, WKS
Dim i As Integer

Kill "C:\test\*.*"

Start = Time
For i = 0 To 50
Set APL = CreateObject("Excel.Application") '別プロセスを立ち上げる
Set WBK = APL.Workbooks.Add
Set WKS = WBK.Worksheets(1)
WKS.Cells(1, 2).Value = 777
WBK.SaveAs "C:\test\" + Trim(Str(i)) + ".xls"
WBK.Close
APL.Quit
Set APL = Nothing '★これ大事
Next i
MsgBox (Time - Start) * 24 * 60 * 60

Kill "C:\test\*.*"

Start = Time
Application.ScreenUpdating = False
For i = 0 To 50
Workbooks.Add.SaveAs "C:\test\" + Trim(Str(i)) + ".xls"
Windows(Trim(Str(i)) + ".xls").Visible = False
Workbooks(Trim(Str(i)) + ".xls").IsAddin = False
Workbooks(Trim(Str(i)) + ".xls").Worksheets("Sheet1").Cells(1, 2).Value = 777
Workbooks(Trim(Str(i)) + ".xls").Save
Workbooks(Trim(Str(i)) + ".xls").Close
Next i
Application.ScreenUpdating = True
MsgBox (Time - Start) * 24 * 60 * 60

End Sub

投稿日時 - 2008-05-29 10:01:52

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Add直後に以下の操作をしてみて下さい。
Windows("1.xls").Visible = False

投稿日時 - 2008-05-28 14:44:54

お礼

回答ありがとうございます。

ご指摘の方法を追加してみましたが、やはり一瞬画面が表示されてしまいました。

以上、よろしくお願いします。

投稿日時 - 2008-05-28 15:00:53

あなたにオススメの質問