4

1 つのセルをパラメーターとして取り、Web サービスにクエリを実行して結果を返す VBA モジュールとして実装した関数があります。データのソースがリモートであるため、この関数が戻るまでに数秒かかる場合があります。

問題は、列を削除するなどの一部のアクションによって、変更が必要ない場合でも、すべての数式が再計算されるように見えることです。シートに数百行ある場合、Excel が応答しなくなるまで数分かかることがあります。

変更が不要であることを検出し、この手順をスキップする方法を見つけたいと思います。私が試したいくつかのこと:

  • 変更するセルの現在の値を特定します。これにより、更新が必要かどうかを判断できます。ただし、ActiveCell.Value は空白で、セル自体を 2 番目のパラメーターとして渡そうとすると、循環参照の警告が表示されます。
  • 古い入力値を保持する 2 番目の列を作成しました。この列は関数に渡され、新しい値と比較されます。ただし、関数は成功時にこの古い値を更新できず、数式のみで更新しようとすると常に循環参照の警告が表示されます。さらに、関数が「変更なし」を返すことができるようには見えないため、古い結果を保存して使用する必要があります。

一部のアクションでシート上のすべての数式が更新されないようにする方法はありますか?

その他の要件:

  • 数式の自動計算をすべて無効にする方法もあるかもしれませんが、パラメータのセルが入力されたらすぐに各行が更新されるようにしたいです。また、ユーザーにボタンを押して関数を更新するように強制したくありません。
  • Visual Studio でカスタム スプレッドシートを作成しようとしましたが、展開を維持するのが自分のユーザー ベースにとって難しすぎることがわかりました。ソリューションは、マクロが有効なブックに完全に含まれている必要があります。
  • シートを使用する Excel のバージョンは 2007 および 2010 になります。
4

1 に答える 1

2

私は...するだろう

  1. ファイル/オプション/数式/ワークブック計算を「手動」に設定し、「保存時の再計算」もオフにすることで、再計算を体系的にブロックします

  2. を作成しPrivate Sub Worksheet_Change(ByVal Target As Range)、再計算を行う条件を決定します ( Target.Worksheet.Calculate) - たとえば、ターゲットの座標を決定し (Target.Columnとを使用Target.Row)、Worksheet_Change トリガー内からクエリを呼び出します。

  3. 最終的には、再計算命令を独自のサブに配置し、シートにボタンを作成して、ユーザーが必要に応じて再計算を手動でトリガーできるようにします (F9 キーがユーザーに知られていない場合に備えて)。

  4. またneed_Query、Worksheet_Change トリガーIf Target.Row = X And Target.Column = Y(= パラメーター) によって設定されるグローバル ブール変数を使用し、クエリ関数でそのブール値を調べて (およびリセットして)、クエリのみIf need_Query Thenに移動し、それ以外の場合は何もせずに終了することも考えられます。ワークシートの読み込み時にも、need_Query が FALSE に設定されていることを確認してください。

  5. 最後に、クエリ関数を に変換Subし、Worksheet_Change トリガーでより複雑な条件を定式化して、それを起動することができます (たとえば、特定の列が変更された場合など)。

于 2012-11-13T08:00:45.527 に答える