Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No21410.EXCEL.EXEがタスクマネージャに残ってしまう

タイトルEXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21410
投稿日: 2005/08/03(Wed) 22:21
投稿者: VBA難しい
OS:WINDOWS XP
Access Version:2003

はじめまして。早速ですが、質問です。
現在データベースからデータを取り出してEXCELブックに集計表として出力しようとしているのですが、
EXCEL操作用のobject変数をbookはclose、
ApplicationはquitしたあとにNothingにSetしているにもかかわらず、
EXCEL.EXEがタスクマネージャに残る現象に悩まされています。

自分でもいろいろ調べまして、きちんとNothingとclose、quitメソッドも使用したり、
不必要なobject変数を使わないようにしたのですが、解決できませんでした。

しかし原因と思われるところはなんとか特定できました。
あらかじめ罫線の引いてあるセルをcopyメソッドとpasteメソッドを使って
必要な分だけ表を作っていくという仕様なのですが、
copyメソッドまでの実行ならば、bookとApplicationを閉じてNothingをsetすれば
EXCEL.EXEはタスクマネージャに残らないのですが、
Pasteメソッドを使用すると、どういうわけか同じ処理をしてもEXCEL.EXEが残ってしまいます。

どうすればEXCEL.EXEを残さずに出来るのでしょうか。

タイトルRe: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21412
投稿日: 2005/08/03(Wed) 22:29
投稿者: みるく
> どうすればEXCEL.EXEを残さずに出来るのでしょうか。

コードの提示がないので、どういう間違いをしているのかは不明です。



とりあえず、よくある間違いのパターンから推測。

> Pasteメソッドを使用すると、どういうわけか同じ処理をしてもEXCEL.EXEが残ってしまいます。
>
ってことは、
ActiveSheet.Paste

とか、いきなり、Excelのオブジェクトやメソッドから書きはじめてない?

タイトルRe^2: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21414
投稿日: 2005/08/04(Thu) 09:21
投稿者: VBA難しい
お返事ありがとうございます。
ソースは以下のような形です。
Openしてるブックのコピー先のセルにはあらかじめ罫線が引いてあります。

Dim objXLS As Excel.Application
Dim objBK As Workbook
Dim iCnt As Integer
Set objXLS = CreateObject("Excel.Application")
Set objBK = objXLS.Workbooks.Open("C:\Excel.xls")
objXLS.DisplayAlerts = False
objBK.Activate

For iCnt = 1 to 10
'1.列範囲コピー&ペースト
objBK.Worksheets(1).Range("C1:C3").Copy
objBK.Worksheets(1).Paste Destination:=objBK.Worksheets(1).Range(Cells(1, iCnt), Cells(3, iCnt))
'2.値貼り付け
objBK.Worksheets(1).Cells(2, iCnt).Value = """項目名"""
Next iCnt

objXLS.DisplayAlerts = False
objBK.Close SaveChanges:=True
objXLS.Workbooks.Close
objXLS.DisplayAlerts = True
objXLS.Quit

Set objBK = Nothing
Set objXLS = Nothing

> > Pasteメソッドを使用すると、どういうわけか同じ処理をしてもEXCEL.EXEが残ってしまいます。
> >
> ってことは、
> ActiveSheet.Paste
>
> とか、いきなり、Excelのオブジェクトやメソッドから書きはじめてない?
objectはきちんと指定しないと危険という事ですよね。
その点には留意しているつもりです。

タイトルRe^3: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21415
投稿日: 2005/08/04(Thu) 10:05
投稿者: 小僧
VBA難しい さん:
おはようございます。

> > とか、いきなり、Excelのオブジェクトやメソッドから書きはじめてない?
> objectはきちんと指定しないと危険という事ですよね。
> その点には留意しているつもりです。

> objBK.Worksheets(1).Paste _
> Destination:=objBK.Worksheets(1).Range(Cells(1, iCnt), Cells(3, iCnt))
~~~~~ ~~~~~
> '2.値貼り付け
> objBK.Worksheets(1).Cells(2, iCnt).Value = """項目名"""

「Cells」 って何のオブジェクトでしょうかね。



Sub てすと()
Dim objXLS As New Excel.Application
Dim objBK As Excel.Workbook
Dim iCnt As Long

Set objBK = objXLS.Workbooks.Open("C:\Excel.xls")
With objBK.Worksheets(1)
For iCnt = 1 To 10
'1.列範囲コピー&ペースト
.Range("C1:C3").Copy
.Paste .Range(.Cells(1, iCnt), .Cells(3, iCnt))

'2.値貼り付け
.Cells(2, iCnt).value = """項目名"""
Next iCnt
End With

objBK.Close SaveChanges:=True
objXLS.Quit

