반응형

보통 인터넷에 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 검색 ㄱㄱ)

엑셀 COM 오브젝트를 추가해 주어야 한다

이렇게 하시면  Excel 에서 사용하던 vba 를 대부분 사용하실 수 있습니다.

 

잘 안되시는 분을 위하여 간단하게 테스트용 소스코드를 올려 드립니다.

버튼을 누르면 현재 실행중인 엑셀 파일명, 시트명이 표시된다.
excel_connect_test.zip
0.06MB

 

감사합니다.

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

https://diy-dev-design.tistory.com/84

 

Excel Automate, 엑셀 자동화 프로그램

필자의 블로그 명칭을 보고 이미 알고 계신분이 있을지 모르겠지만 사실 저는 디자이너 입니다. 하지만 블로그에 맨 개발 관련 된 이야기만 적고 있지요. 음... 그런데 실제로 회사에서도 저는 대부분의 시간을 코..

diy-dev-design.tistory.com

 

https://diy-dev-design.tistory.com/83

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우..

diy-dev-design.tistory.com

 

 

반응형
반응형

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우 중간에 어느 버전에서인가 코드가 업데이트 되기도 하지만 관리하기가 어렵기 때문에 소실되는 경우도 많습니다. 또한 포멧을 중간에 xlsx 로 저장하는 순간 VBA 코드는 모두 사라져 버리죠.

그래서 외부 툴에서 VBA 로 만들었던 것과 같이 엑셀의 자동화 기능을 지원해주면 어떨까 생각해 보았습니다.

그래서 이번 포스트에서는 빠르고 코딩이 간편한 C# 을 이용하여 한번 엑셀 프로그램과 연동하는 내용을 설명해 드릴까 합니다. 

C# 으로 엑셀을 연동한다고?

당연히 비주얼 스튜디오와 엑셀은 설치가 되어 있다고 보고 시작하겠습니다.

 

 

 

연동 대상이 될 엑셀 파일 만들기

엑셀을 열고 창을 하나 만든 뒤 기본적으로 붙어 나오는 이름인 "통합 문서 1.xlsx" 로 저장을 해 놓겠습니다.

아마 기본적으로 worksheet 가 하나 있는 상태일 겁니다. 아래 처럼요.

엑셀에 파일을 하나 생성(저장)한 상태

 

 

 

 

.NET Window Forms 생성하기

비주얼 스튜디오를 실행합니다.

먼저 C# Window Forms App 프로젝트를 하나 생성합니다.

비주얼 스튜디오 버전마다 약간씩 차이는 있지만 필요한 항목을 보고 선택하면 됨

 

그런다음 프로젝트 명칭과 저장될 경로를 지정한뒤 "만들기" 버튼을 눌러 프로젝트를 생성해 줍니다.

.NET 버전은 적당히 4.5.1 을 선택하였다

 

이렇게 빈 화면의 윈도우 폼이 하나 만들어 집니다.

Window Form 이 만들어진 상태

간단하게 버튼하나와 텍스트에디터 창을 만들어 주고 상단의 Form1 이라고 써있는 글자 부분을 더블클릭해서 Form 이 로딩될때 실행할 함수를 하나 선언해 줍니다.

만들어진 버튼도 더블클릭해서 버튼이 눌릴때 실행할 함수를 만들어 줍니다.

 

그럼 지금부터 만들 C# App 에서 엑셀에 열려있는 파일 명을 한번 가져와 보도록 하겠습니다.

 

 

 

엑셀 COM 레퍼런스 추가하기

일단 C# 에서 엑셀 연동을 하기 위하여는 참조 개체를 추가해야 합니다. 

상단 메뉴의 "프로젝트" -> "참조" 로 이동하신 다음 아래와 같은 항목을 찾아서 체크해 줍니다.

앞쪽의 체크박스를 선택해주고 확인 버튼을 눌러주면 된다.

 

확인을 누르셨으면 이제 해당 레퍼런스를 사용하도록 선언을 해줍니다.

코드 페이지의 제일 윗 부분에 아래와 같이 작성을 해 주겠습니다.

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Application = Microsoft.Office.Interop.Excel.Application;

