SPREAD for WPF 3.0J - GcSpreadSheet
循環参照
SPREAD for WPF 3.0J - GcSpreadSheet > 開発者ガイド > 数式と関数 > 循環参照

GcSpreadSheetは、数式の循環参照に対応しています。ワークシートでは、数式がそれ自体のセルを直接または間接的に参照すると、循環参照が作成されます。 循環参照では、セルで使用される数式が計算で独自の結果を使用するようになり、通常、同じ関数を繰り返して最適な値に近づくために使用されます。

ワークブック内の循環参照を含む数式の反復計算を有効にするには、CalculationEngineクラスのIterativeプロパティをtrueに設定する必要があります。さらに、CalculationEngineクラスのMaximumIterationsプロパティを使用して、循環参照を使用した計算の関数の最大反復カウントを設定できます。MaximumChangeプロパティを使用して、循環参照を使用した計算の反復を許可する変更の最大数を設定することもできます。

次のサンプルコードは、セルA1で循環参照を使用する方法を示します。この例では、セルC1に数式「= A1 * 3」とセルA1に数式「= B1 + C1」を適用して、セルA1に循環参照を使用する方法を示しています。ここで、セルA1がセルB1とセルC1の値の合計を計算し、セルC1がセルA1を参照して同じセルA1に結果を返すので、セルA1の値が計算されるとすぐに循環参照が作成されます。また、結果を再計算して最適な値を取得できるように、計算の最大反復回数を5に設定しました。

コードのコピー
// 循環参照
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.Iterative = true;
GcSpreadSheet.Workbook.ActiveSheet.Cells[0, 1].Value = 20;
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.MaximumChange = 5;
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.MaximumIterations = 5;
GcSpreadSheet.Workbook.ActiveSheet.Cells[0, 2].Formula = "=A1*3";
GcSpreadSheet.Workbook.ActiveSheet.Cells[0, 0].Formula = "=B1+C1";
//すべてのセルを計算して循環参照します。
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.Calculate();
//反復計算します。
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.TriggerVolatileCells();
//最初の反復計算にフォーカスします。
GcSpreadSheet.Workbook.ActiveSheet.CircularReference.Activate();

Console.WriteLine("Precedents: " + GcSpreadSheet.Workbook.ActiveSheet.Cells["A1"].Precedents.ToString());
Console.WriteLine("DirectPrecedents: " + GcSpreadSheet.Workbook.ActiveSheet.Cells["A1"].DirectPrecedents.ToString());
Console.WriteLine("Dependents: " + GcSpreadSheet.Workbook.ActiveSheet.Cells["A1"].Dependents.ToString());
Console.WriteLine("DirectDependents: " + GcSpreadSheet.Workbook.ActiveSheet.Cells["A1"].DirectDependents.ToString());
コードのコピー
'循環参照
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.Iterative = True
GcSpreadSheet.Workbook.ActiveSheet.Cells(0, 1).Value = 20
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.MaximumChange = 5
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.MaximumIterations = 5
GcSpreadSheet.Workbook.ActiveSheet.Cells(0, 2).Formula = "=A1*3"
GcSpreadSheet.Workbook.ActiveSheet.Cells(0, 0).Formula = "=B1+C1"
'すべてのセルを計算して循環参照します。
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.Calculate()
'反復計算します。
GcSpreadSheet.Workbook.WorkbookSet.CalculationEngine.TriggerVolatileCells()
'最初の反復計算にフォーカスします。
GcSpreadSheet.Workbook.ActiveSheet.CircularReference.Activate()

Console.WriteLine("Precedents: " & GcSpreadSheet.Workbook.ActiveSheet.Cells("A1").Precedents.ToString())
Console.WriteLine("DirectPrecedents: " & GcSpreadSheet.Workbook.ActiveSheet.Cells("A1").DirectPrecedents.ToString())
Console.WriteLine("Dependents: " & GcSpreadSheet.Workbook.ActiveSheet.Cells("A1").Dependents.ToString())
Console.WriteLine("DirectDependents: " & GcSpreadSheet.Workbook.ActiveSheet.Cells("A1").DirectDependents.ToString())