2010-05-18 3 views
2

다음에서는 Excel 워크 시트에 개체 집합을 유지하려고합니다. 함수가 값을 저장하기 위해 호출 될 때마다 A 열의 다음 셀을 할당하여 해당 객체를 저장해야합니다.오류! (C#에서 Excel의 명명 된 범위 사용)

그러나 예외 호출은 get_Range()에 대한 첫 번째 호출에서 Interop 라이브러리에 의해 throw됩니다. (catch 블록 바로 다음)

내가 뭘 잘못하고 있는지 알아?

private void AddName(string name, object value) 
     { 
      Excel.Worksheet jresheet; 
      try 
      { 
       jresheet = (Excel.Worksheet)_app.ActiveWorkbook.Sheets["jreTemplates"]; 
      } 
      catch 
      { 
       jresheet = (Excel.Worksheet)_app.ActiveWorkbook.Sheets.Add(Type.Missing, Type.Missing, 
                     Type.Missing, Type.Missing); 
       jresheet.Visible = Microsoft.Office.Interop.Excel.XlSheetVisibility.xlSheetVeryHidden; 
       jresheet.Name = "jreTemplates"; 
       jresheet.Names.Add("next", "A1", true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
      } 
      Excel.Range cell = jresheet.get_Range("next", Type.Missing); 
      cell.Value2 = value; 
      string address = ((Excel.Name)cell.Name).Name; 
      _app.ActiveWorkbook.Names.Add(name, address, false, 
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
             Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
      cell = cell.get_Offset(1, 0); 
      jresheet.Names.Add("next", ((Excel.Name)cell.Name).Name, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
     } 

예외는 COM 라이브러리에서 발생하므로 포함 된 정보는 그리 유용하지 않습니다. 그러나, 여기있다 :

"Exception from HRESULT: 0x800A03EC" 

"\ R \ n 서버 스택 트레이스 \ R \ n \ R \ n \ R \ nException 재 throw에 [0] : \ R \ n System.Runtime.Remoting에서. Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) \ r \ n System.Runtime.Remoting.Proxy.RealProxy.PrivateInvoke (MessageData & msgData, Int32 유형) \ r \ n Microsoft.Office.Interop.Excel._Worksheet C : \ Documents and Settings \ QueBITuser \ My Documents \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager의 WorkbookTemplateManager.EditTemplateForm.AddName (문자열 이름, 개체 값)의 .get_Range (Object Cell1, Object Cell2) \ r \ \ EditTemplateForm.cs : C : \ Documents and Settings \ QueBITuser \ My Documents \ Visual의 WorkbookTemplateManager.EditTemplateForm.SaveTemplate (Object Sender, EventArgs args)의 행 143 \ r \ n Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs : System.Windows.Forms.Control.OnClick (EventArgs e)에서 줄 124 \ r \ n System.Windows.Forms.Button.OnClick System.Windows.Forms.Control.WmMouseUp (메시지 &m, MouseButtons 단추, Int32 클릭)에서 System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) \ r \ n의 System.Windows.Forms.Control.WmMouseUp에서 \ r \ n System.Windows.Forms.Control.WndProc (메시지 &m) \ r \ n System.Windows.Forms.Button.WndProc (메시지 &m) \ r \ n System.Windows.Forms.Button.WndProc에서 (Message & m) \ r \ n System.Windows.Forms.Control.ControlNativeWindow.OnMessage (메시지 &m) \ r \ n System.Windows.Forms.Control.ControlNativeWindow.WndProc (메시지 &m) \ r \ n System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) "

+0

당신은 예외 스택 추적을 게시하시기 바랍니다 수 있습니까? –

+0

확인. 지금 게시됩니다. – mcoolbeth

+1

jresheet.Names.Add ("next", "jreTemplates! $ A $ 1", ...? –

답변

1

주위를 둘러봤을 때 문자열 자체에 Names.Add 메서드에 대한 equals 및 명시 적 참조가있는 몇 가지 예제가 있습니다. 다음과 같음 :

jresheet.Names.Add("next", "=jreTemplates!$A$1",... 
0

너무 힘들어했습니다.

내가 추가하려고 시도한 이름은 CEB04 ==> 이것은 기존 Excel (2007) 셀을 멀리있는 열로 참조합니다. 그래서 실제 주소이기 때문에 그것을 허용하지 않습니다.

"MyAppNames_"+ "CEB04"와 같은 접두어를 추가하기 만하면됩니다.

그리고 C# 및 .net4를 사용하는 방식으로 선택적 매개 변수를 허용하므로 Type.Missing을 입력하지 않아도됩니다.

이 조각은 잘 작동 :

var name= "MyAppNames_" + "CEB04"; 
var address = "=" + Constants.ValidationSheetName + "!" + target.Address; 
worksheet.Names.Add(name, address,true);