質問: ### 前提・実現したいこと Excelのあるセルの値が変わったら、特定のマクロを実行したいと考えています。 具体的には、D26のセルの値が変わったら、D27の値を別のシートにコピーするといった作業を数十回繰り返したいと考えています。 Web等を参照し、以下のコードで、D26の値が変わった際に、copyマクロが起動することは確認しました。 ### 該当のソースコード ``` Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("D26:D26")) Is Nothing Then Exit Sub Else Call Module1.copy End If End Sub ``` ### 発生している問題・エラーメッセージ ただ1点問題がございまして、D26の値を手動で書き換えれば上記のマクロは動作するのですが、実際にはD26にはExcelのアドイン関数が記載されており、D26の値が変わるのは「外部のソフトが計算を実行し、その値をExcelのアドイン関数で読み取った」タイミングになります。 このため、D26の見た目上の値自体は、外部ソフトの計算結果によって変わるのですが、D26に記載されいてう式自体は変わらないため、D26の見た目上の数値がいくら変わっても上記のworksheetマクロが起動しません。 外部ソフトが計算を実行したタイミングをVBA側で判断できれば良いのですが、それが難しく、「D26の見た目上の数値の変化」を判定して、マクロを作動させたいと考えています。 このようなことは可能でしょうか? (例えばD26のセル自体の変化ではなく、D26のvalueの変化を元に動作するworksheet関数を設定するといった方法があると良いのですが、、、) 皆様のお知恵を拝借いたしたく、宜しくお願いいたします。 ### 補足情報(FW/ツールのバージョンなど) Excel 2016
回答: D26には値そのものではなく、数式で例えれば`=Sheet2!A1`のようなものが入っていると考えてよろしいでしょうか。 試してみましたが確かにChangeイベントは発生しませんね。 代わりにCalculateイベントは発生しました。 こちらで代用してみてはいかがでしょうか。 但し「どこのセルで発生」という情報はなく、あくまでもシートが再計算されたというイベントになります。 もしD26以外にも数式があり頻繁に発生するようですと負荷になるかもしれないので、D26の値を変数か何かに保持しておいて、変化があったらコピー処理を実行するなどの対策が必要かもしれません。 ``` Private Sub Worksheet_Calculate() Static d26 If d26 <> Range("D26").Value Then d26 = Range("D26").Value Call Module1.copy End If End Sub ```