[C#] Excel 이름관리자 설정 및 관리하기
오늘 다뤄볼 내용은 Excel 의 '이름관리자' 에 관련된 내용이다.
우선 '이름 관리자'에 대해 간단하게 살펴보자.
'이름 관리자' 에서 '이름' 은 엑셀에서 미리 정의된 범위에 이름을 부여하는 거라고 생각하면 편할 것이다.
회계 문서나 정형화 된 문서 템플릿에서 어떤 셀에는 미리 정의된 값들 중
하나가 꼭 해당 셀에 들어가야 하는 경우가 있을 것이다.
예를 들어 어떤 물건을 구매한 건에 대한 보고서를 작성 한다고 가정하고 아래의 표를 보자.
물건 | 가격 | 수량 | 종류 | 비고 |
볼펜 | 500 | 10 | 사무용품 | |
우편 발송 | 3400 | 1 | 등기발송 |
여기서 '종류' 에 들어 가는 값이 미리 정의 되 있다고 가정하고 그 내용중에
{'사무용품', '등기발송', '다과' } 등의 리스트가 있다.
여기서 리스트 상의 내용을 같은 엑셀 시트나 다른 엑셀 시트에 미리 작성 해 두고,
그 리스트만 불러서 사용 가능 하도록 한다면 보고서 작성시 혼선을 줄일 수 있을 것이다.
여기서 위에 정의된 리스트를 미리 '이름' 으로 정의해 두고, 관리 하는 기능이 '이름 관리자' 이다.
물론 이것만으로는 부족하다고 느낄 수 는데 이 기능을
[데이터] - [데이터 유효성 검사] 기능과 같이 사용하면 엑셀에 콤보박스를 만들어 사용할 수 있을 것이다.
'데이터 유효성 검사' 에 대해서는 다른 글에서 써보거나 구글에 검색 하면 나올테니 참고 하면 될 것이다.
이제 본격적으로 해당 기능을 C# 으로 프로그래밍 하여 관리 하는 내용을 살펴보자.
필자는 Office 에 대한 기능을 개발 할 때, 실제 프로그램에서 해다 기능이 어떻게 동작 하는지 먼저 살펴보고 진행한다.
그러므로, 아래의 그림에서 '이름 관리자' 가 어디에 있고 어떻게 구성 되어 있는지 먼저 확인 해보자.
[수식] - [이름 관리자]
[이름 관리자]
여기서 우리가 확인 해 야 할 점은, '이름' 을 구성하는데 필요한 정보가 어떻게 구성 되어 있는지 확인 하는 것이다.
- 정의 될 이름
- 범위에 대한 정보
- 참조 대상 에 대한 정보
세가지 정보만 있으면 '이름' 이란 정보를 완성 할 수 있는 것을 알 수 있다.
이제 본격적으로 소스를 살펴 보자.
우선 'Name' 객체가 프로그램 소스 상으로 어떻게 구성 되어 있는지 확인 해 보자.
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
Excel.Application xlApp = new Excel.Application();
Workbook xlWb = xlWb = (Workbook)xlApp.Workbooks.Open(_file_path);
Excel.Name exName = null;
foreach (Excel.Name name in xlWb.Names)
{
string item_name = name.Name;
if(item_name == "target_name"
{
exName = name;
}
Range start_range = name.RefersToRange;
Range end_range = range.Cells[range.Rows.Count];
}
Workbook 에서 엑셀 문서에 포함된 '이름' 에 대해 확인 할 수 있다.
위 내용을 보면 Workbook 에서 'Names' 를 가져올 수 있고, 원하는 객체를 foreach 문으로 Loop 를 돌면서
찾고자 하는 'Name' 을 찾을 수 있도록 구성 되어 있다.
이미 정의 된 이름이 이미 존재 하면, 삭제도 가능 하다.
exName.Delete();
xlWb.Save();
이렇게 하면, 문서에 정의된 '이름'을 확인할 수 있다.
이제 반대로, 원하는 범위를 엑셀 문서에 저장 해 보자.
Excel.Range st_range = (Excel.Range)obj_list[0];
Excel.Range ed_range = (Excel.Range)obj_list[1];
Excel.Range name_range = xlWs.Range[st_range, ed_range];
int st_row = st_range.Row;
int st_col = st_range.Column;
int ed_row = ed_range.Row;
int ed_col = ed_range.Column;
string refersTo = string.Format("={0}!${1}${2}:${3}${4}",
xlWs.Name, st_row, st_col, ed_row, ed_col);
Excel.Name range_name = xlWb.Names.Add(name, name_range);
xlWb.Save();
이름을 지정 하는 방법도 간단하다. 범위를 지정할 시작 Cell 정보와 마지막 Cell 정보를 정의하고,
'이름' 의 이름을 정의 해 주고,
Workbook.Names.Add('이름', '이름의 범위')
이렇게 지정 해 주면 끝!!
이렇게 간단하게 엑셀의 '이름 관리자' 를 컨트롤 할 수 있는걸 알 수 있다.
하지만 이 기능은 단순히 하나의 기능 만으로는 왜 존재 하는지 이유를 알 수 없다(개인적인 생각)
그래서 마지막으로 엑셀에서 내가 이 기능을 활용 한 내용을 간략하게 설명하려고 한다.
우선 이 기능과 가장 잘 어울리는 기능은 위에서 말했던 '데이터 유효성 검사' 기능으로 '이름 관리자'를 활욯 하는
것을 보여주고 내가 생각하는 '이름 관리자' 에 대한 기능을 어떻게 활용하면 좋을까에 대해 적어보고 끝내려고 한다.
이제 위에서 지정한 이름을 '데이터 유효성 검사' 에서 '목록' 기능을 이용하여 콤보박스 형태로 만든 것이다.
'데이터 유효성' 창을 보면 '원본' 에 내가 위에서 정의한 이름 '물품구매종류' 가 들어가 있다.
말 그대로 '물품구매종류'라는 이름으로 지정한 범위를 목록으로 만들어 제공하고,
'오류 메시지' 탭에서 '유효하지 않은 데이터를 입력하면 오류 메시지 표기' 를 체크하면, 미리 정의된 내용이 아니면
해당 Cell 에는 다른 값을 입력 하지 못하도록 할 수도 있다.
그래서 나는 이 기능은, 엑셀의 보고서 템플릿에 데이터 유효성 검사로 내용을 선택 할 수 있도록 만들어두고,
선택 할 수 있는 데이터를 엑셀 템플릿 문서를 업데이트 할 때, 이름의 범위를 업데이트하여 템플릿을 최신화 시키는데
해당 기능은 매우 유용하게 사용 할 수 있을 것으로 본다.
끝!