Excel.Applicationへのシートコピー

このQ&Aのポイント
  • Excel.Applicationを使用してシートをコピーする方法について教えてください。
  • Windows XP SP2とExcel 2003 SP3の環境で、Excel.Applicationを使用してシートをコピーしようとすると、コンパイルエラーが発生します。
  • エラーメッセージには、修正候補として区切り記号または(が提示されますが、試した方法はうまくいきませんでした。
回答を見る
  • ベストアンサー

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に対してのシートコピーを行いたいのですが、コンパイルを行うとエラーがなく、実行すると「コンパイルエラー 修正候補:区切り記号 または(」とエラーが発生します。色々書き方を試してみたのですが、どれもうまくいきませんでした。 宜しくお願いします。

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>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

forgedcode
質問者

お礼

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文だとエラーになったのでこちらにしました。

forgedcode
質問者

補足

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

その他の回答 (2)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.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

forgedcode
質問者

お礼

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

  • venzou
  • ベストアンサー率71% (311/435)
回答No.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 こんな感じでどうでしょう?

forgedcode
質問者

お礼

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メソッドに失敗しました」とエラーが出ました。

関連するQ&A

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • シートを選択したい vba

    自身のファイルを読み取り専用で新たに立ち上げて、シートを選択したいのですが Private Sub cmd_読み取り専用で開く_Click() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) xlApp.Visible = True xlApp.xlBook.Sheets("メイン").Select Set xlApp = Nothing Set xlBook = Nothing End Sub だと xlApp.xlBook.Sheets("メイン").Selectでエラーになります。 文法が間違ってると思うのですが、修正案をご教授ください。

  • VB2008 エクセル出力

    VB2008 エクセル出力 教えていただけると助かります VB6.0使用時にエクセル出力をするために下記のようなプログラムで出力していました ※「Microsoft Excel 9.0 Object Library」を参照 Dim xlApp As EXCEL.Application Dim xlBook As EXCEL.Workbook Dim xlsheet As EXCEL.Worksheet Dim File As String File = App.Path + "\EXCEL\" + "フォーム.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(File) Set xlsheet = xlBook.Worksheets("テスト") xlsheet.Range("A1") = "テスト" 'フォルダ作成 If Dir("D:\", vbDirectory) = "" Then Call Mkdirs("D:\テスト") 'Worksheetを名前をつけて保存します。 xlApp.DisplayAlerts = False xlsheet.SaveAs "D:\テスト\テスト.xls" xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing Set xlsheet = Nothing VB2008の場合だとどのように書けば同じように動きますか ※色々試してみましたがダメでした 「Microsoft Excel 12.0 Object Library」を参照しています

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • Excelのシートをコピー

    環境は,Visual Studio 2005 Standard Editionです. プログラムを実行後,以下の例外が発生しました. 「HRESULT からの例外: 0x800A03EC」 発生場所は★の位置です. ここから------- Dim xlApp As Microsoft.Office.Interop.Excel.Application = Nothing Dim xlBook As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook = xlApp.Workbooks.Open("ファイルのパスが入ります") xlSheet = xlBook.Worksheets("シート名が入ります") Dim xlBook2 As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet2 As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook2 = xlApp.Workbooks.Open("ファイルパスが入ります") xlSheet2 = xlBook.Worksheets("シート名が入ります") 'Excelを表示しない xlApp.Visible = False xlSheet.Copy(Before:=xlSheet2) ★ ここまで-------------- やろうとしているのは,xlSheet2のシートを含むExcelファイルに,xlSheet2の前にxlSheetをコピーする処理です. ★のところで上の例外が発生してしまいます. 以上,よろしくお願いします.

  • 既に開いているエクセルを閉じるには?

    既に該当のファイルが開いているのなら閉じたいのですが xlBook.Quitだとエラーになります。 Sub test1() Dim xlApp As Excel.Application Dim xlBook As Workbook Dim FileName As String FileName = "C:\test.xlsm" Set xlApp = GetObject("", "Excel.Application") 'GetObjectで合ってるか不安 Set xlBook = xlApp.Workbooks.Open(FileName) If xlBook.ReadOnly = True Then 'ファイルが開いてるのなら MsgBox "既にファイルが開いているので閉じます。" xlBook.Quit 'エラー 438 End If xlApp.Quit 'これって何のために必要? Set xlBook = Nothing 'ココを通り過ぎるのにすごく時間がかかる。 Set xlApp = Nothing End Sub と言うコードを作りました。 xlBook.Quitがダメならどのコードを使えばいいでしょう? また、 GetObject("", "Excel.Application") と言う開き方でいいのでしょうか? あと、 xlApp.Quit は何のために必要なのでしょう? タスクマネージーのプロセスを見ると、 Set xlApp = GetObject("", "Excel.Application") を通る時に新しいEXCEL.EXEが作成され、 Set xlApp = Nothing を通り過ぎる時に、そのEXCEL.EXEが消えます。 だから xlApp.Quit は不要ですか?

  • VB2005でExcelのシートをコピー

    VB2005Expressで開発をしています。 Excelのシートをコピーして同じbookに追加をしたいと思っています。 下記でまずExcelを使用できるようにして  Dim xlApp As New Excel.Application  Dim xlBooks As Excel.Workbooks = xlApp.Workbooks  Dim xlBook As Excel.Workbook = xlBooks.Add '新規のファイルを開く  Dim xlSheets As Excel.Sheets = xlBook.Worksheets  Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)  xlApp.Visible = True 下記で追加できると思うのですが、()内にセットするパラメータが わかりません・・・  xlBook.Worksheets.Copy() どなたかご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

  • Excelブックの保護パスワード判定方法

    VB6.0で、Excelブックが保護パスワードされているかどうかの 判定を行いたいです。 以下のようにHasPasswordプロパティを使用してみたのですが、 保護パスワード付きのExcelブックでテストしてみると Workbooks.Openの部分で処理が止まってしまい、先にすすみません。 基本的にやり方が間違えているんでしょうか? お分かりになる方がいらっしゃいましたら、教えてください。 よろしくお願いします。   Dim xlApp  As Excel.Application   Dim xlBook  As Excel.Workbook   Set xlApp = CreateObject("Excel.Application")   Set xlBook = xlApp.Workbooks.Open("C\:TEST.xls") If xlBook.HasPassword Then Msgbox("保護パスワードあり") Else Msgbox("保護パスワードなし") End If   Set xlSheet = Nothing   xlBook.Close   Set xlBook = Nothing   xlApp.Quit   Set xlApp = Nothing

  • Excelがインストールされてない環境でのExcelインスタンス作成

    Set xlApp = CreateObject("Excel.Application") xlApp.Visible = False xlApp.ScreenUpdating = False xlApp.DisplayAlerts = False Set xlBook = xlApp.Workbooks.Add Set xlClone = xlApp.Workbooks.Open("C:\TEMPLATE.xls") xlClone.Worksheets("Sheet1").Copy After:=xlBook.Sheets(1) 以上のようにVB上からExcelインスタンスを作成し xlBookにxlCloneのシートをコピーしています。 作成した.exeをExcelがインストールされている環境では動作するのですがExcelがない環境ではエラーになってしまします。 ライブラリをおくなど、Officeをインストールしないで済む方法はありますでしょうか?VBにはExcel Object Liblalyが参照設定されてます。 Excelあり環境 Visual Basic6 SP6 WindowsXP SP2 Office2003 SP4 Excelなし環境 Windows Server2003 SP2

  • EXCEL VBA Applicationインスタンス内での範囲指定

    Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Private Const SCol = 1 Private Const SRow = 1 Private Const ECol = 1 Private Const ERow = 1 Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add xlBook.Sheets("Sheet1").Range("A1") = 1 xlBook.Sheets("Sheet1").Range(Cells(SCol,SRow), Cells(ECol, ERow)).Borders.LineStyle = True xlBook.SaveAs "c:\ss.xls" xlBook.Close xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing 以上のようにEXCEL VBA内で新規ExcelApplicationインスタンス内で値を代入し、線を引いているのですが線を引く範囲指定部分でアプリケーション定義またはオブジェクト定義のエラーですと表示されます。 xlBook.Sheets("Sheet1").Range("A1:B2").Borders.LineStyle = True ↑のような形であればエラーは出ません。 xlBook.Sheets("Sheet1").Range(Cells(1,1),Cells(2,2)).Borders.LineStyle = True ↑ではエラーが出ます。 新規ExcelApplicationインスタンス内でのRange(Cells)の使用方法が違うのでしょうか?よろしくお願いします。