「昨日まで動いていたのに今日から全部エラー」の正体|式に打ち込んだ日付が時限爆弾になる

「昨日まで動いていたのに今日から全部エラー」の正体|式に打ち込んだ日付が時限爆弾になるのアイキャッチ トレード自動化実録

先週まで問題なく動いていた管理表が、今日開いたら全部「期限切れ」になっている。式もデータも誰も触っていない。壊したのは自分か、AIか、それともパソコンか。

誰も壊していません。壊れる日が最初から決まっていただけです。

⚠️ この記事の情報は2026年8月時点のものです。記事に出てくる株のシステムは相場を観測・研究するためのもので、自動発注はしません(read-only)。実際のお金での発注はしていません(仮想発注のみ・実発注なし)。ソフトの画面や仕様は変わるため、内容は随時更新します。

この記事で分かること

あなたのファイルは「ある日から急におかしくなった」のではなく、「作った瞬間から、おかしくなる日が決まっていた」状態です。プログラムの世界では、これを時限爆弾(time bomb)と呼びます。

  • なぜ「一部」ではなく「まとめて」壊れるのか(原因の見分け方)
  • 3分でできる自己点検の手順3つ(本番のファイルを直す前にやること)
  • 固定してよい日付と、固定してはいけない日付の線引き

結論を先に置きます。犯人は「式やデータのどこかにベタ書きされた日付」と「今日と比べて判定する式」の組み合わせです。この2つが同じシートに同居した瞬間、そのファイルには賞味期限が発生します。判定する式そのものは、たいてい正しい。直すのは日付を書いた側です。

【早見表】症状→疑う原因→最初に見るところ

ここだけ読めば当たりが付きます。

症状疑う原因最初に見るところ
作った直後は正しかったのに、数日〜数週間後のある日から全行がNGになったベタ書きの日付 × 今日と比べる式式の中の TODAY / NOW / DATEDIF
1行だけでなく、判定列がまとめて同じ結果に倒れている全行が共有している1つの基準日基準日を持っているセル、または元データの日付列
ファイルを閉じて開き直すと結果が変わる/再計算するたび変わるその式が「今日」を見ている再計算で値が動く列を特定する
昨日のバックアップを開いても同じくNGになるファイルではなくPCの日付が判定に効いている過去のファイルでも同じ症状か確認
AIに作ってもらったシートやスクリプトで起きたサンプルデータに書かれた固定の日付入力データ側(式ではなく元表)

4行目の「バックアップでも再現する」は、特に効きます。ファイルが壊れたなら、古いコピーは無事なはずですから。古いコピーでも同じく落ちるなら、壊れているのはファイルではありません。

症状:コードもデータも触っていないのに、ある日から一斉におかしくなる

「作った直後は正しかった」が最大のヒント

作った直後に検算して、正しかった。これがいちばん重要な情報です。

式の書き間違いなら、作った初日から間違っています。参照先のズレも、列の増減も、たいてい最初の1回で露見する。「初日は合っていた」ものが後日崩れるなら、変わったのはファイルの外側だけです。

ファイルの外側で変わるものは、そう多くありません。まず疑うのが日付。次に、外部ファイルへのリンク先が更新された、共有ブックを他の人が編集した、外部データの取り込み元やフォルダのパスが変わった、あたりです。この記事で扱うのは、最有力候補である日付のほうです。

「AIが余計なことをした」と疑いたくなる気持ちは分かります。私も最初はそう疑いました。でもAIは、あなたが閉じたファイルを夜中に開いて書き換えたりはしません。

一部ではなく“まとめて”壊れるのが特徴

もう一つの見分け方が、壊れ方の「幅」です。

入力ミスや例外的なデータが原因なら、おかしくなるのは数行です。ところが日付の時限爆弾は、全行が同じ1つの基準日を共有しているため、境目の日を過ぎた瞬間にまとめて同じ側へ倒れます。昨日まで全部OK、今日から全部NG。中間がない。

原因:固定で打ち込んだ日付 ×「今日との差」で判定する式

固定してはいけない日付と固定のままでよい日付を、使い道・書き方・起きること・正しい形の4項目で並べて比較した図
同じ「日付」でも、今日と比べるのか差だけ使うのかで扱いが正反対になる

