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デザイナによる設定も同様です。

  1. ワークシートがない
  2. または、ワークシートが1枚のみで、ワークシートに以下のデータが含まれない
  3. セル値/数式
  4. 結合されたセル
  5. セル スタイル
  6. フィルタ
  7. ソート
  8. 条件付き書式
  9. データ検証
  10. テーブル

既存のワークブックをワークブックセットに追加する実装については、、以下のコードスニペットを参照してください。

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コントロール内に表示する

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))
参照

 

 


© MESCIUS inc. All rights reserved.