はもちくわ

コードについて自分なりの解釈を書いてます。

やっぱりファイル名って被ることがあるぞ!(反省・・・)

バイト先で、私がExcelVBAで作ったシステムに、すごい久しぶりにバグが出たんです。どうも、ファイルからデータを自動読込みする際に、こちらの意図した挙動になってないファイルがあるのです。

それでですね、ちょっとこの原因を突き止めるのに時間がかかったんです。
なんで時間がかかったのか?といいますと、、、、常々バイト先では、私、肉体労働が本業なので、自作コードは作りっぱなしで、あまり見返してないんです。なので、久しぶりに呼ばれて自分のコードを見返したせいもありますし、そもそも深刻なエラーでもなかったので、ぶっちゃけ面倒くさいから後回しにw、、、、、あーーー、いえいえw、、、結局、私の思い込みが原因だったのですがw
ちゃんと突き止めました。

 

どんなことが起きたのかと言いますと、まず、私の作ったシステムは下のようになってました。

取引先からメールで届くExcelファイルを所定のフォルダに気づいた人がバンバンいれている状態がありまして、自作システムは起動するたびに、そのフォルダを見に行きます。そして、フォルダ内のファイルが、過去一覧と照合し、読んだことがないか?、ファイルが更新されているかどうか?を判定し、条件に一致したら、データベースにファイル情報を追加するという処理をします。システムからフォルダを見に行くときは、Dirを使い、過去一覧と比較してます。このときのファイル更新日はFileDateTimeで取得してます。ちなみに、過去一覧はCSV形式でシステム側のフォルダに保存しているのでシステム起動と同時に配列に入っている状態です。



どうでしょう?システム側の状態はご理解いただけましたでしょうか?この設計で1年以上無事に動いていたので、完成!って思ってました。
で、何が起こったのか?ですが、、、それは、起動のたびに、必ず1つのファイルが条件をすり抜けて読み込まれてしまうのです。
もちろん、ファイル名も更新日時も変わってないのに、です。。。。

おーーーー???ってVBAのステップインでデータを確認してみます。
すると、、、ファイル名はフォルダ側と過去一覧が同じ、、、、、で、更新日はフォルダ側が「2023.6.10 10:38」、過去一覧が「2022.6.10 10:38」
一緒ということは、、、、、コードの判断条件は、以上じゃなくてより大きいにしてるから、スルーされるはず、、、、、、あれ?なんで読み込み処理になるんだ?!

と、気づかないでかなり長いこと悩んでいたわけですよ!(笑)
みなさんはもう気づきましたよね?
はい!そうです!全く同じ日の同じ時間で「年」が違うんです!!そう、去年のファイル名と同じものが入り込んでいたのです!!

同じフォルダ内に同じファイル名が入るはずはないのですが、気の利く面倒見の良いかたが、フォルダ内を整理してくれたんです。過去ファイルは別フォルダを作ってそちらに移動してくれていたんですね。で、システムが作る過去一覧はファイルがなくなっても消えずに残っているので、同じファイル名だけど違うファイルを何回も読み込んでしまっていたというわけです。
そして!さらに奇跡が起きてまして、この送られてくるファイル名なのですが、取引先の複数の方が各々自由に設定されているものなので、あまり被らないのですが、「基本ファイル名(月.日)」のように年を抜いた日付を入れてくれる方が、去年と同じ日の同じ時間に、同じファイル名で送ってくれていたのです!

いやー、本当におどろいた。偶然が重なるってこういうことなんですね〜。
結局、過去一覧のファイル更新日が新しくなっていた場合は、更新する処理を追加し、さらに、読み込まれたデータ自体が被ってないか照合する処理も追加して解決しました。
このファイル更新日を更新する処理自体をしてなかったのは致命的ですwもともとはデータベース側で更新日を管理していたつもりだったのですが、同じファイルが違うファイル名として入っていたことを想定していたので、ファイル名が違うときは更新日を照合する処理をしていたのに対して、同じファイル名で更新日が新しいのは、絶対にデータが更新されているわけだから、なにも照合処理はせずに、データ日付を上書きするだけにしてたんです。意味ない更新日管理になってましたw
バカだなぁ....って反省しました。

バグ見つけるために、とにかくたくさん使ってもらって、、、と思ってましたが、やはり、もっとトリッキーな使い方をする方がいると、もっと早くバグを潰せるのになぁって思いました。

「一緒になるわけない」より「一緒になるかもしれない」って思えるほうが安全な橋を渡れますね。今後は気をつけよう!と思いました。みなさんもお気をつけください。。。