お世話になります。ぺんたと申します。
VB6およびEXCEL2002,OSはWINDOWS2000Proにて開発を行っています。
VBからEXCELを起動して、終了してもEXCELが残ったままという現象をよく耳にしますが、今回の現象は自分なりに調べてみてもわからなかったので質問させていただきました。
Private Sub Command1_Click()
Dim ObjExcel As Object
Set ObjExcel = CreateObject("Excel.Application")
ObjExcel.Workbooks.Open "C:\test.xls"
'シートをコピーして名前を変更
ObjExcel.Sheets("Sheet1").Select
ObjExcel.Sheets("Sheet1").Copy after:=Sheets("Sheet1")
ObjExcel.Sheets("Sheet1" & " (2)").Name = "test"
ObjExcel.ActiveWorkbook.Save
ObjExcel.ActiveWorkbook.Close
Set ObjExcel = Nothing
End Sub
以上の処理で、なぜかCOPYの処理を行うと、EXCELが終了しない現象が起こってしまいます。
ほかの処理でもEXCELを起動して書き込むような処理はやっているんですが、
COPY関数を使っていないのでちゃんと終了します。
どなたか、EXCELを終了させる方法おわかりの方いましたら教えてください。
> 終了してもEXCELが残ったままという現象をよく耳にしますが、
VB6なら、その手の問題は「参照設定せずとも動作するコード」に
書き換えれば、たいていは直りますよ。
Excelを参照設定せず、かつ、Option Explicit がある状態にしておけば、
問題のある行(今回はCopyの行)でエラーになるので、発見しやすいです。
> ObjExcel.Sheets("Sheet1").Copy after:=Sheets("Sheet1")
最初のSheet1は、ObjExcel.Sheets("Sheet1") と指定しているのに、
その次のSheet1は、単に Sheets("Sheet1") としか指定していませんよね。
これが終了しない原因。
Excel上からであれば「自分自身」のSheet1である事が明確ですが、
VBからの操作だと、どこのSheet1かが曖昧になるため、暗黙で
Excelのオブジェクトが新規に作成されてしまい、それが原因で
終了しなくなります。
さらにいうと、「objExcel.Sheets("Sheet1")」という表現も、どのワークブック上のSheet1なのかが曖昧なので、止めたほうが良いです。
Set objWB = ObjExcel.Workbooks.Open("C:\test.xls")
のように、Workbookオブジェクトを取得しておいた上で、「objWB.Sheets("Sheet1")」のような指定を使いましょう。
> ObjExcel.Sheets("Sheet1").Select
Select/Selection/Active系のプロパティやメソッドも、極力使わないようにしましょう。
VB6でも、
Text1.Text = "TEST"
の事を、
Text1.SetFocus
ActiveControl.Text = "TEST"
などとは書きませんよね? それと同じことです。
Selectメソッドなどを使って操作すると、動作が遅くなる上、その後のユーザー操作など(別のワークシートが開かれたりするなど)によって、別のオブジェクトが選択される危険性がありますから、多用しない方が安全です。
Dentalさん、ありがとうございました。
教えていただいたところを直したところ無事EXCELが終了しました。
ありがとうございました。
まだまだ基本的なことが勉強不足ですね。
Dentalさんがいろいろ書いていただいたこと、すごく勉強になります。
参照設定しない形でもう一度勉強だと思って作り直してみたいと思います。
今回はどうもありがとうございました。
ツイート | ![]() |