問題
昨年、MS-Officeが2016に変わってから、Application.StatusBarが表示されなくなりました。
まったく同じコードでも、Excel2010だとちゃんと表示されるんだけどなぁ。
Application.StatusBar以外は問題ないからとりあえずそのまま使ってるけど・・・。
やっぱり何とかしたい!
へなちょこはめんどくさがりやだから、進捗状況用のフォームとか作るのめんどくさいもん。
今処理してるファイルのファイル名さえわかればいいの。
よし!!
久しぶりにコードとご対面してみようかな。
やってみた1
ググってみたら、Application.StatusBarの前にDoEventsを入れてみては?ってゆー意見が多々。
とりあえず入れてみる。
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.StatusBar = "処理中・・・"
End With
・
・
・
targetFile = Dir(targetPath & "\*.xls*")
・
・
・
Do While targetFile <> "" And InStr(targetFile, "~$") = 0
DoEvents
Application.StatusBar = targetFile & " 処理中・・・"
状況は変わらず。
Application.StatusBarの後にもDoEvents入れたけど、やっぱり表示されない。
やってみた2
ループ2回目で中断して、眺めてみる。
うーーん。
targetFileは問題なく開いてて、StatusBarはちゃんと表示されてるんだけどなぁ・・・。
・・・。
・・・・・・。
・・・・・・っっ!!!
ちょっと関係ない話思い出した!!
Excel2016で[上下に並べて表示]をしたときに、上のウインドウにも下のウインドウにもリボンが表示されるので
「何これ。超うざい」
って思って仕様を確認したら、Excel2013から、ファイルを開いたり新規ブックを作成すると、新しいインスタンスが作られるそうな。
「同じウインドウで開く」とゆー概念がなくなったようです。
どーしてそーなった?Microsoftよ・・・。
シングルで不満はなかったのに。
いや、むしろシングルのほうがいいんだけど。
はい。話戻ります。
つまり、Excel2010は
1つのExcelウインドウで複数のファイルが開いている
ウインドウが1つだから、どちらのファイルがアクティブであってもStatusBarは表示される。
一方Excel2016は
targetFileとマクロ実行ファイルはウインドウが別。
マクロ実行中は、targetFileはバックグラウンドで見えないけど、ActiveなのはtargetFileなのよね。
StatusBarはApplicationクラスだから、ブックの指定はできず、今Activeなブックのウインドウに表示される。
ってことは、StatusBar表示直前に、マクロ実行ファイルをActiveにすればいいんじゃん!?
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.StatusBar = "処理中・・・"
End With
・
・
・
targetFile = Dir(targetPath & "\*.xls*")
・
・
・
Do While targetFile <> "" And InStr(targetFile, "~$") = 0
DoEvents
ThisWorkbook.Activate
Application.StatusBar = targetFile & " 処理中・・・"
マクロを実行してるファイルのStatusBarにファイル名が表示されました♪
ご満悦♪♪
DoEventsはなくてもたぶん大丈夫だけど、
念のため。消し忘れw
それにしても、こーゆー仕様変更やめてほしいなぁ。
一見関係なさそうなとこで、いろいろ問題が起こるんだもんなぁ。
注意
@図まで作って解説風なことを言ってますが、あくまでへなちょこの見解です。
Microsoftの公言ではありません。
Aへなちょこは、オブジェクトは必ずオブジェクト変数に格納して、オブジェクト変数をあれこれします。
ThisWorkBookをActiveにしているので、その後オブジェクトの指定は必須ですよ。
指定してないと悲劇が起こるかも・・・。