定義名は範囲やセルに付ける別名で、数式から 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");
DefinedNameInfo は Name / Scope / Address / Comment を持つレコードです。
Scope が null ならブックスコープを意味します。
範囲として解決する
// 範囲として解決する(シートスコープが優先される)
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-json —
definedNamesとして往復します(Web 版と互換) - XLSX —
<definedNames>として往復します。ブックスコープ・シートスコープの どちらにも対応します
Excel の組込名(_xlnm.*)は定義名の一覧には現れません。ただし印刷範囲
(_xlnm.Print_Area)と印刷タイトル(_xlnm.Print_Titles)は例外で、読み込み時に
PrintSettings.PrintArea および PrintSettings.RepeatRows / RepeatColumns へ、
書き出し時にはその逆へ変換されます(印刷とページ設定)。
他の組込名は未対応です。