보통 인터넷에 VB .net 을 이용하여 엑셀 연동 관련하여 검색을 해보면 createObject 를 이용하여 개체를 생성하고 연결하는 과정이 소개가 되어 있는데 이런 경우 연동된 엑셀은 백그라운드로 실행되며 지정한 명령들을 수행한 뒤 종료되거나 메모리 해제가 되지 않는경우 종료 조차 되지 않습니다. 개발을 위하여 또는 실제 사용중에도 몇차례 실행하거나 기능 동작 중 작업관리자를 열어 보면 엄청나게 많은 엑셀 인스턴스가 있는 경우도 있지요.
사실 제가 필요한 것은 현재 열려있는 엑셀 실행 프로그램을 연동하는 방법이 필요했는데 하루 정도를 투입하여 이것저것 해보았으나 결국 실패 하였고 해외 검색을 통하여 방법을 알게되어 포스팅을 하게 되었습니다. (나중의 나를 위해서)
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. |
Imports Microsoft.Office.Interop.Excel '코드 최상단'
' 현재 실행중인 function 내'
Dim oExcel As Application ' 엑셀파일 App 억세스 오브젝트 '
oExcel = TryCast(Marshal.GetActiveObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application)
요렇게 하면 현재 실행중인 Excel application 을 가져오는 것이 가능합니다.
다시 말하자면 현재 특정 엑셀 파일을 열어놓은 상태에서 위의 코드를 실행하면 바로 열려있는 해당 엑셀 파일과 연결이 되는 것입니다.
Imports Microsoft.Office.Interop.Excel '코드 최상단'
' 현재 실행중인 function 내'
Dim oExcel As Application ' 엑셀파일 App 억세스 오브젝트 '
Dim oBook As WorkBook
Dim oSheet As WorkSheet
oExcel = TryCast(Marshal.GetActiveObject("Excel.Application"), Microsoft.Office.Interop.Excel.Application)
oBook = oExcel.ActiveWorkBook '현재 열려 있는 엑셀 파일 중 선택되어 있는 문서'
'oSheet = oBook.ActiveWorkSheet '' 제가 코드를 잘못 썼네요. 죄송합니다.'
oSheet = oBook.ActiveSheet ' 현재 열려 있는 시트 (마지막으로 보았던 시트)'
oSheet.Cells[1,1].Interior.Color
이런식으로 사용하는 것이죠.
여기서 oSheet 를 ActiveWorkSheet 로 설정하였는데요. 특정 시트의 이름을 지정하려면
oSheet = oBook.WorkSheets["Sheet1"]
과 같이 특정하여 지정하는 방법도 가능합니다.
여러개의 시트 사이에서 어떤 작업을 하려면 위와 같이 해주면 됩니다.
궁금하신 부분은 뎃글로 문의 해주시면 답변해보도록 하겠습니다.
*** 내용 추가 합니다. 2021-03-14
일단 프로젝트 시작할 때 정확하게 .net Framework , Visual Basic, Window Form 형식으로 프로젝트를 세팅하셨는지 확인을 하셔야 합니다. 위의 세팅이 맞지 않으면 정상적으로 동작하지 않을 수 있습니다.
그리고 엑셀 코드를 사용하기 위하여는 참조를 추가시켜 주어야 합니다.
우측의 솔루션 탐색기에서 참조 --> 참조추가 --> COM 순으로 들어가신 후
Microsoft Excel 00.0 Object Library (00.0 는 본인 컴퓨터에 깔려있는 엑셀 버전입니다)
를 체크하고 추가시켜 주어야 합니다. (찾기 어려우시면 저처럼 우상단 검색창에 excel 검색 ㄱㄱ)
이렇게 하시면 Excel 에서 사용하던 vba 를 대부분 사용하실 수 있습니다.
잘 안되시는 분을 위하여 간단하게 테스트용 소스코드를 올려 드립니다.
감사합니다.
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. |
https://diy-dev-design.tistory.com/84
https://diy-dev-design.tistory.com/83