お世話になっております。
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
---
よろしくお願いします。
> objExcelApp.Sheets("Sheet1").Copy After:=Sheets(1) '●エラー発生
上記の「Sheets(1)」が原因でしょう。
これですと、どのワークブック上のシートを操作しているかが
曖昧になってしまいますよね。objExcelApp.Sheets(1)などとしましょう。
Excel内で、VBAにて「Sheets(1)」と書けば、それはそのブック上のシートだと
認識されますが、Excelを外部から(この場合はVB6から)操作する場合は、
どのブック上のシートなのかを明示する必要があります。
# 「objExcelApp」という変数名だと、Excel.Workbookオブジェクトではなく、
# Excel.Applicationオブジェクトを連想してしまうので、改名した方が良いかも。
魔界の仮面弁士さん、ありがとうございます。
いま、
objExcelApp.Sheets("Sheet1").Copy After:=objExcelApp.Sheets(1)
と変更して、試させていただきましたが、
「WorksheetクラスのCopyメソッドが失敗しました」なるエラーが出てしまいました。
恐縮ですが、理解いただけますでしょうか?
>Excel内で、VBAにて「Sheets(1)」と書けば、それはそのブック上のシートだと
>認識されますが、Excelを外部から(この場合はVB6から)操作する場合は、
>どのブック上のシートなのかを明示する必要があります。
↑ 初心者なもので、大変勉強になりました。ありがとうございます。
> objExcelApp.ActiveSheet.Paste
この時点で、「どのシートがアクティブになっているか」は保証されません。
処理が曖昧になってしまいますので、Active系やSelect系のプロパティは使用せず、
「どのシート」の「どの位置」に貼り付けるかを明示した方が良いと思いますよ。
> 「WorksheetクラスのCopyメソッドが失敗しました」なるエラーが出てしまいました。
そのファイルが、既にExcelによって開かれていれば、恐らくエラーには
ならないと思いますが、まだ開かれていなかった時は、エラーになるかも知れません。
この場合は、最初に「Excel.Workbook」型のオブジェクトをGetObjectするのではなく、
「Excel.Application」をCreateObjectしてから、.Worksheets.Openなどを使って
ファイルを開くようにすれば、エラーにならずにCopyできると思います。
# もし、どうしてもGetObjectを使わなければならないのであれば、
# objExcelApp.Windows(1).Visible = True
# などを事前に行っておけば、エラーにならないかも。
魔界の仮面弁士さん、ご回答ありがとうございます。
返信遅くなり、申し訳ありません。
>> 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
> はい、今回既存のファイルを開いて、編集後、別名で保存しようとしているのですが、
> この場合も 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
魔界の仮面弁士さん、ありがとうございました。
お蔭様でうまくいきました!!
VBからエクセルを操作するのは初めてですが、まだまだ勉強不足です。
もっと勉強して魔界の仮面弁士さんを目指します!
これからも、ご教授の程よろしくお願いします。
ツイート | ![]() |