MESCIUS SPREAD for Windows Forms 17.0J > 開発者ガイド > 数式 > 循環参照 |
数式では、その数式自身が含まれるセルを参照することができます。これを循環参照と呼びます。循環参照は通常、1つの関数を反復実行することで、演算結果を最適な値に近づけようとする目的で使用します。
ここでは、次のタスクについて説明します。
たとえば、セルC4内に「=COLUMNS(A1:C5)」という数式を設定すると、評価結果は返されません。つまり、配列内の最後の行および列インデックスが、数式の入力されたセルの行および列インデックスより大きい場合、この数式は計算できなくなります。この例では、セルC4 はセル範囲 A1:C5 内に含まれています。これが、数式内に循環参照が含まれる例であり、反復計算が有効にされていない限り、この数式は評価されません。
表計算に関する多くの製品(Excel、OpenOfficeを含む)と同様、製品では反復計算を使用して循環参照の式を解決します。1回の再計算サイクルで、反復計算が指定の回数だけ実行されます。1回の反復計算では、1つの循環参照式は一度だけ評価されます。
次のサンプルコードは循環参照を使用した数式を設定します。
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 Windows Formsでは、CircularFormulaイベントを使用して循環参照を検出し、削除できます。これにより、スプレッドシートで使用される数式で、計算エラーが生じることを防止できます。
次のサンプルコードは、数式内の循環参照を検出します。
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" |