GrapeCity SPREAD for Windows Forms 11.0J
循環参照

数式では、その数式自身が含まれるセルを参照することができます。これを循環参照と呼びます。循環参照は通常、1つの関数を反復実行することで、演算結果を最適な値に近づけようとする目的で使用します。

ここでは、次のタスクについて説明します。

  1. 数式内の反復計算
  2. 数式内の循環参照の検出

数式内の反復計算

SheetViewクラスのMaximumIterationsプロパティで、再計算の反復回数を設定します。この設定により、関数が自身を繰り返し演算(反復)する回数が決まります。また、SheetViewクラスのMaximumChangeプロパティで、計算を停止する基準となる、最大の変化量を設定することもできます。

たとえば、セルC4内に「=COLUMNS(A1:C5)」という数式を設定すると、評価結果は返されません。つまり、配列内の最後の行および列インデックスが、数式の入力されたセルの行および列インデックスより大きい場合、この数式は計算できなくなります。この例では、セルC4 はセル範囲 A1:C5 内に含まれています。これが、数式内に循環参照が含まれる例であり、反復計算が有効にされていない限り、この数式は評価されません。

表計算に関する多くの製品(Excel、OpenOfficeを含む)と同様、製品では反復計算を使用して循環参照の式を解決します。1回の再計算サイクルで、反復計算が指定の回数だけ実行されます。1回の反復計算では、1つの循環参照式は一度だけ評価されます。

設定方法

  1. 数式が参照するセルに、値を、適切なデータ型に解析できるセル型を設定します。
  2. SheetViewクラスのIterationプロパティで循環参照を有効に設定します。
  3. SheetViewクラスのMaximumIterationsプロパティで、再計算の反復回数を設定します。
  4. CellクラスのFormulaプロパティで、循環参照を使用する数式を設定します。

サンプルコード

次のサンプルコードは循環参照を使用した数式を設定します。

C#
コードのコピー
fpSpread1.ActiveSheet.Iteration = true;
fpSpread1.ActiveSheet.SetValue(0, 1, 20);
fpSpread1.ActiveSheet.MaximumChange = 5;
fpSpread1.ActiveSheet.MaximumIterations = 5;
fpSpread1.ActiveSheet.SetFormula(0, 2, "A1*3");
fpSpread1.ActiveSheet.SetFormula(0, 0, "B1+C1");
Visual Basic
コードのコピー
FpSpread1.ActiveSheet.Iteration = True
FpSpread1.ActiveSheet.SetValue(0, 1, 20)
FpSpread1.ActiveSheet.MaximumChange = 5
FpSpread1.ActiveSheet.MaximumIterations = 5
FpSpread1.ActiveSheet.SetFormula(0, 0, "B1+C1")
FpSpread1.ActiveSheet.SetFormula(0, 2, "A1*3")

数式内の循環参照の検出

Spread for Winformsでは、CircularFormulaイベントを使用して循環参照を検出し、削除できます。これにより、スプレッドシートで使用される数式で、計算エラーが生じることを防止できます。

コードの使用

  1. 新しい循環数式イベントを作成します。
  2. forループを実行して、スプレッドシート内のすべての循環参照を特定します。
  3. スプレッドシートから、これらの循環参照を削除します。

サンプルコード

次のサンプルコードは、数式内の循環参照を検出します。

C#
コードのコピー
fpSpread1.CircularFormula += delegate (object sender1, CircularFormulaEventArgs e1)
{
    for (int i = 0; i < e1.CircularCells.Count; i++)
    {
        Console.WriteLine("Circular formula detected at cell [{0:d}, {0:d}]!", e1.CircularCells[i].Row, e1.CircularCells[i].Column);
    }
};
fpSpread1.ActiveSheet.Cells[3, 3].Formula = "A1";
fpSpread1.ActiveSheet.Cells[0, 0].Formula = "A2";
fpSpread1.ActiveSheet.Cells[1, 0].Formula = "D4";
Visual Basic
コードのコピー
fpSpread1.CircularFormula += Sub(sender1 As Object, e1 As CircularFormulaEventArgs)
For i As Integer = 0 To e1.CircularCells.Count - 1
    Debug.WriteLine("Circular formula detected at cell [{0:d}, {0:d}]!", e1.CircularCells(i).Row, e1.CircularCells(i).Column)
Next
fpSpread1.ActiveSheet.Cells(3, 3).Formula = "A1"
fpSpread1.ActiveSheet.Cells(0, 0).Formula = "A2"
fpSpread1.ActiveSheet.Cells(1, 0).Formula = "D4"
関連トピック

 

 


© 2004-2018, GrapeCity Inc. All rights reserved.