仕組みを分解すると、単純です。

  1. データ側に、ある日付が文字として書き込まれている(例:基準日、更新日、取得日)
  2. 判定側の式が、その日付と今日の差を計算して「新しいか/期限内か」を決めている
  3. 1の日付は動かない。2の「今日」は毎日進む
  4. 差が許容範囲を超えた日から、判定が反転する

作った当日は差がゼロなので、当然OKが出ます。テストも通る。安心して運用に乗せる。そして、決められた日数を過ぎた朝——早ければ数日後に——全部が赤くなる。

「爆弾」という比喩が的確なのは、仕掛けた瞬間には何も起きないからです。

実録:入力データ側に書かれた1つの固定日付で、10件の検査が一斉に落ちた

私が運用している株の観測システム(繰り返しますが観測・研究用で、自動発注はしません。実際のお金での発注もしていません)で、まさにこれを踏みました。時系列で書きます。

  • 作った日:動作確認用の入力データを組み立てる部分で、資産状況の「基準日」の欄に固定の日付を文字で書き込んだ。全件通過。緑。
  • 4日後:同じコード、同じ設定のまま、統合テスト10件が一斉に失敗。書き込んだ基準日が、あらかじめ決めてあった古さの許容日数を超えたのがこの日でした。前日までは全部緑。
  • そこから約3週間:赤いまま、誰も気づかなかった。原因を追いはじめたのは、赤くなってから3週間後です。

ここで怖いのは、壊れるまでが4日と短かったことではありません。壊れたことに気づくまでに3週間かかったことです。時限爆弾の本当の厄介さは、爆発の早さではなく、爆発したのに誰も音を聞いていない時間の長さのほうにあります。

仕掛けはこうです。システムには「資産状況の書き写しが古いなら、新しい判断を進めない」という安全装置が入っています。古さの判定は、データに書かれた基準日と実行したときの当日(PCの時計)の差で決まる。ところが入力データ側の基準日は、固定の文字列で書かれていた。だから、書いた日から決められた日数が過ぎた時点で、この安全装置が正しく作動してしまった。

安全装置が働くと、その先の処理が止まります。10件の検査は「その先の処理が進んだ状態」を前提に書かれていたので、前提ごと崩れて全滅した。10件が別々の理由で壊れたわけではなく、上流の1か所が止まって10件を巻き込んだ形です。

判定ロジックは正しかった(直したのは入力データ側だけ)

ここが、この失敗のいちばん大事な部分です。

最初に頭をよぎったのは「判定が厳しすぎるから緩めよう」でした。許容日数を伸ばせば、その日のうちに全部緑に戻ります。でもそれは、火災報知器がうるさいから電池を抜くのと同じです。「古い情報のまま先に進まない」は安全側の設計であって、劣化ではない。

実際に直したのは入力データ側だけ。判定ロジックのファイルは1つも変更していません(変更0ファイル)。基準日を「実行したときの日付から組み立てる」形に置き換えただけです。

Excelに置き換えるなら、こういうことです。「期限切れ判定の式を甘くする」のではなく、「元表の更新日を今日の日付から作る」。直す場所が違えば、直り方も違います。

エラーが出た側を直す前に、「そのエラーは正しい指摘ではないか」を一度疑う。

3分でできる自己点検

自己点検の3手順を並べた図。手順1は式の中のTODAY・NOW・DATEDIFを探す、手順2は比べている相手に固定の日付がないか見る、手順3は作業用コピーの基準日セルを未来の日付へ打ち替える
図:本番のファイルを直す前に、この3手順で当たりを付ける

本番のファイルを書き換える前に、この3手順で当たりを付けます。順番どおりに。手を動かすのは作業用のコピーだけです。

手順1:TODAY() / NOW() / DATEDIF が式のどこにあるか探す

Excelなら Ctrl+F を押します。ここで注意が1つ。出てきたダイアログには、最初は「検索場所」の欄がありません。右下の「オプション >>」を押すと、下に隠れていた設定欄が開きます。

  1. Ctrl+F を押す
  2. ダイアログ右下の「オプション >>」を押す
  3. 現れた「検索場所」を「値」から「数式」に切り替える
  4. 次の3語を順に探す
  • TODAY=今日の日付を返す関数。開くたびに計算し直され、日付が変われば値も変わる(同じ日のうちは何度開いても同じ値。ブックの計算方法が「手動」のときは、F9 を押して再計算するまで変わりません)
  • NOW=今の日時を返す関数。日付だけでなく時刻も動く
  • DATEDIF=2つの日付の差(日数・月数・年数)を出す関数

