C# Excel 检查单元格是否包含 VSTO 中的名称

C# Excel Check cell contains a name in 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 毫秒。这可能看起来不多,但我正在循环选择一个范围。

错误消息是:

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 本身会引发异常,更不用说 cell.Name.Name.

Globals.ThisWorkbook.Names.Item(1) 为您提供工作簿中定义的第一个名称。它给出 =Sheet1!$E:$F=Sheet1!$C 之类的值来指示命名范围所指的内容。

Globals.ThisWorkbook.Names.Item(1).Name 将为您提供范围的实际名称。例如Temp 你的情况。这是一种检查方法。

换句话说,在您的代码中,您正在检查名称是否为空,如果是,您将再次分配它。 运行多次使用此代码没有坏处:

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

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