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);
您可以跳过检查并运行此语句。 如果名称已经存在,则会覆盖。 大不了!!!