Set objBK = Nothing
Set objXLS = Nothing
End Sub

タイトルRe^4: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21417
投稿日: 2005/08/04(Thu) 11:59
投稿者: VBA難しい
> VBA難しい さん:
> おはようございます。

お昼になってしまいましたが、おはようございます。

> 「Cells」 って何のオブジェクトでしょうかね。

ACCESSに触り始めてまだ3ヶ月なのでCellとRangeオブジェクトは何となくシートのオブジェクトなのかなーと考えてます。自信はありませんが。
SELECTIONは何のオブジェクトなんでしょう・・・?

>
> Sub てすと()
> Dim objXLS As New Excel.Application
> Dim objBK As Excel.Workbook
> Dim iCnt As Long
>
> Set objBK = objXLS.Workbooks.Open("C:\Excel.xls")
> With objBK.Worksheets(1)
> For iCnt = 1 To 10
> '1.列範囲コピー&ペースト
> .Range("C1:C3").Copy
> .Paste .Range(.Cells(1, iCnt), .Cells(3, iCnt))
>
> '2.値貼り付け
> .Cells(2, iCnt).value = """項目名"""
> Next iCnt
> End With
>
> objBK.Close SaveChanges:=True
> objXLS.Quit
>
> Set objBK = Nothing
> Set objXLS = Nothing
> End Sub

小僧さん、ありがとうございます。
上記のようにシート以下の操作をwithでまとめることで、
EXCEL.EXEがタスクマネージャから消えるようになりました。

オブジェクトをきちんとたどって書くだけでなく、
withによってクラスとサブクラスのように扱うことで
メモリうんぬんの処理がある場合でも、
こちらの意図したとおりに動いてくれるという事なんでしょうか。

原因と解決理由は勉強不足のためわかりませんが、
方法はわかったので、これにて解決とします。
ありがとうございました。

タイトルRe^5: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21418
投稿日: 2005/08/04(Thu) 13:06
投稿者: 小僧
VBA難しい さん:
こんにちは。

もう閉じられてしまいましたが、

「Cells」は「WorkSheet」配下のオブジェクトです。
(上位オブジェクトからの参照を忘れていますよ、って事です。)

> objBK.Worksheets(1).Paste _
> Destination:=objBK.Worksheets(1).Range(Cells(1, iCnt), Cells(3, iCnt))

は、

objBK.Worksheets(1).Paste _
Destination:=objBK.Worksheets(1).Range _
(objBk.Worksheets(1).Cells(1, iCnt), objBk.Worksheets(1).Cells(3, iCnt))

で動くと思います。(未検証です)

>withによってクラスとサブクラスのように扱うことで

これは「objBK.Worksheets(1)」の記述が多かったので、
見やすくするために「With」ステートメントを使ってみました。

オートメーションを使って Excel を操作する際に、
特定のシート内での処理での操作が続く場合は便利ですよ。

タイトルRe^6: EXCEL.EXEがタスクマネージャに残ってしまう
記事No: 21422
投稿日: 2005/08/04(Thu) 14:29
投稿者: VBA難しい
> VBA難しい さん:
> こんにちは。
>
> もう閉じられてしまいましたが、
>
> 「Cells」は「WorkSheet」配下のオブジェクトです。
> (上位オブジェクトからの参照を忘れていますよ、って事です。)
>
> > objBK.Worksheets(1).Paste _
> > Destination:=objBK.Worksheets(1).Range(Cells(1, iCnt), Cells(3, iCnt))
>
> は、
>
> objBK.Worksheets(1).Paste _
> Destination:=objBK.Worksheets(1).Range _
> (objBk.Worksheets(1).Cells(1, iCnt), objBk.Worksheets(1).Cells(3, iCnt))
>
> で動くと思います。(未検証です)

小僧さんわざわざ説明ありがとうございます。つまり、Cellsオブジェクトについての発言は
ヒントだったわけですね。
お恥ずかしい限りです。


> これは「objBK.Worksheets(1)」の記述が多かったので、
> 見やすくするために「With」ステートメントを使ってみました。
>
> オートメーションを使って Excel を操作する際に、
> 特定のシート内での処理での操作が続く場合は便利ですよ。

これもまことに恥ずかしい・・・。
精進します!ありがとうございました。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

アメリカ合衆国やヨーロッパのデータセンターからcPanelレンタルサーバーをご提供します。お支払いは日本国内の銀行振込で...。1ヵ月契約からOKです。
アメリカ合衆国やヨーロッパからcPanelレンタルサーバー。
お支払いは日本国内の銀行振込。
最短契約期間は1ヵ月契約からOKです。

 

ページの先頭へ 前ページへ戻る