定義名は範囲やセルに付ける別名で、数式から SUM(SalesData) のように参照できます。 Workbook が保持し、reogrid-json と XLSX の双方で往復します。

定義する

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Formula;

// ブックスコープ — どのシートからも同じ名前で参照できる
wb.DefineName("TaxRate", "Sheet1!B1");
wb.DefineName("SalesData", "Sheet1!A2:C100", comment: "月次売上");

// シートスコープ — 同名のブックスコープを隠す(シャドウイング)
wb.DefineName("Total", "Sheet2!D10", scope: "Sheet2");

ws.SetFormula(0, 0, "SUM(SalesData)");

アドレスはシート修飾つきで指定します(Sheet1!B1)。単一セルにも範囲にも付けられます。

スコープ

スコープ指定参照できる範囲
ブックscope を省略すべてのシート
シートscope: "Sheet2"そのシートの数式からのみ

同じ名前がブックスコープとシートスコープの両方にある場合、そのシートから見ると シートスコープが優先されます(シャドウイング)。Excel と同じ挙動です。

参照・削除

string? address = wb.GetName("TaxRate");             // "Sheet1!B1"
string? scoped = wb.GetName("Total", scope: "Sheet2");

foreach (DefinedNameInfo n in wb.GetNames())
	Console.WriteLine($"{n.Name} [{n.Scope ?? "workbook"}] = {n.Address}");

wb.RemoveName("TaxRate");

DefinedNameInfoName / Scope / Address / Comment を持つレコードです。 Scopenull ならブックスコープを意味します。

範囲として解決する

// 範囲として解決する(シートスコープが優先される)
RangePosition r = ws.ResolveRange("SalesData");

// 対象シートまで知りたい場合はレジストリを直接引く
if (wb.Names.TryResolve("SalesData", fromSheet: ws.Name, out NameResolution res))
	Console.WriteLine($"{res.Sheet} {res.R1},{res.C1} - {res.R2},{res.C2}");

ws.ResolveRange(name)RangePosition を返しますが、これはシート情報を持ちません。 定義名が別のシートを指している場合に対象シートまで知りたいときは、 wb.Names.TryResolve(...) が返す NameResolution を使います。

一括定義

// 多数を定義するときは Bulk でまとめる(途中の再解決を 1 回に抑える)
wb.Names.Bulk(() =>
{
	for (int i = 0; i < 100; i++)
		wb.DefineName($"Row{i}", $"Sheet1!A{i + 1}");
});

構造変更への追従

操作挙動
行・列の挿入削除定義名の範囲がシフトする
シートのリネーム対象シート名が追従する
シートの削除対象を失い、参照している数式は #REF! になる
定義の変更参照している数式が再計算される

入出力

  • reogrid-jsondefinedNames として往復します(Web 版と互換)
  • XLSX<definedNames> として往復します。ブックスコープ・シートスコープの どちらにも対応します

Excel の組込名(_xlnm.*)は定義名の一覧には現れません。ただし印刷範囲 (_xlnm.Print_Area)と印刷タイトル(_xlnm.Print_Titles)は例外で、読み込み時に PrintSettings.PrintArea および PrintSettings.RepeatRows / RepeatColumns へ、 書き出し時にはその逆へ変換されます(印刷とページ設定)。 他の組込名は未対応です。

次に読む

ページの内容は役に立ちましたか?