1つでも見つかったら、そのセルは「今日」に依存しています。まだ犯人と決まったわけではありません。ここは容疑者リストを作る工程です。

手順2:その式が比べている相手を見る

容疑者の式が、何と比べているかを追います。見るのは比較の相手側です。

  • 相手が「毎回入力される実データの日付」なら、たいてい健全
  • 相手が「一度打ち込んだきりの固定の日付」なら、それが爆弾

AIに作ってもらったシートやスクリプトで特に多いのが後者です。AIは動作確認のために、その場でもっともらしいサンプルの日付を書き込みます。作った当日は正しい。作った当日だけ正しい。悪意ではなく、「今日」を知らないまま形を整えた結果です。

元表の更新日欄、設定シートの基準日、コード内のサンプルデータ。この3か所を見てください。

手順3:シートの中だけで未来へ行く(PCの時計は触らない)

いちばん確実な確認方法は、未来へ行ってみることです。ただしPCの時計を動かす必要はありません。式が見ている「今日」を、シートの中で差し替えれば同じことができます。こちらのほうが速く、後片付けもいりません。

まず、作業用のコピーを作ってから始めてください。

  1. 空いているセルを1つ用意する。ここでは B1 とします
  2. B1 に =TODAY() と入れる
  3. 手順1で見つけた式の TODAY() を、$B$1 に置き換える
  4. ここまでで、判定結果が置き換える前と同じことを確認する(同じでなければ、置き換えをどこか間違えています)
  5. B1 を 手入力の日付に打ち替える。1週間後 → 1か月後 → 1年後、と順に進めてみる
  6. 判定列が反転したら、犯人は確定です

反転した日付が分かれば、そのファイルの賞味期限そのものが分かります。「あと何日もつのか」まで見えるのは、この方法だけです。確認が終わったら B1 を =TODAY() に書き戻して終わり。PCにも他のアプリにも、いっさい影響しません。

※値が変わらないときは F9 を押してください。ブックの計算方法が「手動」になっていると、日付を変えても再計算されません。

最終手段:それでも切り分けられないときだけ、PCの時計を進める

シートの外側——取り込み処理やアプリ本体、マクロ——が「今日」を見ている場合は、B1 の差し替えでは再現しません。そのときに限って、PCの時計を進めます。ただし、これは最後の手段です。先に読んでほしい注意があります。

  • 会社支給のPCではやらないでください(管理ポリシーやセキュリティソフトに引っかかります)
  • ブラウザで証明書エラーが出て、サイトが開けなくなります。サイトの安全証明書には有効期限があり、未来の日付から見ると「期限切れ」と判定されるためです。時計を大きく進めるほど、確実に起きます
  • 同じ理由で、Windows Updateやアプリの更新、サインインが失敗することがあります。MicrosoftやGoogleのアカウントは、時刻がずれているとサインアウトされることがあります
  • ずらしている間に保存したファイルは、更新日時が未来の日付になります。必ずテスト用のコピーで試す
  • 進める幅は +1日から数日までにとどめます。+1年のような大きな移動は、上のトラブルがまとめて出るのでおすすめしません。長い先を見たいときは、手順3のB1差し替えでやってください

そのうえで、Windowsでの手順です。

  1. 他のアプリをすべて閉じる(特にメール、クラウド同期、ブラウザ)
  2. 「設定」→「時刻と言語」→「日付と時刻」を開く
  3. 「時刻を自動的に設定する」をオフにする
  4. 「日付と時刻を手動で設定する」の「変更」から、日付を1日〜数日だけ進める
  5. 対象のファイルを開いて再計算し(Excelは F9)、判定列を見る
  6. 確認が終わったら3の「時刻を自動的に設定する」をオンに戻す
  7. 同じ画面の「今すぐ同期」を押す。オンに戻しただけでは、すぐに正しい時刻へ戻らないことがあります
  8. 画面右下の時計が現在の日時に戻っているか、目で確認する。戻っていなければ、もう一度「今すぐ同期」を押す

