C#Excel Check单元格在VSTO中包含一个名称

我试图检查一个单元格是否包含名称或是一个命名范围,如果不是,我将分配一个名称。 这是我的代码:

if (cell.Name.Name == null) { Globals.ThisWorkbook.Names.Add("Temp", cell); } else { // Move on } 

但是,上面的代码将抛出一个COMException 。 相反,我试图通过这样做来解决它:

 try { if (cell.Name.Name == null) { } } catch (COMException) { Globals.ThisWorkbook.Names.Add("Temp", cell); } 

第二个代码段工作,但我的电子表格正在受到严重的性能影响。 操作从大约80毫秒到1700毫秒。 这可能看起来不多,但我正在循环select范围。

错误消息是:

 System.Runtime.InteropServices.COMException was unhandled by user code HResult=-2146827284 Message=Exception from HRESULT: 0x800A03EC Source="" ErrorCode=-2146827284 StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Range.get_Name() at ExcelTemplate1.Sheet1.button2_Click(Object sender, EventArgs e) in c:\Users\User\Desktop\ExcelTemplate1\ExcelTemplate1\Sheet1.cs:line 116 at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException: 

问题是,有没有更好的方法来检查名为范围的单元格?

你得到一个错误,因为cell.Name本身引发exception,更不用说cell.Name.Name。

Globals.ThisWorkbook.Names.Item(1)为您提供了在工作簿中定义的第一个名称。 它给出了如=Sheet1!$E$10:$F$12=Sheet1!$C$5以指示指定的范围。

Globals.ThisWorkbook.Names.Item(1).Name应该给你的范围的实际名称。 例如你的情况下的Temp 。 这是检查的一种方法。

换句话说,在你的代码中,你正在检查Name是否为null,如果是你正在分配它。 这个代码运行次数没有任何危害:

 Globals.ThisWorkbook.Names.Add("Temp", cell); 

您可以跳过检查并运行此语句。 如果名称已经存在,则会覆盖。 大不了!!!