⚠注意⚠この記事は前置き(自分なりの原因追究的思考)が無駄に長いので、すっ飛ばしたい場合は以下の目次をクリック↓
本日、部署内のシフトファイルで使っている「別ブックからデータを転記(コピぺ)するだけのコード」を実行するとなぜか、
オートメーションエラーです。 致命的なエラーです。
という、めっちゃエラーなエラーが発生する事態に陥っていた。
心当たりがないかと言われれば、ある。
先日、【Win10のPCで開いたときだけ】なぜかシフトファイルが異様に重い、ということが発覚(条件付き書式とは無関係※全部同じネットワーク経由なのになぜかWin10PCから開いたときだけ)。
我輩のデスクはWin7で特に違和感無く、10を使用している同期K氏から「1スクロールごとに固まるわ、なんでやろ」と言われて実際に見てみると、マジで1スクロール→1フリーズの状況であった。恐ろしい事にしばらくずっとこの状態で耐えていたらしい。
ちなみに当初、ソイツの使用しているPCまでのネットワークで異常が起きていると予想し(自分のところで問題ないから)、本部のヘルプデスクに問合せさせつつ、
問題の発生しているPCのローカル上に全く同じファイルをコピペ→K氏には「同じファイル保存したから開いてみて、動作問題なかったらネットワークやろ」と言い、分かった問題ない的な返事をされたのでそのまま休憩に。だが、結局ネットワークは異常が無かったらしい。
曰く、「お前らのファイルが重いんじゃね?マクロ入ってるしな」とふざけたことを言われたとのようで、よくわからんまま同期は「はぁ、そうですか」と返して終わらせたと。
んなわけあるかよ!
そのコード常時実行してねーわ!ファイルのアイコンだけ見て適当言ったやろ!
そう苛立ったのだが、途中K氏と話の食い違いがあり、ローカル保存したファイルでの確認の件は伝わっておらず、分かった問題ないの返事はただのなんとなくの相槌だった模様。え、じゃあ今開いてどうよ、と開いてもらうと、ローカル上でも激重だったので、マクロが原因ではないにしてもファイル自体が悪い、と言うことははっきりしてしまった。
その後、改めて自身の席のWin7PCでも開き、よくよく観察。
意識してみたら若干もっさりかもしれん。
最近条件付き書式を整理して軽くしたばっかりなのに!
そんなわけで、内心半ギレしつつ修復作業を開始した。
まず、いつから重くなっているのか。
容量が増えているだとかではないため、見た目には原因不明である。
シフトファイルは毎月コピペコピペで複製されているだけの為、特別な改変が加えられていることは考えにくいが、とりあえず、先月のシフト、先々月のシフト、と遡って確認してみた。
すると、11月分までは正常、12月分から重い、ということが確認とれた。
全然意味が分からんが、さらに思い返すと、最近一回マジでネットワーク異常みたいな現象が起きていたので、そのときにファイル破損したのかもしれない。
ということで非常に面倒だが、
Excelアプリケーション起動→「開く」→ ▼を押す→ 開いて修復するを選択
で、ファイルを修復。
だが、1スクロール1フリーズの状況は改善したのに、なぜか今度はファイル容量が激太り(190MBぐらい。すぐ対処したが、その異様な桁数のファイルサイズにK氏やら事務社員やらがすぐ気づいて、なんかおかしくなってるよー(^o^)と言い出すので焦った)。
ワケ分からんまま不要部分を消しつつ、最終的にはシフト入力しているシートの空白行・空白列を全削除したら改善し、戦いは終わった。
かのように思えたのだが、表題の件である。
デバッグで確認すると、ワケ分からん事にThisWorkbookで引っかかっており、
オブジェクト変数、またはWithブロック変数設定されていません。
である。
ちょっと待て、ただのThisWorkbookだぞ?
なーんでThisWorkbookが効かないんだYO!
ちなみに、
Sub tes()
Debug.Print ThisWorkbook.Path
End Sub
もちろん、これも同様に動かん。ただいみでぃえいとウィンドウに、現ブックの置かれているフォルダパスを出すだけのこのコードが、だ。
当然ながら、修復前ファイルでは正常に作動する状況で、コード文は一字一句違わない。とりあえずモジュールを変更したりなんやかんやしてみたが、それでも改善せずである。
これはもう先日の修復で、更なる問題が起きてしまったとしか考えられない。
一度壊れたものはもう元には戻せない…そういうこったなぁ…。
※正直、こんなぶっ壊れファイルなんか使わずに、正常動作している過去ファイルを複製して使えばいいしそれが最善であるが、既にデータ入力されている事もあって、なんかその作業楽しくないしいいや、という気持ちでそれはやらない。
にしても変なファイル破損状況である。こんな事ってあるのか?参照設定外れてるとか?(適当) そんなことある?
そう思いあちこちのフォーラムを日本語でも英語でも調べてみたが、同様の現象にぶち当たっている人がまあいない。
そんな中。
唯一それっぽい対処法を見つけた。
Application.ThisWorkbook
である。
コイツ、ThisWorkbookと同じ動きをするらしい。というか、Application.ThisWorkbookを短くしたのがThisWorkbookなのか?まあ細かい事は知らんが、とにかく代用できるってことだ!!!
そんなわけで早速、以下を実行↓
Sub tes2()
Debug.Print Application.ThisWorkbook.Path
End Sub
動いたぁあああああ!!
だがまあちょっとまどろっこしい。
そんなときは変数宣言しておけばいいのだ。
Sub tes3()
Dim ThisWorkbook As Workbook
Set ThisWorkbook = Application.ThisWorkbook
Debug.Print ThisWorkbook.Path
End Sub
これでも、めんどくさがりは思うだろう(我輩は思う)。
毎回全プロシージャ内で宣言せねばならんの?共通に出来ない?
と。
そんなときはユーザー定義関数である!!!
Public Function ThisWorkbook() As Workbook
Set ThisWorkbook = Application.ThisWorkbook
End Function
Sub tes4()
Debug.Print ThisWorkbook.Path
End Sub
これで毎度宣言するというクソな行為から解放されるのだ!!
…と、
以上だ。
こんな現象にぶち当たる諸君が、一体どれぐらいの割合でいるのか謎だが、もし、ThisWorkbookが全然使えんわ、となったら、これで対処する事をお勧めする。