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);
您可以跳过检查并 运行 此语句。如果名称已经存在,它将被覆盖。大不了!!!
我正在尝试检查一个单元格是否包含名称或者是一个命名范围,如果没有,我将分配一个名称。这是我的代码:
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);
您可以跳过检查并 运行 此语句。如果名称已经存在,它将被覆盖。大不了!!!