質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

461閲覧

パスワードなしのブックを開いた後、Excelプロセスが消えない

irohamaru

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/04/12 02:17

編集2019/04/12 02:25

以下コードを実行したところ、パスワードありのExcelファイルを開く際はobjExcelが解放されるのですが、
パスワードなしの場合はSet objExcel = Nothing後もメモリが解放されない事象が起きています。

以下を参考にやってみましたが、DoEventsを挟んでも解決せず。。。
WorkBooks.Openで開いたブックはWorkBooks.Closeでメモリ解放されるのでしょうか?

どなたか原因がわかる方がいらっしゃいましたら回答をお願いします。

vba

1'※tgtPathは対象のExcelファイルパス 2On Error Resume Next 3 4Dim objExcel, wb As Object 5Set objExcel = CreateObject("Excel.Application") 6Set wb = objExcel.Workbooks.Open(tgtPath, Password:=vbNullString) 7 8errDescription = Err.Description 9errNum = Err.Number 10 11' ダイアログ非表示にしてブックを閉じる 12Application.DisplayAlerts = False 13wb.Close 14Application.DisplayAlerts = True 15 16Set wb = Nothing 17objExcel.Quit 18Set objExcel = Nothing 19

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattuwan

2019/04/12 09:01

解決済みですが、 再現するか試してみたいのですが、このコードはエクセルのブックに書いているのでしょうか? それとも他のVBAでしょうか? どのアプリのVBAでしょうか?
guest

回答3

0

ベストアンサー

自分の環境では再現性がなかったので、自分ならこれを試してみる、と言った事を記述します。

①Application.DisplayAlerts = XXX を objExcel.DisplayAlerts = XXX に変える。
②On Error Resume Next をコメントアウトして何かエラーが起こっていないか確認してみる。
③Application.DisplayAlerts = False をコメントアウトして何か起こっていないか確認してみる。

以下①②を適用したものです。

VBA

1'On Error Resume Next 2 3Dim objExcel, wb As Object 4Set objExcel = CreateObject("Excel.Application") 5Set wb = objExcel.Workbooks.Open(tgtPath, Password:=vbNullString) 6 7errDescription = Err.Description 8errNum = Err.Number 9 10' ダイアログ非表示にしてブックを閉じる 11objExcel.DisplayAlerts = False 12wb.Close 13objExcel.DisplayAlerts = True 14 15Set wb = Nothing 16objExcel.Quit 17Set objExcel = Nothing

投稿2019/04/12 03:07

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irohamaru

2019/04/12 04:10 編集

回答ありがとうございます。 Office2010だと事象が発生し、Office2016だと発生しませんでした。 Officeのバージョンの問題かと思います。ひとまず解決とします。
guest

0

解決済ですが、なにをやりたいか解ってないけど、
皆さんのアドバイスを総合するとこんな感じかな?

Sub test() Const myPath As String = "D:\Test1\book100.xlsx" ' Const myPath As String = "D:\Test1\book200.xlsx" Dim AppExcel As Excel.Application Dim wb As Workbook Dim sProm As String sProm = "ファイルが見つかりません。" If Len(Dir(myPath)) = 0 Then GoTo WayOut Set AppExcel = CreateObject("Excel.Application") ' AppExcel.Visible = True On Error Resume Next Set wb = AppExcel.Workbooks.Open(myPath) On Error GoTo 0 If wb Is Nothing Then sProm = "ファイルを開くことをキャンセルしました。" Else wb.Close False sProm = "ファイルを開いて閉じました。" End If WayOut: AppExcel.Quit MsgBox sProm End Sub

エクセル2010で動作確認しましたが、
おっしゃるような現象は確認できませんでした。

想像するに、エラーか何かで止まっていて終わってないのに次々とマクロを実行して、
そんな感じになっているのではないでしょうか?

On Error Resume Nextは、
エラーが出たときデバッグが難しくなるので、
適用範囲を限定して使った方がより良いです。

他もいろいろ指摘したいですが、見て感じて覚えていただけると幸いです。

> WorkBooks.Openで開いたブックはWorkBooks.Closeでメモリ解放されるのでしょうか?

んと、WorkBooks.Closeでは解放されませんが、
End Sub で、解放されるはずです。

ただ、個人的には、気持ち悪いので、
普段は
Set objExcel = Nothing とやっておきますが、
今回の提示の例だけでは、特に問題が無いと思うので、
これでも大丈夫かなとテストしてみたコードを貼ってみました。
参考になれば。

投稿2019/04/13 09:19

編集2019/04/13 09:26
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

objExcel.Quitでなくて、
Application.Quitでもダメですか?

投稿2019/04/12 02:40

FKM

総合スコア3635

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/04/12 02:52 編集

wb.Closeのところでwb.Close(false)にしても良さそうですが...
FKM

2019/04/12 02:59

Excelを閉じて、また開くという工程を繰り返すとメモリは蓄積されなくなります。 他に有効な手段が見つかってないので(stack overflow、Microsoftコミュニティいずれも解決策が見つかってません)。DoEventが利かない以上、メモリ蓄積で止まってしまうよりは 逐一、Excelを開閉した方がいい気はします。
stdio

2019/04/12 03:05

Excelって、アプリケーションごと毎回開くってことですか?なんか処理的に無駄そう。 XLSM,XLSX,XLS等の基本的なエクセルファイルが開ければいい話ではないのですか?
irohamaru

2019/04/12 04:10 編集

Application.Quitだと、マクロを実行しているExcel自身もクローズされてしまうので避けたいですね。。。 Office2010だと事象が発生し、Office2016だと発生しませんでしたので、運用回避でひとまず解決とします。 皆様ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問