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

解決済みの質問

Excel.Applicationへのシートコピー

Public xlApp As Excel.Application
Public xlBook As Excel.Workbook

Set xlApp = CreateObject("Excel.Application")
'非表示・画面更新無・アラート非表示
xlApp.Visible = False
xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Add
xlBook.SaveAs "test123.xls"

'※ここでエラー
Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlApp.Workbooks(xlBook).Sheets(3)

Set xlApp = Nothing
Set xlBook = Nothing

環境:WindowXP SP2,Excel2003 SP3
以上のようにオブジェクト変数のEXCELに対してのシートコピーを行いたいのですが、コンパイルを行うとエラーがなく、実行すると「コンパイルエラー 修正候補:区切り記号 または(」とエラーが発生します。色々書き方を試してみたのですが、どれもうまくいきませんでした。
宜しくお願いします。

投稿日時 - 2007-10-10 15:16:48

QNo.3417502

困ってます

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

>xlApp.Visible = Falseの場合、この表示さえなく行うことができるので別アプリで行っておりました。
>自アプリ上では、この処理は無理なのでしょうか。

No.1の回答の2の方法で可能ですが、1つ問題があります。

新規のアプリケーションは、ファイルからTEST.xlsを開くため、
未保存のデータは反映されません。

予めTEST.xlsを保存しておく必要があります。

Sub test2()

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set xlApp = CreateObject("Excel.Application")
'非表示・画面更新無・アラート非表示
xlApp.Visible = False
xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Add

Workbooks("TEST.xls").Save '保存する

xlApp.Workbooks.Open Workbooks("TEST.xls").FullName '保存したファイルを開く

xlApp.Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)

xlBook.SaveAs "c:\temp\test123.xls"
xlApp.Quit

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

投稿日時 - 2007-10-10 18:09:45

補足

今確認したところ、一度test.xlsを閉じた上で、test123.xlsを開けば正常に開くことが分かりました。
test.xlsを開いたままtest123.xlsを起動するとアプリのみ起動してシートが何もない状態になるようです。これはtest123.xlsを閉じて再度開けば正常にはなるのですが・・・

投稿日時 - 2007-10-11 14:04:18

お礼

venzou 様
重ね重ねご回答ありがとうございます。
なるほど、コピー元とコピー先を新アプリのほうで扱うんですね。
ちなみにvenzou様のを参考に実行してみたのですが
作成されたtest123.xlsはシートが一個もないBookになってしまいました。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlClone As Excel.Workbook

Set xlApp = CreateObject("Excel.Application")
'非表示・画面更新中止・アラート表示中止
xlApp.Visible = True
xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Add
Set xlClone = xlApp.Workbooks.Open("test.xls")

xlClone.Worksheets(TEST_1).Copy After:=xlBook.Sheets(3)
xlBook.SaveAs "test123.xls"
xlApp.Quit

この関数が走る前にtest.xlsは変更されないのでセーブはしてません。
またvenzou様が書いたopen文だとエラーになったのでこちらにしました。

投稿日時 - 2007-10-11 10:06:30

ANo.3

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

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

回答(3)

ANo.2

>Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlApp.Sheets(3)
>Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)
>としたのですが、今度は「Worksheetクラスのcopyメソッドに失敗しました」とエラーが出ました。

このxlAppとxlBookは新規のアプリケーションですよね?

新規のアプリケーションと、TEST.xlsを開いているアプリケーションとは、
別のアプリケーションになります。

アプリケーションが異なるので、コピーは出来ないと思います。

>Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)
__↑TEST.xlsを開いているアプリケーション______↑新規のアプリケーション

-------------------------------------------
No.1の回答の1ですが、

Set xlBook = Workbooks.Add

この部分では、TEST.xlsを開いているアプリケーションと同じ
アプリケーション上にブックを作ります。

Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)

このコピーは同じアプリケーション上でのコピーになります。
こちらの環境(Excel2000)ではエラーは出ませんでした。

-------------------------------------------
>コピーして作成されたBookを開かずにおいていたかったからです。

Application.ScreenUpdating = false
では、ダメなのかな?(^^;

Sub test()
Dim xlBook As Workbook

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set xlBook = Workbooks.Add

Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)

xlBook.SaveAs "c:\temp\test123.xls"
xlBook.Close

Set xlBook = Nothing

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

投稿日時 - 2007-10-10 17:29:32

お礼

venzou 様
再度のご回答ありがとうございます。
別アプリの場合は、コピー自体できないのですね。そこからして間違ってました。

venzou様のサンプル通り実行したところ無事作成コピーと行うことができました。ただ一瞬ですがタスクバーに、作成コピーしているBookが表示されてしまいますよね?
xlApp.Visible = Falseの場合、この表示さえなく行うことができるので別アプリで行っておりました。
自アプリ上では、この処理は無理なのでしょうか。

投稿日時 - 2007-10-10 17:47:15

ANo.1

このプログラムは何処で実行される物でしょうか?

1:TEST.xls上で実行されるものでしょうか?
2:それとも、全く別のワークブックやVBなど?

これにより回答が異なります。
--------------------------------------------------------
1の場合、新規のアプリケーションを立ち上げる必要はない。

Set xlBook = Workbooks.Add

Application.DisplayAlerts = False

Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)
xlBook.SaveAs "c:\temp\test123.xls"
xlBook.Close
Set xlBook = Nothing

Application.DisplayAlerts = True

--------------------------------------------------------
2の場合、TEST.xlsを開く必要がある

Set xlApp = CreateObject("Excel.Application")
'非表示・画面更新無・アラート非表示
xlApp.Visible = flse
xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Add

xlApp.Workbooks.Open "c:\temp\TEST.xls" 'ここでファイルを開く

xlApp.Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)

xlBook.SaveAs "c:\temp\test123.xls"
xlApp.Quit

こんな感じでどうでしょう?

投稿日時 - 2007-10-10 16:05:09

お礼

venzou様

ご回答ありがとうございます。
実行する場所は1.のTEST.xls自身となっております。
なぜ1.のケースで新規のアプリケーションとしているかと言いますと
コピーして作成されたBookを開かずにおいていたかったからです。
ですからxlApp.visible = falseとしました。

また
Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlApp.Sheets(3)
Workbooks("TEST.xls").Sheets("TEST_1").Copy After:=xlBook.Sheets(3)
としたのですが、今度は「Worksheetクラスのcopyメソッドに失敗しました」とエラーが出ました。

投稿日時 - 2007-10-10 16:22:54

あなたにオススメの質問