2015-02-11 71 views
1

我想檢查一個單元格是否包含名稱或是一個命名範圍,如果沒有,我將分配一個名稱。這裏是我的代碼:C#Excel檢查單元格在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: 

問題是,是否有更好的方法來檢查細胞命名的範圍?

+0

請參閱上面的修改後的命名。至於性能,只需要很長時間才能完成大量的單元。 – Keylee 2015-02-11 23:14:09

回答

0

您收到錯誤消息,因爲cell.Name本身會引發異常,更不用說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); 

您可以跳過檢查並運行此語句代替。如果名稱已經存在,它將被覆蓋。大不了!

+0

我的意圖是,如果名稱爲空,請指定一個名稱。如果它已經有一個名字,請保持原樣。通過上面的解釋操作,我最終可能會覆蓋已命名的單元格。請澄清,因爲我很困惑。 – Keylee 2015-02-12 01:11:35

+0

互操作不允許檢查cell.Name是否爲空。它引發了一個錯誤。因此,我只解釋了兩個選項:1.遍歷Globals.ThisWorkbook.Names集合並檢查您的單元格是否已有名稱。 2.以前的方法需要大量的編碼和處理時間,所以簡單地覆蓋它。重寫不會造成任何傷害,並且更簡單(編碼明智)並且更便宜(與方法1相比)處理時間明智。 – 2015-02-12 07:08:00

+0

我已決定循環訪問名稱並檢查單元格地址是否匹配。囉嗦的過程,但比嘗試抓住更好。 – Keylee 2015-02-13 04:21:39

相關問題