時計を進めた瞬間に判定が反転したなら、犯人は確定です。

私自身は Excel ではなくプログラムのテストで確かめました。修正したあと、時計を +1日 / +30日 / +1年 / +5年 に進めて動かす掃引を行い、対象のテスト1本(28件)が全部通ることを確認しています。修正後は全体でも406件すべて通りましたが、こちらは通常の時刻での実行です。長い先まで進めているのはテスト環境での話なので、ふだん使いのPCで真似することはおすすめしません。

直し方:日付は「実行時に組み立てる」形にする

考え方は一行で言えます。「今日と比べる相手の日付」は、書き置きせず、その場で作る。

Excelでの書き換え:基準日セルを1つ作る

いきなり全部の式を直すと、どこを変えたか分からなくなります。まず基準日を1か所に集めるところから。

  1. 設定用のシート(なければシートの上部)に「基準日」のセルを1つ作る。ここでは B1 とします
  2. B1 に =TODAY() と入れる
  3. 判定の式は、TODAY() を直接書かずに $B$1 を参照する形に統一する

手順3では作業用のコピーでこれをやりましたが、本番のファイルにも同じ形を残しておきます。こうしておけば、点検したくなったときにいつでも B1 を手入力の日付に差し替えて「その日に何が起きるか」を試せます。時計をいじらずに未来へ行ける状態を、そのまま持ち続けられるということです。運用に戻すときは B1 を =TODAY() に書き戻すだけ。

固定文字列をTODAY()由来に置き換える

次に、元表に書き置きされた固定日付を潰します。ありがちなのが、更新日の欄にこう入っているケース。

【危険】元表の更新日セル
  2026/4/1        ← 打ち込んだきり動かない

判定式
  =IF(DATEDIF(更新日, TODAY(), "D") > 許容日数, "期限切れ", "OK")
  → 許容日数を過ぎた日から、全行が「期限切れ」に倒れる

直し方は2通り。その表が本当に毎回更新されるなら、更新日は取り込み処理の側で今日の日付を書き込む形にします。手作業なら、更新したときに Ctrl+;(コントロール+セミコロン)で今日の日付を打つ運用に変える。

その日付が「常に新しいことにしたい」だけの飾りなら、素直に =$B$1 にします。私が直したのも、実質これでした。書き置きの日付をやめて、実行したときの日付から組み立てる関数に置き換えた。

【安全】元表の更新日セル
  =$B$1           ← 基準日セル(=TODAY())を参照

判定式は1文字も変えない
  =IF(DATEDIF(更新日, TODAY(), "D") > 許容日数, "期限切れ", "OK")
  → いつ開いても差はゼロ。判定の厳しさは変えていない

判定式に手を入れていないのがポイントです。安全装置の感度は元のまま。直したのは、装置に渡す入力のほうだけ。

早見表:固定してよい日付/固定してはいけない日付

「じゃあ日付は全部 TODAY() にすればいいのか」と言うと、そうではありません。ここを間違えると、別の不安定さを呼び込みます。

固定してはいけない固定のままでよい
その日付の使い道今日と比べて期限・鮮度を判定する日付どうしの差や順番だけを使う
更新日、有効期限の起点、点検基準日経過時間の計算、イベントの並び順、所要時間
放置するとどうなる書いた日から一定日数後に一斉NG何も起きない(いつ動かしても同じ結果)
正しい形実行時の日付から組み立てるそのまま固定。触らない

「今日と比べる日付」は固定禁止

判定の相手が「今日」なら、片方だけ止まっている状態は、いつか破綻します。時間の問題ではなく、時間そのものが原因だからです。ここは例外なく、実行時に組み立てる。

「差だけ使う日付(経過時間・順序)」は固定のままが正しい

逆に、「10時00分の次に10時05分が来る」といった差と順序しか使わない時刻は、固定のままが正解です。私も修正のとき、この種の時刻はあえて固定で残し、その理由を注釈として書き残しました。実時刻に寄せると動かす曜日や時間帯によって結果が変わるからです。土曜に動かしたら落ちる、夜に動かしたら落ちる。そんな検査は、壊れているのか正しいのか判別できません。

