MESCIUS SPREAD for Windows Forms 17.0J > 開発者ガイド > 数式 > 外部参照の管理 |
SPREAD for Windows Formsでは、外部参照を介した、他のSpreadインスタンスとの相互動作がサポートされます。外部参照を使用することで、データを円滑にやり取りできます。スプレッドシート内の外部参照は、別のワークブック上のセル(またはセル範囲)内のデータを参照します。
外部参照を使用する場合、参照先のワークブックがメモリ内に存在する場合は、この外部ワークブックからデータが直接フェッチされます。そうでない場合は、必要とされる情報がキャッシュデータからフェッチされます。通常、外部ワークブックは、スプレッドシート内の全データではなく、セル参照のみをキャッシュします。このような場合、外部ワークブック内の残りのセルは空白のままとなります。
別のワークブックを作るのではなく、XLSXファイルへの外部参照を作成することができます。XLSXファイルを参照する場合、このワークブックが利用できないときは、XLSXからデータがインポートされ、外部ブックのキャッシュデータストレージに保管されます。
外部参照の詳細については、以下を参照してください。
SPREAD for Windows Formsでは、Excelファイルを保存するためのExternalReferenceフラグもサポートされます。ExternalReferenceフラグをオンにすると、ワークブックの動作はExcelと同じとなります。オフにすると、ワークブックの保存時に何も変更されません。Excelにエクスポートする際に、外部リンク値をワークブックに保存するには、SaveLinkValuesプロパティをtrueに設定する必要があります。
外部参照機能は、OpenXML形式で保存するファイルのみに使用できます。 |
既存のワークブックセット内に新規ワークブックを作成する方法については、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// ワークブックセットを作成します。 IWorkbookSet workbookSet; workbookSet = GrapeCity.Spreadsheet.Win.Factory.CreateWorkbookSet(); // 同じワークブックセット内に新規ワークブックを作成します。 IWorkbook workbook1; workbook1 = workbookSet.Workbooks.Add(); // workbook1をSpreadコントロールfpSpread1に追加します。 fpSpread1.Attach(workbook1); |
VB |
コードのコピー
|
---|---|
' ワークブックセットを作成します。 Dim workbookSet As IWorkbookSet workbookSet = GrapeCity.Spreadsheet.Win.Factory.CreateWorkbookSet() ' 同じワークブックセット内に新規ワークブックを作成します。 Dim workbook1 As IWorkbook workbook1 = workbookSet.Workbooks.Add() ' workbook1をSpreadコントロールfpSpread1に追加します。 fpSpread1.Attach(workbook1) |
既存のワークブックをワークブックセットに追加する前に、ワークブック名が一意であり、新規ワークブックにデータが含まれていないことを確認してください。新規ワークブックにはワークシートを1つだけ含めることができますが、このワークシートも空白である必要があります。具体的には、追加する新規ワークブックには下記設定が無い状態にする必要があります。これは、コーディングによる設定以外にSPREADデザイナによる設定も同様です。
既存のワークブックをワークブックセットに追加する実装については、、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// 既存のワークブックをワークブックセットに追加します。 IWorkbook workbook2; workbook2 = fpSpread2.AsWorkbook(); workbook2.Name = "Book2"; // デフォルト名は「fpSpread2」です。 workbookSet.Workbooks.Add(workbook2); |
VB |
コードのコピー
|
---|---|
' 既存のワークブックをワークブックセットに追加します。 Dim workbook2 As IWorkbook workbook2 = fpSpread2.AsWorkbook() workbook2.Name = "Book2" ' デフォルト名は「fpSpread2」です。 workbookSet.Workbooks.Add(workbook2) |
Spreadコントロール内で外部ファイルを開いて表示する方法については、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// ファイルから新規ワークブックを開きます。 IWorkbook workbook3; workbook3 = workbookSet.Workbooks.Open(@"Test.xlsx"); workbook3.Name = "Book3"; // デフォルト名は「TEST.xlsx」です。 // 開いたワークブックをSpreadコントロール内に表示します。 fpSpread3.Attach(workbook3); |
VB |
コードのコピー
|
---|---|
' ファイルから新規ワークブックを開きます。 Dim workbook3 As IWorkbook workbook3 = workbookSet.Workbooks.Open("Test.xlsx") workbook3.Name = "Book3" ' デフォルト名は「TEST.xlsx」です。 ' 開いたワークブックをSpreadコントロール内に表示します。 fpSpread3.Attach(workbook3) |
同じワークブックセットに属するワークブック間で外部参照を作成する方法については、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// workbook1内のセルを参照する外部セル参照式をworkbook2に割り当てます。 fpSpread2.Sheets[0].Cells[1, 1].Formula = "[Book1]Sheet1!$B$2"; // workbook2のセル範囲を参照するセル参照式をworkbook1に、workbook1のセル範囲を参照するセル参照式をworkbook2にそれぞれ割り当てます。 fpSpread1.Sheets[0].SetFormula(1, 3, "SUM([Book2]Sheet1!C3:C4)"); fpSpread2.Sheets[0].SetFormula(1, 3, "SUM([Book1]Sheet1!C3:C4)"); // workbook2のセル範囲を参照するカスタム名をworkbook1内に作成します。 fpSpread1.ActiveSheet.AddCustomName("Alpha", "Sum([Book2]Sheet1!C3:C4)", 2, 2); fpSpread1.ActiveSheet.SetFormula(2, 2, "Alpha"); fpSpread2.ActiveSheet.SetValue(2, 2, 10); fpSpread2.ActiveSheet.SetValue(3, 2, 20); // workbook2のカスタム名を参照するセル参照式をworkbook1に追加します。 fpSpread2.ActiveSheet.AddCustomName("Beta", "$C$3:$C$4", 1, 1); fpSpread2.ActiveSheet.SetValue(2, 2, 10); fpSpread2.ActiveSheet.SetValue(3, 2, 20); fpSpread1.ActiveSheet.SetFormula(1, 4, "SUM(Book2!Beta)"); |
VB |
コードのコピー
|
---|---|
' workbook1内のセルを参照する外部セル参照式をworkbook2に割り当てます。 fpSpread2.Sheets(0).Cells(1, 1).Formula = "[Book1]Sheet1!$B$2" ' workbook2のセル範囲を参照するセル参照式をworkbook1に、workbook1のセル範囲を参照するセル参照式をworkbook2にそれぞれ割り当てます。 fpSpread1.Sheets(0).SetFormula(1, 3, "SUM([Book2]Sheet1!C3:C4)") fpSpread2.Sheets(0).SetFormula(1, 3, "SUM([Book1]Sheet1!C3:C4)") ' workbook2のセル範囲を参照するカスタム名をworkbook1内に作成します。 fpSpread1.ActiveSheet.AddCustomName("Alpha", "Sum([Book2]Sheet1!C3:C4)", 2, 2) fpSpread1.ActiveSheet.SetFormula(2, 2, "Alpha") fpSpread2.ActiveSheet.SetValue(2, 2, 10) fpSpread2.ActiveSheet.SetValue(3, 2, 20) ' workbook2のカスタム名を参照するセル参照式をworkbook1に追加します。 fpSpread2.ActiveSheet.AddCustomName("Beta", "$C$3:$C$4", 1, 1) fpSpread2.ActiveSheet.SetValue(2, 2, 10) fpSpread2.ActiveSheet.SetValue(3, 2, 20) fpSpread1.ActiveSheet.SetFormula(1, 4, "SUM(Book2!Beta)") |
ソースワークブックのセル値を変更すると、参照先ワークブックの数式も自動的に更新されます。ソースワークブックをリセットする前に、ワークブックが閉じられていることを確認する必要があります。この実装方法については、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// ソースワークブック内の参照セルを変更すると、fpSpread2内の数式も自動的に更新されます。 fpSpread1.Sheets[0].Cells[2, 1].Value = 1000; // ワークブックをリセットします。 fpSpread1.AsWorkbook().Close(); fpSpread1.Reset(); // リセットする前にワークブックを閉じておく必要があります。 |
VB |
コードのコピー
|
---|---|
' ソースワークブック内の参照セルを変更すると、fpSpread2内の数式も自動的に更新されます。 fpSpread1.Sheets(0).Cells(2, 1).Value = 1000 ' ワークブックをリセットします。 fpSpread1.AsWorkbook().Close() Dim ' リセットする前にワークブックを閉じておく必要があります。 As fpSpread1.Reset() |
ソースワークブックのリンク解除を設定すると、外部参照は値によって置換されます。この実装方法については、以下のコードスニペットを参照してください。
C# |
コードのコピー
|
---|---|
// リンクの解除をサポートします。 var value1 = workbook1.ActiveSheet.Cells[2, 2].Value; fpSpread2.ActiveSheet.SetValue(2, 2, 20); var value2 = workbook1.ActiveSheet.Cells[2, 2].Value; MessageBox.Show(string.Format("Before break link, Value is changing : value1={0} value2={1} ", value1, value2)); workbook1.BreakLink(workbook2.Name); fpSpread2.ActiveSheet.SetValue(2, 2, 30); var value3 = workbook1.ActiveSheet.Cells[2, 2].Value; MessageBox.Show(string.Format("After Break link, Value isn't changing : value1={0} value2={1} ", value2, value3)); |
VB |
コードのコピー
|
---|---|
' リンクの解除をサポートします。 Dim value1 As var = workbook1.ActiveSheet.Cells(2,2).Value fpSpread2.ActiveSheet.SetValue(2, 2, 20) Dim value2 As var = workbook1.ActiveSheet.Cells(2,2).Value MessageBox.Show(String.Format("Before break link, Value is changing : value1={0} value2={1} ", value1, value2)) workbook1.BreakLink(workbook2.Name) fpSpread2.ActiveSheet.SetValue(2, 2, 30) Dim value3 As var = workbook1.ActiveSheet.Cells(2,2).Value MessageBox.Show(String.Format("After Break link, Value isn't changing : value1={0} value2={1} ", value2, value3)) |