2023年4月19日水曜日

死語になりつつある”DTP、デスクトップパブリッシング”を、ふと思い出してしまったのである ー Application オブジェクト (VBA Word)

      
エクセルで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 件のコメント:

コメントを投稿