안녕하세요. 엉스데브 입니다.
엑셀 UDF 를 만드는 방법은 여러가지가 있지만, 그 중 Excel-DNA 라이브러리를 이용하는 방법이 아래 정리한 이유들 때문에 가장 마음에 듭니다.
1. 심플하고 직관적인 방법으로 개발이 가능 하며, 디버깅도 용이하게 수행 가능합니다.
2. 함수에 대한 설명을 지정 해 줄 수 있고, 함수의 파라미터에 대한 세부 설명까지도 지정이 가능 합니다.
3. 배포에 용이한 형식(.xll 단일 파일)으로 패키징 할 수 있는 패키징 도구를 제공 합니다.
그럼 실제로 어떻게 만드는지 단계별로 알아봅시다.
단계1. Excel-DNA 라이브러리 다운로드
홈페이지(http://excel-dna.net)를 통해 최신 버전의 Excel-DNA 라이브러리를 다운로드 받고, zip 파일의 압축을 풉니다.

zip 파일의 압축을 풀면 Distribution, Source 두개의 디렉터리가 나옵니다.

단계2. 클래스 라이브러리 프로젝트 만들기
비주얼 스튜디오를 켜고, 클래스 라이브러리 프로젝트를 새로 만듭니다.
단계3. ExcelDna.Intergration.dll 참조 추가
ExcelDna.Intergration.dll 파일은 다운로드 받은 Excel-DNA 라이브러리의 압축을 풀면 나오는 Distribution 디렉터리에 있습니다.

참조 추가 후 "로컬 복사" 속성을 false 로 지정 해 줍니다. 이 파일은 빌드 결과물에 포함되지 않아도 됩니다.

단계4. 엑셀 UDF 용 클래스 및 메소드 작성
메소드는 public static 형식으로 제작하며, ExcelFunction 속성을 지정 해 주면 엑셀에서 함수마법사 기능을 사용시 이름 및 설명글로 원하는 내용을 보여 줄 수 있습니다.
using System;
using ExcelDna.Integration;
namespace MyUDF
{
public class Class1
{
[ExcelFunction(Category="MyUDF",Description="헬로 UDF!!")]
public static string HelloUDF(string inputStr)
{
return string.Format("사용자정의함수(입력값:{0})", inputStr);
}
}
}
단계5. .dna 파일 생성
.dna 파일을 하나 생성 합니다. 파일의 이름은 마음대로 해도 되지만, 추후 만들 .xll 파일의 이름과 일치시켜 줘야 합니다.
파일의 내용은 아래와 같이 해 줍니다.
<DnaLibrary Name="MyUDF">
<ExternalLibrary Path="MyUDF.dll" />
</DnaLibrary>
닷넷 4.0 이상 버전에서는 다음과 같이 RuntimeVersion 속성을 지정 해 주셔야 합니다.
<DnaLibrary Name="MyUDF" RuntimeVersion="4.0">
<ExternalLibrary Path="MyUDF.dll" />
</DnaLibrary>
그리고 파일의 속성 중 "출력 디렉터리로 복사" 의 값을 "변경된 내용만 복사" 로 설정 해 줍니다.

단계6. ExcelDna.xll 파일 복사
다운로드 받은 Excel-DNA 라이브러리의 Distribution 디렉터리에 있는 ExcelDna.xll 파일을 프로젝트 디렉터리 내부로 복사 해 오고, 이름을 .dna 파일과 동일하게 변경 해 줍니다.


프로젝트에 .xll 파일을 추가 해 주고, 파일의 속성 중 "출력 디렉터리로 복사" 의 값을 "변경된 내용만 복사" 로 설정 해 줍니다.

단계7. 프로젝트 빌드
프로젝트를 빌드하면 다음과 같은 출력물이 나옵니다.

단계8. 엑셀에서 내가 만든 UDF 사용 하기
프로젝트를 빌드 한 출력물 중 .xll 파일을 더블클릭 하거나(임시 사용), 엑셀의 추가기능 관리 메뉴를 통해 추가(영구 사용) 해 줍니다.

직접 만든 함수를 사용 해 봅니다.


함수 마법사 창에서 설명이 제대로 표시 되는지 확인 해 봅니다.

단계1. 프로젝트의 속성 설정
프로젝트 속성 -> 디버그 탭에 들어가서 다음과 같이 설정 합니다.
시작 외부 프로그램: (엑셀 실행 프로그램의 경로)
명령줄 인수: (프로젝트 빌드시 출력 된 .xll 파일의 경로)

단계2. 브레이크 포인트 설정

단계3. 디버그 실행
디버그를 실행(F5) 하면 엑셀이 실행 되며, 아래와 같은 경고창이 뜹니다. "이 세션에서만 이 추가 기능을 사용합니다" 를 선택 하시면 됩니다.

단계4. 엑셀에서 디버그 하고자 하는 함수 사용
2번에서 설정 한 브레이크 포인트에서 디버그 포인터가 히트한 것을 확인 할 수 있습니다.

개발하는 동안에는 이렇게 개발과 디버깅을 반복하면 됩니다.
개발이 완료 된 후 배포를 해야 하는데, Excel-DNA 라이브러리에서 제공하는 패키징 도구를 사용하면 깔끔하게 패키징 할 수 있습니다.
패키징을 하면 단일 .xll 파일이 하나 생기는데, 이 파일은 이름을 마음대로 변경해도 되며, 다른 .dll 파일은 필요가 없게 됩니다.
단일 .xll 파일 하나에 UDF 를 사용하기 위해 필요한 모든 라이브러리(.dll) 을 포함시킨다고 생각하시면 됩니다.
단계1. .dna 파일 수정
아래와 같이 .dna 파일을 수정 해 줍니다. ExternalLibrary 항목에 Pack 속성이 추가 된 것에 주목하세요.
<DnaLibrary Name="MyUDF">
<ExternalLibrary Path="MyUDF.dll" Pack="true"/>
</DnaLibrary>
단계2. 프로젝트 리빌드
프로젝트를 리빌드 해서 변경 된 .dna 파일이 출력 디렉터리에 덮어 써지게 합니다.
단계3. 패키징
cmd 창을 열고 프로젝트 출력 디렉터리로 이동 합니다.
Excel-DNA 라이브러리의 Distribution 디렉터리에 있는 ExcelDnaPack.exe 프로그램을 실행하여 패키징을 합니다.

단계4. 패키지 파일 확인
프로젝트 출력 디렉터리에 가보면 -packed.xll 파일이 생겨 있는것을 확인 할 수 있습니다.
이 파일로 사용자에게 배포 해 주시면 됩니다. 각종 .dll 파일이 없어서 한결 깔끔한 배포가 가능 합니다.

이상입니다. 감사합니다.