「日付は動的に」ではなく、「今日と比べるものだけ動的に」。ここが線引きです。

再発防止:点検シート自体を点検する1行を足す

直しただけでは、また誰か(未来の自分やAI)が固定日付を書き戻します。そこで私は、「この入力データは常に新しいこと」自体を確かめる見張りを新しく作りました。固定日付を書き戻した瞬間、理由つきで即座に失敗するようにしてあります。

Excelでも同じことができます。基準日セルの隣に、こんな1行を置くだけ。

=IF(DATEDIF($B$1, TODAY(), "D") > 許容日数,
    "⚠️ 基準日が古い:B1が固定の日付になっていないか確認",
    "基準日OK")

大事なのは、メッセージに「どこを見ればいいか」を書いておくことです。「エラー」とだけ出る警告は、半年後の自分にとって何の助けにもなりません。

ちなみに、この一件には副産物がありました。落ちた10件のうち1件は、「1回の取引で許す損失が、決めた上限を超えていないか」を見る検査です。この検査は、期間中赤くはなっていました。ただし赤くなった理由は「取引が成立している」という前提が崩れたことで、肝心の上限そのものは一度も検査されていなかったのです。直した後は、実際のデータで上限が確かめられるようになりました。

「エラーが出ている=検査が働いている」とは限りません。エラーの手前で止まっていると、その先の検査は動いていない。赤い印を見たら、赤くなった理由が「本当に見たかったこと」なのか、それとも「そこへ行き着く前の準備」なのかを、一度確かめる価値があります。

同じ直し方は別の系統にも移植して、そちらでも10件の失敗が0件になったことを記録しています。

非エンジニアが得た教訓

  • 「初日は正しかった」は原因を絞る手がかり。式の間違いなら初日から間違っている。後から崩れたなら、変わったのはファイルの外側
  • まとめて壊れたら、共通の何かを疑う。個別のデータを1件ずつ見るのは後回しでいい
  • エラーを出した側が悪いとは限らない。警告が正しくて、渡した入力が間違っていることがある。直す場所を間違えると、安全装置を自分で外すことになる
  • AIが書いたサンプルの日付は、書かれた日にしか正しくない。生成物を受け取ったら、日付がベタ書きされていないか一度は見る
  • 直した後は「壊れたら教えてくれる仕掛け」を1行足す。同じ失敗はまた来る前提で組む
  • 壊れるまでの速さより、気づくまでの遅さのほうが痛い。私の場合、壊れたのは4日後、気づいたのはその3週間後だった

まとめ

「昨日まで動いていたのに今日から全部エラー」は、故障ではなく設計です。書き置きされた日付と、今日と比べる式。この2つが同居した時点で、そのファイルには期限が生まれます。

やることは3つだけ。式の中の TODAY / NOW / DATEDIF を探す。その式が比べている相手に固定の日付が埋まっていないか見る。基準日セルを1つ作って手入力の日付に差し替え、未来で何が起きるかを確かめる(PCの時計は触らなくて済みます)。直すときは判定を甘くせず、基準日を1つのセルに集めて =TODAY() にします。

私の場合、10件の一斉失敗の原因は、たった1つの書き置きされた日付でした。判定側は1ファイルも触っていません。エラーの数と原因の数は、比例しません。


関連記事

無料テンプレート配布のお知らせ

非エンジニアの自動化ラボ メルマガ 読者登録フォーム

Claude Codeを安全・便利に使うための設定テンプレート(CLAUDE.md)を無料配布しています。メールアドレスをご登録いただくと、すぐにダウンロードリンクをお送りします。


免責事項

本記事は執筆時点(2026年8月)の情報に基づく、筆者個人の体験の記録です。記事中の自動売買システムに関する記述は、特定の投資手法や自動売買の利用を推奨するものではありません。投資には元本割れのリスクがあり、最終的な判断はご自身の責任で行ってください。また、本記事ではセキュリティに関わる話題に触れていますが、悪用防止の観点から、具体的な脆弱性や攻撃手法の詳細は記載していません。AIツールの仕様は予告なく変更される場合があります。最新情報は各公式ドキュメントをご確認ください。本記事の内容を用いて生じたいかなる損害についても、筆者は責任を負いかねます。

コメント

タイトルとURLをコピーしました