web-dev-qa-db-ja.com

ユーザー定義関数は再計算されません

最近、大きくて安定したXLSMファイルを取得し、XLAMとXLSXに分割しました。 XLSX呼び出し(udfs)の数千のセルがXLAMで機能し、そのような各udfはステートメント「Application.Volatile」(過剰、再計算を強制する)で始まります。

XLSXは、Ctrl-Alt-Shift F9を介したF9でも、Application.CalculateFullを介したCell.Calculateでも再計算されません。 XLSXセルは単に「死んでいる」...しかし... F2キーを押して数式を編集し、Enterキーを押すと、セルを1つずつ再起動できます。この方法で目覚めた細胞は目覚めたままであるように見え、その後は正常に再計算されます。

誰かがこの奇妙な動作に遭遇したことがありますか?Excelに計算グラフを最初から再構築させる追加の方法がありますか?

重要な場合のもう1つの注意事項:ファイルを開くことでXLAMとXLSXを開き、ファイル...オプション...アドインルートを使用してXLAMをインストールしていません-過去にそうしていたので、分XLAMを「チェック解除」してインストールすると、すべてのUDF参照がフルパス名リンクに置き換えられます-かなり醜いです。あるいは、誰かがXLAMアドインをインストールするための回避策の概要を説明できれば、どこにでも壊れたリンクが作成されないので、それを使用します。

17
tpascale

それを理解しました-なぜマイクロソフトがこの「機能」を持っているのかわかりません:

この状態は、XLAM機能を使用する未使用のXLSXが、XLAMを開く前に開かれた/作成されたときに発生します。この場合、各セルに移動して数式バーにタッチしてEnterキーを押す(または、私が発見したように、グローバル置換を介してまとめて実行する)場合を除き、キャジョリングの量によってXLSX数式がそれらのXLAM関数にバインドされて実行されることはありません。 -私の場合、すべての関数は「k」で始まったので、「k」を「k」にグローバルに置き換えるとエラーが修正されました)。 XLAMを最初に開いた場合、問題は発生しません。

6
tpascale

これは機能します:

Sub Force_Recalc()
    Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
8
Greg Glynn

Applicationインスタンスにアクセスできる[〜#〜] udf [〜#〜]の場合、次を使用できます。

Application.CalculateFull()

MSDNソース ここ

4
DenisKolodin

この状況では、すべての数式の先頭にある=を検索して置換することにより、強制的に再計算を行うことができます。これをマクロにして、キーの組み合わせにマップすることもできます。

編集して追加

Greg Glynnが 彼の答え に持っているマクロを参照してください。

4
Jamie Bull

Ctrl + Alt + Shift + F9を押します

これは思った以上に再計算されるかもしれませんが、それは私のUDFを更新しました。

ソース

2
guest2

考えられる解決策の1つ:計算モードを手動に設定してから自動に戻す

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
2
Evan Winograd

これが私が見つけたものです。私はそれをテストしていませんが、回避策があるかもしれないと思います。

これは直接の引用です。「Excelは、関数の入力引数の分析に依存して、関数を再計算によって評価する必要がある時期を決定します。」

から http://www.decisionmodels.com/calcsecretsj.htm

これが私が今日後で試すつもりのことです。関数内で動的にテーブルの特定のアドレスを生成します。私たちがここにいる理由に基づいて、計算されたアドレスの値が変更された場合、更新を取得するべきではありません。

テーブル全体をパラメータとして含めることにより、パラメータを使用しなくても、テーブル内の何かが変更された場合に関数を更新する必要があります。

このようにして、実際にテーブル全体を処理するかどうかに関係なく、関数は依存関係ツリーにヒットします。

1
shmolf

私のスクリーンショット:

enter image description here

私も同じ問題を抱えていました。検索と置換は機能しますが、あまり良くありません。私の解決策は次のとおりです。

[データ]タブに移動> [リンクの編集]> [オープンソース]をクリックすると、これが解決されます

0

Excelは、数式に記載されている範囲に変更がないか監視します。私は今日これに直面し、それを考えて気づきました。したがって、これを修正するには、監視する範囲をとるダミー引数を関数に作成するか、ダミー関数を作成します。私の場合、何も返さないmonitorRangeと呼びました

Function monitorRange(rng As Range)
End Function

数式の例でそれについて言及しました

=myfunction(a,b) & monitorRange(RANGE_TO_MONITOR)

これは非常にうまく機能し、他の機能でも機能するはずです

氷河期は最初の質問の後で古くなりましたが、ピボットテーブルフィルターのどの値が選択されたかを判断するためにUDFを作成したちょうど今日、同様の問題に遭遇しました。 UDFは、マクロエディターで実行する場合、およびUDFが使用されたフィールドを直接更新する場合に正常に機能しますが、シートまたはピボットテーブルを更新するときに「_#VALUE!_」をスローします。

元のUDFからALiの単純なmonitorRange関数にコンテンツを段階的に追加するまで、それは私を殺していました。次に、UDFにピボットテーブルの更新ステートメントがあり、削除すると「_#VALUE!_」エラーが解消されることがわかりました。以下は私のUDFからの特定の問題のある行ですが、一般的なルールとして、UDFは他のブックのコンテンツを更新するコードをコールチェーンに含めることはできません。つまり、UDFはGET値のみであり、SET値ではありません。

次の2つのシナリオでこれを確認しましたが、どちらもこのエラーの原因です。

  1. ピボットを更新します。例:_pt.PivotCache.Refresh_
  2. 別のセルの値を変更します。例:Range("AA1").Value = "Test"

不思議なことに、私はテストしたところ、UDFにMsgBox呼び出しを含めて、問題なくダイアログを表示できることはまったく問題ないことがわかりました(実際にはちょっとクールです)。これにより、UDFは範囲を監視し、UDFに含めたい条件のメッセージボックスダイアログをポップアップできます。私は他の状況のた​​めにそれを心に留めておきます。

これが、他の人がこの厄介なゴミの問題に反抗するのに役立つことを願っています。

0
Paul Kinney