반응형

엑셀에서 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

 

반응형
반응형

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다.

 

먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다.

class 정의 바로 아래부분에 넣어 주면 무난하겠네요.

[DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

[DllImport("user32")]
public static extern int SetCursorPos(int x, int y);

 

DllImport 부분에 빨간 줄이 나온다면 제일 상단에 아래의 같이 지시문을 추가합니다

 

using System.Runtime.InteropServices;
using System.Threading;

<2022/12/28 누락된 코드가 있어 추가하였습니다>

그런 다음 마우스를 이동하는 함수를 만들어야 겠습니다.

 

먼저 상수값을 지정해 주어야 합니다. 마우스의 각 이벤트에 대응되는 상수인데요. 이름은 적당히 적어 주면 됩니다.

역시 Form 상단 클래스 정의 이후에 아래와 같이 정의해주면 되겠습니다.

private const int MouseEV_Move = 0x0001; 		/* mouse move 			*/
private const int MouseEV_LeftDown = 0x0002; 	/* left button down 	*/
private const int MouseEV_LeftUp = 0x0004; 	/* left button up 		*/
private const int MouseEV_RightDown = 0x0008; 	/* right button down 	*/

private int interval_;
private readonly ManualResetEvent stoppeing_event_ = new ManualResetEvent(false); //System.Threading;

<2022/12/28 누락된 코드가 있어 추가하였습니다>

그런 다음 아래에 실제 함수를 작성해 봅니다.

public void MouseSetPosNclick(int x, int y)
{
	try
	{
		SetCursorPos(x, y);
		stoppeing_event_.WaitOne(interval_);
		MouseClick_now();
	}
	catch (Exception e)
	{
		MessageBox.Show("MouseSetPosNclick\r\n" + e.Message);
	}
}

public void MouseClick_now()
{
	try
	{
		mouse_event(MouseEV_LeftDown, 0, 0, 0, 0);
		mouse_event(MouseEV_LeftUp, 0, 0, 0, 0);
		stoppeing_event_.WaitOne(100);
	}
	catch (Exception e)
	{
		MessageBox.Show("MouseClick_now\r\n" + e.Message);
	}
}

 

 

사용하실 때에는 아래와 같이 사용하시면 되겠습니다.

 

MouseSetPosNclick(467, 280); // 원하는 좌표를 입력하면 됩니다.

 

궁금하신 부분은 뎃글로 질문 남겨 주세요~

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

 

 

 

본 기능을 이용하여 윈도우 잠금 방지 유틸리티를 하나 만들어 보았습니다.

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

 

재택근무 필수 유틸 "자리안비움" - 윈도우 꺼짐 방지

요즘 코로나 바이러스 때문인지 덕분인지 재택근무를 하는 분들이 많은데요. 막상 집에 있다 보면 사무실에 있을 때 처럼 연속해서 자리에 머무르지 못하는 경우가 종종 있습니다. 애들이나 와이프가 뭐 부탁하면..

diy-dev-design.tistory.com

 

2020/07/21 - [DEV/c#] - C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

 

C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

오늘 소개해드릴 꿀팁은요. 문자열을 읽어 들여서 문자열 내에 들어있는 특정 단어를 이용하여 개발 중인 코드의 변수로 인식하여 해당 변수에 값을 세팅하는 방법을 소개해 드릴까 합니다. 예�

diy-dev-design.tistory.com

2023.01.31 - [DEV/c#] - [c#] Resource 에 추가한 텍스트를 소스코드에서 불러오기

 

[c#] Resource 에 추가한 텍스트를 소스코드에서 불러오기

뻔하디 뻔한 개발 노하누는 가라~ 이번에도 쓸만한 내용을 소개해 드릴 까 합니다. 개발을 하다 보면 실제 소스코드 외에도 어떤 텍스트를 resource 에 넣어 두고 소스코드에서 불러와야 하는 경우

diy-dev-design.tistory.com

 

반응형

+ Recent posts