エクセルのシートをコピーするには?

解決


NJ  2004-01-09 22:45:18  No: 81357

お世話になっております。

VBからエクセルのシートをコピーするために下記のコードを記述しましたが
エラーが出てしまいます。
エラー内容は
「'Sheets'メソッドは失敗しました'Globalオブジェクト'」
です。
どなたか理解できる方がいらっしゃいましたら、ご教授をお願い致します。
環境は  VB6.0  excel97です

---
Private Sub Command1_Click()
    Dim objExcelApp   As Workbook
    Dim strExcelFile As String
    Dim strExcelSheet As String

    strExcelFile = "d:\temp\test.xls"

    strExcelSheet = "sheet1"
    
    Set objExcelApp = GetObject(strExcelFile, "Excel.Sheet")

    objExcelApp.Sheets("Sheet1").Select
    objExcelApp.Sheets("Sheet1").Copy After:=Sheets(1)  '●エラー発生
    objExcelApp.ActiveSheet.Paste

    objExcelApp.Save

    objExcelApp.Application.Quit

    Set objExcelApp = Nothing

End Sub
---
よろしくお願いします。


魔界の仮面弁士  2004-01-09 23:01:36  No: 81358

>  objExcelApp.Sheets("Sheet1").Copy After:=Sheets(1)  '●エラー発生

上記の「Sheets(1)」が原因でしょう。
これですと、どのワークブック上のシートを操作しているかが
曖昧になってしまいますよね。objExcelApp.Sheets(1)などとしましょう。

Excel内で、VBAにて「Sheets(1)」と書けば、それはそのブック上のシートだと
認識されますが、Excelを外部から(この場合はVB6から)操作する場合は、
どのブック上のシートなのかを明示する必要があります。

# 「objExcelApp」という変数名だと、Excel.Workbookオブジェクトではなく、
# Excel.Applicationオブジェクトを連想してしまうので、改名した方が良いかも。


NJ  2004-01-09 23:28:24  No: 81359

魔界の仮面弁士さん、ありがとうございます。

いま、
objExcelApp.Sheets("Sheet1").Copy After:=objExcelApp.Sheets(1)

と変更して、試させていただきましたが、
「WorksheetクラスのCopyメソッドが失敗しました」なるエラーが出てしまいました。
恐縮ですが、理解いただけますでしょうか?

>Excel内で、VBAにて「Sheets(1)」と書けば、それはそのブック上のシートだと
>認識されますが、Excelを外部から(この場合はVB6から)操作する場合は、
>どのブック上のシートなのかを明示する必要があります。

↑  初心者なもので、大変勉強になりました。ありがとうございます。


魔界の仮面弁士  2004-01-11 03:17:44  No: 81360

>  objExcelApp.ActiveSheet.Paste
この時点で、「どのシートがアクティブになっているか」は保証されません。

処理が曖昧になってしまいますので、Active系やSelect系のプロパティは使用せず、
「どのシート」の「どの位置」に貼り付けるかを明示した方が良いと思いますよ。

> 「WorksheetクラスのCopyメソッドが失敗しました」なるエラーが出てしまいました。

そのファイルが、既にExcelによって開かれていれば、恐らくエラーには
ならないと思いますが、まだ開かれていなかった時は、エラーになるかも知れません。

この場合は、最初に「Excel.Workbook」型のオブジェクトをGetObjectするのではなく、
「Excel.Application」をCreateObjectしてから、.Worksheets.Openなどを使って
ファイルを開くようにすれば、エラーにならずにCopyできると思います。

# もし、どうしてもGetObjectを使わなければならないのであれば、
#     objExcelApp.Windows(1).Visible = True
# などを事前に行っておけば、エラーにならないかも。


NJ  2004-01-14 23:49:07  No: 81361

魔界の仮面弁士さん、ご回答ありがとうございます。
返信遅くなり、申し訳ありません。

>>  objExcelApp.ActiveSheet.Paste
>この時点で、「どのシートがアクティブになっているか」は保証されません。
>
>処理が曖昧になってしまいますので、Active系やSelect系のプロパティは使用せず、
>「どのシート」の「どの位置」に貼り付けるかを明示した方が良いと思いますよ。

objExcelApp.Sheets("Sheet1").Paste After:=objExcelApp.Sheets(1)

のように指定すれば良いのでしょうか?

>> 「WorksheetクラスのCopyメソッドが失敗しました」なるエラーが出てしまいました。
>
>そのファイルが、既にExcelによって開かれていれば、恐らくエラーには
>ならないと思いますが、まだ開かれていなかった時は、エラーになるかも知れません。
>
>この場合は、最初に「Excel.Workbook」型のオブジェクトをGetObjectするのではなく、
>「Excel.Application」をCreateObjectしてから、.Worksheets.Openなどを使って
>ファイルを開くようにすれば、エラーにならずにCopyできると思います。
>
># もし、どうしてもGetObjectを使わなければならないのであれば、
>#     objExcelApp.Windows(1).Visible = True
># などを事前に行っておけば、エラーにならないかも。

はい、今回既存のファイルを開いて、編集後、別名で保存しようとしているのですが、
この場合も CreateObject を使えるのでしょうか?
勉強中なものですみません。。

>#     objExcelApp.Windows(1).Visible = True

上記の一行を追加してみたのですが、「オートメーションエラー」となってしまいました。

GetObjectしてからというのは、困難なのでしょうか?
よろしくお願いいたします。m(_ _)m


魔界の仮面弁士  2004-01-15 00:14:15  No: 81362

> はい、今回既存のファイルを開いて、編集後、別名で保存しようとしているのですが、
> この場合も CreateObject を使えるのでしょうか?

例えば、こんな感じです。

Dim XL As Object  'As Excel.Application
Dim WB As Object  'As Excel.Workbook
Dim WS As Object  'As Excel.Worksheet

'新規にExcelを起動
Set XL = CreateObject("Excel.Application")
XL.Visible = True

'既存ファイルを開く
Set WB = XL.Workbooks.Open(ファイル名)
'操作したいシートを取得
Set WS = WB.Worksheets(シート名)
'シートをコピー
WS.Copy After:=WS
'シートを別名保存
WB.SaveAs 別のファイル名

'変数の解放とExcelの終了
Set WS = Nothing
WB.Close
Set WS = Nothing
XL.Quit
Set XL = Nothing


NJ  2004-01-15 03:21:06  No: 81363

魔界の仮面弁士さん、ありがとうございました。
お蔭様でうまくいきました!!
VBからエクセルを操作するのは初めてですが、まだまだ勉強不足です。
もっと勉強して魔界の仮面弁士さんを目指します!
これからも、ご教授の程よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加