18

最近、大きくて安定した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アドインをインストールするための回避策を概説できれば、どこでも壊れたリンクを作成しません。

4

11 に答える 11

10

これは機能します:

Sub Force_Recalc()
    Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
于 2015-11-04T22:09:31.147 に答える
6

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

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

于 2011-04-19T19:12:07.993 に答える
5

インスタンスにアクセスできるUDFの場合、次を使用できます。Application

Application.CalculateFull()

ここにMSDNソース

于 2016-12-21T11:33:29.117 に答える
4

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

追加するために編集

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

于 2014-05-30T18:47:58.960 に答える
2

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

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
于 2016-03-15T21:40:46.367 に答える
2

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

これは必要以上に再計算される可能性がありますが、UDFが更新されました。

出典

于 2017-01-31T00:47:02.467 に答える
1

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

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

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

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

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

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

于 2014-05-30T18:42:52.570 に答える
0

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

ここに画像の説明を入力してください

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

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

于 2016-11-21T10:52:04.417 に答える
0

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

Function monitorRange(rng As Range)
End Function

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

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

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

于 2017-05-24T13:57:40.193 に答える
0

氷河期は最初の質問の後で古くなりましたが、ピボットテーブルフィルターのどの値が選択されたかを判断するために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に含めたい条件のメッセージボックスダイアログをポップアップ表示できるようになります。私は他の状況のた​​めにそれを心に留めておきます。

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

于 2018-10-30T19:39:59.083 に答える
-1

同じ問題が発生していました...(別の投稿で)Application.Volatileを関数コードに追加すると、スプレッドシート(​​f9)で計算できることがわかりました。

于 2011-11-28T20:00:58.310 に答える