VB上からエクセルファイル内のシートのコピーを作成させるには?

解決


吉田  2005-12-17 16:47:21  No: 93286

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


魔界の仮面弁士  2005-12-17 17:44:31  No: 93287

> 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")
のような記述がエラーになるため、オブジェクトの指定忘れを防ぐ事ができます。


吉田  2005-12-18 01:30:14  No: 93288

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

ミスを指摘していただいたのみならず、オブジェクトの使用における注意点を詳し
く説明していただき大変勉強になりました。
どうもありがとうございました。


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

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







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