2014-06-20 1 views
0

2010 Excel 리본 추가 기능이 있습니다. 버튼을 누르면 Excel의 일부 줄에 데이터가 기록됩니다. 이 데이터를 작성하려면 활성 워크 시트를 가져와야합니다. 그리고 활성 워크 시트를 얻으려면 activeWorkBook이 필요합니다. 나는xlApp.ActiveWorkbook에서 null을 반환합니다.

xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

으로 xlApp의 벌금을 얻을 수 있습니다 그리고 그것은 xlApp의 벌금을 검색하지만 현재 통합 문서를 얻으려고 할 때마다 그것은 null를 돌려줍니다. 무슨 일이 있어도. 컴퓨터를 다시 시작하지 않는 한. 그럼 처음에는 작동합니다. 아래는 전체 코드 블록입니다. null이되는 xlApp.ActiveWorkBook을 수정하는 방법을 궁금합니다. 그래야 활성 워크 시트를 얻을 수 있습니다. 그런 다음 활성 워크 시트에 데이터를 씁니다.

public void sendData() 
    { 
     Excel.Application xlApp = null; 
     Excel.Workbook xlWorkBook = null; 
     Excel.Workbooks xlWorkBooks = null; 
     Excel.Worksheet xlWorkSheet = null; 
     object misValue = System.Reflection.Missing.Value; 

     try 
     { 
      xlApp = new Excel.Application(); 
      //xlWorkBooks = xlApp.Workbooks; 
      //xlWorkBook = xlWorkBooks.Add(Properties.Settings.Default.FileToSend); 
      //xlWorkSheet = xlWorkBook.Sheets[1]; 

      xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
      xlWorkBook = (Excel.Workbook)xlApp.ActiveWorkbook; 
      xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet; 
     } 
     catch (Exception ex) 
     { 
      // handle error... 
     } 
     finally 
     { 
      if (xlWorkSheet != null) 
       Marshal.ReleaseComObject(xlWorkSheet); 

      if (xlWorkBook != null) 
       Marshal.ReleaseComObject(xlWorkBook); 

      if (xlWorkBooks != null) 
       Marshal.ReleaseComObject(xlWorkBooks); 

      if (xlApp != null) 
       Marshal.ReleaseComObject(xlApp); 
     } 

미리 감사드립니다.

+0

그래서 xlApp을 정상적으로 검색합니다. 하지만 xlApp.ActiveWorkBook은 어떤 이유로 null입니다. 내 질문을 업데이트했습니다.^ – Benny

+0

전체 답변을 제공하기에 충분하지는 않지만'xlApp = new Excel.Application();'을 (를) 호출하는 이유는 무엇입니까? 이 줄은 다음 줄을 예상대로 작동하지 않게 만듭니다. @Govert가 가리키는 것처럼, 문제는 Marshal.GetActiveObject'가 "실행중인 인스턴스를 얻습니다."라는 가능성이 있습니다. 현재 가져 오는 인스턴스를 제어 할 수 없으며 Interop 서비스를 사용하면 실행중인 보이지 않는 여러 Excel 응용 프로그램을 매우 쉽게 얻을 수 있습니다 백그라운드에서. –

+0

나는 그 라인을 주석으로 깜빡했다, 나는 단지 seperatley를 모두 시험해보고 있었고 그것을 언급하는 것을 잊어 버렸다. 내가 디버깅 할 때 내 추가 기능이 열리고 다른 인스턴스가 열리지 않기 때문에 Excel의 인스턴스가 열리고 인스턴스가 잡히는 것처럼 보입니다. 그래서 나는 그것이 무엇을하는지 모른다. 필자는 문자 그대로이 파일을 다른 파일에서 복사하여 붙여 넣었습니다. 지금은이 파일에서 ... 참고 문헌이 빠졌지 만 나는 그렇지 않다고 생각합니다. – Benny

답변

1

GetActiveObject으로 전화를 걸면 잘못된 Excel 인스턴스가 보류 중일 수 있습니다. COM 추가 기능의 OnConnection에 전달 된 응용 프로그램 참조를 사용합니다 (또는 리본 코드가 부트 스트랩 됨).

Excel-DNA 프레임 워크를 사용하여 관리되는 Excel 추가 기능을 만드는 경우 ExcelDnaUtil.Application을 호출하여 올바른 Application 개체를 확보하게됩니다.

관련 문제