web-dev-qa-db-ja.com

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

私は このガイド に従って、スプレッドシート内の特定の色のセルの数をカウントする次のカスタム関数を作成しました。

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を使用していて、設定をチェックインし、自動計算がオンになっています。

6
user2463758

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)
_

ワークブックの通常の使用中に、セルA2またはA2の数式によって参照される別のセルの内容が変更された場合にのみ、UDFのコードが呼び出されます。

ソリューション

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

  1. 押す による最後の計算以降に変更されていない場合でも、Excelに強制的にブック内のすべての数式を手動で再計算させます Ctrl+Alt+F9 Windowsおよび(私はMacを想定しています) Cmd+Alt+F9。それがうまくいかない場合は、追加してみることもできます Shift さらに、再計算する前に依存式を再チェックします。
  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は再計算が必要であるかどうかに関係なく、 alwaysすべての数式を再計算します になります。この設定は、Excelを再起動するまで有効です。


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

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

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

ユーザー定義関数は、それ自体が揮発性としてマークされ、ワー​​クブックで何かが変更されるたびに再計算を強制することができます。

そのためには、関数内からApplication.Volatileを呼び出す必要があります。

Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Application.Volatile

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
3
neclepsio

UDFへの入力として使用されているリンクされたセルに影響しなかった場合でも、ActiveXテキストボックスが変更されたときはいつでも、すべてのユーザー定義関数を更新することを期待して、これを押しました。偶然に、関数呼び出しにany間接セル参照を含めると、他のセルが編集されたときに(一見)実行されるように見えることがわかりました。これはおそらく、間接修飾子が使用されている場合に、変更されていないことがExcelで保証できる保証が少ないためです。これはTwisty Impersonatorの2番目の回答に似ていますが、VBAコードと数式のくずれが少なくなります(関数で少なくとも1つの範囲が使用されている限り)。

例:この関数は常に 'A2'の値を返す必要があります

_Public Function test(some_arg)
test = Sheets("Sheet1").Range("A2").Value
End Function
_

=test(B1)のように呼び出すと、A2が変更されても更新されません。=test(INDIRECT(ADDRESS(ROW(B1),COLUMN(B1)))のように呼び出すと、機能的に同等で、A2が変更されるたびに更新されます。

=test(INDIRECT("B1"))も機能し、この例では理解しやすくなりますが、「B1」は文字列であるため、新しい値に数式をコピーすることはできません。

3
dchu58

これらはどれも私にとってはうまくいきませんでした。 UDFで計算できる唯一の方法は、以下のコードをworksheet.activateイベントに追加して、開いている別のシートにフォーカスを合わせることであることがわかりました。次に、メインシートのタブをクリックすると、うまくいきました。

Application.CalculateFullRebuild 
1
Jim Brizendine

Format変更(Color変更を含む)は、Excelでの再計算に値するイベントとは見なされません。これはユーザー定義関数とは関係ありません。したがって、形式を変更しても、再計算は行われません。

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

すべてのセルにOnChange関数を設定し、そこで再計算をトリガーすることはできますが、形式の変更によってこの関数が起動されない場合もあります(試したことがありません)。

1
Aganju