WinME+VB6.0SP6環境でプログラミングを行っている吉田と申します。
VB上から既存のエクセルファイル内でシート(sheet1)のコピーを作成し、そのシー
トの名前をインプットボックスに入力した名前に変更するためのテストコードを下
記のように作成し実行しました。
最初に1つ目のコピーを作成するのは正常に動作する(コピーが作成される)のです
が、続けて2つ目のコピーを作成しようとすると
objBook.Worksheets("sheet1").Copy after:=Worksheets("sheet2")
の部分でエラーが発生し「'Worksheets'メソッドは失敗しました:'_Global'オブ
ジェクト」と表示されます。
ちなみに続けてコピーを作成せず、1回ごとに実行を終了させ再実行すると正常に
動作します。
原因についてお気付きの点をご指摘いただければ幸いです、よろしくお願いいたし
ます。
##########################
Microsoft Excel9.0 Object Libraryを参照設定しています。
Private Sub Command1_Click()
Dim objApp As Excel.Application
Dim objBook As Excel.Workbook
Dim strFileName As String
Dim strTemp As String
strTemp = InputBox("新規シート名を記入")
Set objApp = CreateObject("Excel.Application")
strFileName = App.Path + "\test.xls"
Set objBook = objApp.Workbooks.Open(strFileName)
objApp.Visible = True
objBook.Worksheets("sheet1").Copy after:=Worksheets("sheet2")
objBook.ActiveSheet.Name = strTemp
objBook.Save
objApp.Quit
Set objBook = Nothing
Set objApp = Nothing
End Sub
> objBook.Worksheets("sheet1").Copy after:=Worksheets("sheet2")
Sheet1の方は
objBook.Worksheets("sheet1")
と指定しているのに、Sheet2の方は、
objBook.Worksheets("sheet2")
ではなく、
Worksheets("sheet2")
と書いていますよね? ここが原因です。
きちんと上位オブジェクトを明示しましょう。
参照設定をしてしまうと、上位オブジェクトを明示せずに、いきなり
「Worksheets(〜)」と書けてしまうのですが、その記述は避けましょう。
上位オブジェクトの指定が省略されると、VB側で、暗黙のExcelオブジェクトの
インスタンスが生成されるのですが、それが 2回目の実行の場合となると、
新たに CreateObject したExcelとは、別のExcelインスタンスを操作する事に
なってしまうので、オブジェクト操作が失敗してしまうというわけです。
また、1回しか実行しなかったとしても、暗黙のインスタンスが生成される事で、
Excelのプロセスが終了せず、非表示のまま残ってしまうなどの弊害があります。
なお、参照設定を外して、
Dim objApp As Excel.Application
などを、すべて As Object で宣言するようにすると、今回の
> after:=Worksheets("sheet2")
のような記述がエラーになるため、オブジェクトの指定忘れを防ぐ事ができます。
魔界の仮面弁士さんResをありがとうございます。
ミスを指摘していただいたのみならず、オブジェクトの使用における注意点を詳し
く説明していただき大変勉強になりました。
どうもありがとうございました。
| ツイート |
|