두번째 추가한 구문은 현재 열려있는 엑셀 어플리케이션을 확인하기 위한 용도로 사용합니다.

세번쨰 구문은 이후 사용할 Application 이라는 지시어가 현재 C# 컴파일러가 헷깔릴수 있는 용어이기 때문에 특별히 어떤 녀석인지를 지시하도록 작성하였습니다.

 

 

 

엑셀 연동을 하는 실제 코드 작성하기

이제 사용할 준비는 되었고 코드를 작성해 보겠습니다.

아래와 같이 작성이 되면 됩니다. 본인의 비주얼 스튜디오에 복붙 하지 마시고 한번 타이핑 해보시기 바랍니다. 코딩의 재미중에 타이핑 하는 맛도 빼 놓을 수 없기 때문이며 직접 타이핑을 해보는게 좀더 빠르게 익숙해 지기 때문이기도 하죠. 물론 인텔리센스가 도와주기 때문에 사실 몇글자 씩만 적어도 아래에 적어야 될 코드들이 자동으로 나타나서 저처럼 영문 타이핑을 못하는 사람도 쉽게 코딩을 할 수 있습니다.

한번 코드를 보실까요? 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Application = Microsoft.Office.Interop.Excel.Application;

namespace excelAutomate
{
    public partial class Form1 : Form
    {
        private Application xlsApp;


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 폼 로딩시에 위에서 정의한 xls App 를 엑셀과 연동해 주겠습니다.
            xlsApp = (Application)Marshal.GetActiveObject("Excel.Application"); // 현재  열려있는 엑셀 어플리케이션이 지정됩니다.
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 버튼을 누르면 텍스트 박스에 엑셀 어플리케이션이 열고 있는 엑셀 파일 명을 표시해 보겠습니다.
            textBox1.Text = xlsApp.ActiveWorkbook.Name;
        }
    }
}

 

실제로 제가 타이핑 한 내용은 세 줄 밖에 없습니다. ㅎㅎ 나머지는 자동으로 다 만들어진 코드들 이고요. 똑같이 따라 하셨다면 아마 비슷할 겁니다.

 

 

 

동작 확인해 보기

이렇게 하고 F5 키를 눌러 실행을 해보면 아래와 같은 창이 나타납니다.

버튼을 누르면 우측의 텍스트 창에 엑셀 파일명이 나오게 된다

 

그럼 한번 버튼을 눌러 볼까요?

현재 열려 있는 엑셀 파일명이 출력되었다.

요렇게 현재 엑셀 파일의 이름이 나타나게 됩니다.

엑셀 파일 이름을 "통합 문서3.xlsx" 로 저장한뒤 다시 한번해보면 ?

테스트를 위하여 엑셀 파일명을 변경해서 실행해 보았다.

요렇게 표시가 됩니다.

 

참 쉽지 않습니까?

 

이런식으로 C# 을 이용해서 현재 열려 있는 엑셀 어플리케이션과 연동이 가능하게 되었습니다.

다음 강좌에서는 각 시트에 접근하는 방법과 통합문서가 여러개 열려있는 경우 각각에 대하여도 연결하는 방법을 알아보도록 하겠습니다.

 

감사합니다.

 

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

2020/05/28 - [DEV/c#] - [c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

 

[c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

오늘은 간단하게 주어진 경로가 폴더인지 파일인지 구분하는 방법을 소개해 드리겠습니다. 길게 설명할 것 없이 간단하게 코드나갑니다. FileAttributes chkAtt = File.GetAttributes(_path); if ((chkAtt & FileA..

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] C# .NET 프로젝트에서 ImageMagick 이용하기

 

[C#] C# .NET 프로젝트에서 ImageMagick 이용하기

이미지 관련된 툴을 개발함에 있어 다양한 이미지 포멧을 만들고 변경하기 위한 코어를 개발하는 것은 말도 안되게 힘든 작업입니다. 저는 디자이너라는 타이틀을 가지고 있기 때문에 포토샵이

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

 

[C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다. 먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다. class 정의 바로 아래부분에 넣어 주�

diy-dev-design.tistory.com

 

반응형

+ Recent posts