エクセルでVBAのコードを仕込んで、ビジネスで利用するには注意が必要です。
他のアプリをやたらと開いていたり、別のエクセルファイルが動いているとか。
他方、基幹ソフトウエアをサーバー経由で開いている時などが、該当しますね。
複雑なコードでなければ、マクロを実行しても、悪影響は及ぼさないでしょう。
ですが、外部のデータを読み込んで煩雑な加工処理をするとなると、少し心配。
使用中のアプリが突然シャットダウンされては、データも保存できず恐ろしい。
原因は良く分かりませんが、業務に支障をきたす問題はなるべく避けたいもの。
なので、こういう時は、ブックを開く時にメッセージボックスで警告をします。
”他のアプリを閉じましたか”と問い合わせて、”Yes”、”No”で分岐命令を出す。
閉じていればブックは開きますが、いいえと答えれば、開かずに閉じてしまう。
こうして、最悪のケースだけは回避する対策を考えてコードを書いて来ました。
ただ、これまでは、他のエクセルが開かれているかどうかをベースにしました。
なので、基幹ソフトまで開いているかどうかの判断は、できなかった分けです。
だけど、問題を起こしたくもないので、調べてみたら面白コードを発見したな。
それは、エクセルにある関数ではなくて、Officeのワードを処理する記述です。
CreateObject関数を使って、ワードのアプリケーションと指定するのがミソ。
つまり、実行中のタスクを返す”Tasks”コレクションの一覧が、取れるわけだ。
これは、”Ctrlキー+Altキー+DELキー”で起動する”タスクマネージャ”と同じ。
つまり、Windowsで開いているアプリをゲットしますが、留意点が一つある。
バックグラウンドで動いている漢字変換なども、余計に列挙してしまうのです。
IMEのような常駐ソフトなどがそうで、これを一覧で書き出せば出るわ出るわ。
だから、この手のアプリは関係ないので、可視化したアプリだけ選択して確認。
Sub Sample01() ’可視化できるアプリを事前に確認して終了させる
Dim WD As Variant, task As Variant, rc As Integer
Set WD = CreateObject("Word.Application") 'Wordを起動
For Each task In WD.Tasks 'Word VBAのTasksコレクション
Select Case task.Visible
Case True
rc = MsgBox(task.Name & vbCrLf & "を終了させますか?", 4 + 32)
If rc = vbYes Then task.Close
End Select
Next
WD.Quit
Set WD = Nothing
End Sub
こうして、VBAに悪さをしそうなアプリは、終了させてしまうという工夫です。
それで、なぜ、ワードに組み込まれているのかは、DTP対策なんじゃないのか。
ワードを使って、印刷物の資料を作成すると、写真、図画の挿入が増えますね。
この引用する資料のデータが大きいので、ワードのファイル容量も大きくなる。
こういったイメージデータは、内部メモリーを消費するのは間違いありません。
だから、ワードで文書を作成する際、メモリーの不足に困らないようにしたい。
昔のウインドウズ98であれば、メモリーも8MBで起動できたから実に貧弱です。
すぐにメモリーを消費してハードディスクにスワップするので遅くなりました。
スワップしまくって書き込みの最中は、動きが鈍くなるので使い物にならない。
だから、マクロを実行させて、不要なアプリを終了させたかったのではないか。
これも、昔語りの思い出ですが、今やディスクがSSDなので高速になりました。
というわけで、このコードは特定のアプリに絞って終了させることも可能です。
サンプルコードを列挙しておきますので、例えば、メモリーの消費しそうな基幹ソフトとか不要なブラウザは、終了させておくとか、それなりに活用できそうな気もするので、ぜひ、試しに使っていただきたいと思ったのでした。
Sub Sample02() ’特定のアプリを終了させる
Dim WD
Set WD = CreateObject("Word.Application")
If WD.Tasks.Exists("Internet Explorer") Then
WD.Tasks("Internet Explorer").Close
End If
WD.Quit
Set WD = Nothing
End Sub
Sub Sample03() '起動中のアプリ名称を列挙する(確認用)
Dim WD, task, n As Long
Set WD = CreateObject("Word.Application") 'Wordを起動します
For Each task In WD.Tasks 'Word VBAのTasksコレクションを
If task.Visible = True Then 'タスク(プロセス)が実行中なら、
Debug.Print task.Name 'タスクの名前を書き出し
End If
Next
WD.Quit
Set WD = Nothing
End Sub
0 件のコメント:
コメントを投稿