カスタム数式が更新されない


3

私はついていきます このガイド スプレッドシートの特定の色のセルの数を数える次のカスタム関数を作成する

Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
lCol = rColor.Interior.ColorIndex
    If SUM = True Then
       For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
                vResult = WorksheetFunction.SUM(rCell) + vResult
        End If
       Next rCell
    Else
        For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
                vResult = 1 + vResult
        End If
       Next rCell
End If
ColorFunction = vResult
End Function

数式バーの緑色のチェックマークをクリックしても正常に動作し、期待どおりの結果が得られますが、別のセルに色を付けても自動的に更新されません。スプレッドシートの他の場所に手動でセルを着色するたびに自動的にカウントを更新するように設定するにはどうすればよいですか。

追加情報:私はMac上でExcelを使用していて、設定をチェックインして自動計算がオンになっています。

回答:


5

Excelは、入力が変更された場合にのみUDFを再計算します

ユーザー定義関数(UDF)が作成されました。 Excelは、関数への入力として機能するセルが変更されたときにのみUDFのコードを実行します。

たとえば、次のUDFがあるとします。

Public Function MyFunction(Target As Range)
MsgBox "The target cell's address is " &  Target.Address
End Function

そして、私のワークシートのセルA1では、式を使ってセルを参照します。

=MyFunction(A2)

私のワークブックを通常使用している間、私のUDFのコードは、セルA2またはA2の式で参照されている別のセルの内容に変更がある場合にのみ呼び出されます。

ソリューション

いくつかの方法でこの動作を回避できます。

  1. 最後の計算以降に変更されていなくても、ブック内のすべての式を手動で再計算するようExcelに強制 押す Ctrl + Alt + F9 Windowsでは、(私はMacとします) CMD + Alt + F9 。それでもうまくいかない場合は、追加してみることもできます。 シフト 再計算の前に従属式をさらに再チェックします。
  2. UDFによって参照されるセルの1つに揮発性関数を含めます。追加のパラメーターを受け入れるようにVBA関数の定義を変更してこれを行います。

    Public Function MyFunction(Target As Range, Optional VolatileParameter As Variant)
    

    次に、UDFを参照しているセルを編集して、次のような揮発性関数の結果を渡します。 Now() UDFに:

    =MyFunction(A2,Now())
    

    その結果、Excelは、UDFへの参照を含むセルを、揮発性関数を参照するためにワークシートが変更されるたびに再計算する必要があると見なします。

  3. UDFを含むセルを編集します。セルを入力してから変更を加えずにEnterキーを押すだけで、更新が開始されます。

  4. 次を実行するマクロボタンを作成します。 コード行

    Application.CalculateFull
    
  5. Workbook Openイベントに次のコードを配置します。

    ActiveWorkbook.ForceFullCalculation = True
    

    これによりExcelは 常に すべての式を再計算する 再計算が必要と思われるかどうかにかかわらず。この設定はExcelを再起動するまで有効です。


ExcelがUDFを常に再計算しないのはなぜですか。

Excelが自動再計算を実行すると、ブック内のすべての数式が再計算されるわけではありません。代わりに、最近変更されたセルを参照する数式を含むセルのみを更新します。この方法では、ワークブック全体で不必要に多くの計算を実行して、大部分のワークブックで同じ結果を出すという、はるかに長いプロセスを回避できます。

UDFでは、Excelの計算エンジンが認識しているブック内の参照は、関数の入力で識別されたものだけです。 ExcelはUDF内のVBAコードを調べて識別することはできません。 その他の 関数の出力に影響を与える可能性のあるセル。そのため、関数の作成者はワークブックで行われた任意の数の変更に基づいてさまざまな結果を返すように関数を作成できますが、Excelが関数の結果を変更するのは宣言された入力のみです。したがって、UDFを再計算する必要があるかどうかを判断するときにExcelが注意を払うのは、これらのセルに対する変更だけです。


1

フォーマット 変更( 変更)は、Excelでの再計算に値するイベントとは見なされません。これはユーザー定義関数とは関係ありません。したがって、フォーマットを変更しても再計算されることはありません。

これは恣意的なことではありませんが、通常はフォーマットの変更が他に影響を与えないため、ある程度の意味があります。そのため、再計算(費用がかかる)は無駄になります。 Excelは現在、VBがフォーマット情報を使用してそれに反応することを許可しているので、これはあなたにとっての問題です。

あなたはすべてのセルに対してOnChange関数を設定し、そこで再計算を引き起こすことができるかもしれませんが、フォーマットを変更してもこの関数も起動しないかもしれません(私は試したことがありません)。


OPの問題は、ExcelがUDFを再計算する方法とすべて関係があります。フォーマットの変更が再計算を引き起こさないことは正しいのですが、それだけではありません。 どれか 再計算は彼のUDFを更新します。この違いを理解することは、この問題を正しく解決するために非常に重要です。
Twisty Impersonator
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.