名前付き範囲に参照切れがあるとXMLSSのインポートに失敗する(Excel-Xml Library)

Excelはセルの範囲に名前をつけて管理することができるが、それが他のブックやシートで、仮にアクセスできない場所に移動してしまった場合、範囲の値は参照が切れてしまう。

Excel 2007で「名前の管理」で見た時に、参照が切れている場合

名前 参照範囲
hoge #REF! =\\foobar\work\[foo.xls]...

以前に紹介した、XMLSSのインポート/エクスポートを.NET C#だけで実現できるExcel Xml Libraryを使って、このような「切れた参照」があるシートをXMLSS形式で読み込むと例外を発生してしまうようだ。

オブジェクト参照がオブジェクト インスタンスに設定されていません。
   場所 Yogesh.ExcelXml.FormulaParser.ParseRange(Cell cell, Match match, Range& range, Boolean absolute)
   場所 Yogesh.ExcelXml.Range.ParseUnresolvedReference(Cell cell)
   場所 Yogesh.ExcelXml.ExcelXmlWorkbook.ResolveNamedRangeReferences()
   場所 Yogesh.ExcelXml.ExcelXmlWorkbook.Import(Stream stream)
   場所 TransformSamples.Program.Main(String args)
   場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String args)
   場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   場所 System.Threading.ThreadHelper.ThreadStart()

調べてみると、以下の"名前付き範囲"の要素の属性"=#REF!"で例外が発生しているようだ。


  

取り敢えず参照が切れている場合は、Yogesh.ExcelXml.FormulaParser.ParseRangeを呼び出さないように修正したが、これはシート側の問題だけに、何かログを吐いた方が良いのかもしれない。というのも、この例外が出たXMLSSは保存してもExcelで開けないからだ。

Excelの名前付き範囲(range names)は作ったはいいけど、このように忘れてしまって、後で参照切れに気がつくことが多いんで、今回の用途には使わないほうがよいだろうな。せいぜい、"Print_Area"位か。