C#/Office

[C#] Excel 이름관리자 설정 및 관리하기

쓰봥 2022. 1. 16. 22:50
SMALL

오늘 다뤄볼 내용은 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 에는 다른 값을 입력 하지 못하도록 할 수도 있다.

 

그래서 나는 이 기능은, 엑셀의 보고서 템플릿에 데이터 유효성 검사로 내용을 선택 할 수 있도록 만들어두고,

선택 할 수 있는 데이터를 엑셀 템플릿 문서업데이트 할 때, 이름의 범위를 업데이트하여 템플릿을 최신화 시키는데

해당 기능은 매우 유용하게 사용 할 수 있을 것으로 본다.

 

 

끝!