셀 서식의 통화 표시 알아내기 (2) - 사용자 정의 함수(UDF)
Sub 프로시저를 실행하면 여러 가지 동작을 한 번에 실행하는 것이고,
Function 프로시저는 내가 원하는 형태의 함수를 만드는 것입니다.
다시 말해 =함수명(셀 주소) 형식으로 매크로를 실행하는 것이 아니라
함수로 결괏값을 반환받는 것입니다.
따라서, 사용자 정의 함수(User Defined Function, UDF)를 만들어 사용하면 편리합니다.
1. 논리
NumberFormat을 했을 때는 원화 표시 ₩가 $로 표시되어서 사용할 수 없고,
NumberFormatLocal을 사용해야 합니다.
그러나. 세 번째 줄부터는 NumberFormat이나 NumberFormatLocal이 같습니다.
그리고, 한 자리 기호인 경우, 다시 말해 '['표시가 없는 경우)는 첫 번째 기호인 ₩와 $를 가져오면 되는데
세 번째 줄인 ¥표시부터는 셋째 자리 기호부터 가져오는 것은 같은데
다른 점은 네 번째 줄부터는 세 번째 위치부터 세 개를 가져오면 되는데,
세 번째 줄의 경우는 1개만 가져와야 한다는 것입니다.
2. 함수 만들기
가. ¥인지 비교하기
(1) 세 번째부터 한 글자를 가져와서 ¥과 같은지 비교하기 1(실패)
세 번째 위치의 기호가 ¥인지 알아보려면
직접 실행창에
?mid(range("a3").NumberFormat,3,1)="¥"
라고 입력할 수 있는데,
¥은 ㄹ을 누른 후 한자 키를 누르면 아래와 같이 2바이트 문자가 표시되는데,
탭키를 눌러 펼치면 두 번째 줄에 있으므로 마우스로 클릭하거나, 화살표 키를 이용해 이동한 후 엔터키를 눌러 입력할 수 있습니다.
위와 같이 입력한 후 엔터 키를 누르면
True가 나올 줄 알았는데 False가 나옵니다.
(2) 세 번째부터 한 글자를 가져와서 ¥과 같은지 비교하기 2(성공)
이번에는 Ascii 값을 구한 후 다시 문자로 변환한 후 비교해 보겠습니다.
직접 실행창에
?chr(asc(mid(range("a3").NumberFormat,3,1)))="¥"
라고 입력하면 True라고 표시됩니다.
오른쪽은 같은데, 왼쪽을 asc함수를 이용해 아스키코드 값을 구한 후
chr함수로 아스키코드를 문자로 바꾼 후 비교하면 True라고 표시됩니다.
asc 한 후 chr을 했으니 원래대로 돌아온 것인데 신기하게 True로 반환됩니다.
나. 사용자 정의 함수 만들기
(1) 함수명과 인수 지정하기
사용자 정의 함수를 만들 것이기 때문에
Funciton으로 시작해야 합니다.
함수명을 Sub 프로시저명과 동일하면 안 되므로
Get_Currency_Type으로 입력하고 인수로는 범위 변수인 rngA를 Range형식으로 지정하면
아래와 같이 됩니다.
Function Get_Currency_Type(rngA As Range)
End Function
그리고, 함수명 get_currency(sub 프로시저의 프로시저명과 동일함)를 입력한 다음
인수로 rngA를 입력하는데 Range(범위) 형식으로 지정합니다.
그리고, 엔터 키를 누르면 End Function은 자동으로 생깁니다.
(2) 조건문과 반환값 입력하기
(가) 조건문
조건문은 첫 번째 기호가 '['인지 비교해서
맞다면 세 번째부터 기호 3개를 가져오면 되는데,
세 번째부터 1개의 기호가 '¥'라면
예외적으로 '¥'라고 해야 합니다.
그리고, 첫 번째 기호가 '['가 아니라면
왼쪽부터 기호 1개를 가져오면 됩니다.
(나) 반환값 입력하기
VBA에서는 반환 값을 지정할 때 반드시 함수명을 사용합니다.
따라서, Get_Currrency_Type=Left(rngA,1) 식이 됩니다.
(다) 완성된 구문
아래와 같습니다.
Function Get_Currency_Type(rngA As Range)
If Left(rngA.NumberFormatLocal, 1) = "[" Then
Get_Currency_Type = Mid(rngA.NumberFormatLocal, 3, 3)
If Chr(Asc(Mid(rngA.NumberFormatLocal, 3, 1))) = "¥" Then
Get_Currency_Type = "¥"
End If
Else
Get_Currency_Type = Left(rngA.NumberFormatLocal, 1)
End If
End Function
(라) 코드 설명
①
If Left(rngA.NumberFormatLocal, 1) = "[" Then Get_Currency_Type = Mid(rngA.NumberFormatLocal, 3, 3) |
Left(rngA.NumberFormatLocal, 1) : 입력된 셀인 rngA의 NumberFormatLocal을 구한 다음 왼쪽부터 1개를 가져왔을 때 '['라면이 조건이고,
맞다면 반환값 Get_Currency_Type으로 rngA.NumberFormatLocal에서 세 번째부터 기호 3개를 가져오는 것입니다.
②
If Chr(Asc(Mid(rngA.NumberFormatLocal, 3, 1))) = "¥" Then Get_Currency_Type = "¥" End If |
만약 rngA의 NumberFormatLocal의 세 번째부터 1개의 기호값이 '¥'인 경우는
'¥'를 반환 값으로 하는 것입니다.
아니라면 위에서 정한 값이 유지됩니다.
③
Else Get_Currency_Type = Left(rngA.NumberFormatLocal, 1) End If |
Else는 rngA의 NumberFormatLocal에서 왼쪽 1개를 가져왔을 때 '['가 아니라면이 됩니다.
그럴 때는 반환 값을 Left(rngA.NumberFormatLocal, 1), 다시 말해 왼쪽 1개로 하면 됩니다.
3. 실행
(가) 표준도구모음에서 엑셀 아이콘을 눌러 엑셀로 돌아옵니다.
(나) 사용자 정의 함수를 이용해 수식 입력하기
C1셀에서 =하고 ge까지 입력하면
우리가 만든 Get_Currency_Type 함수가 보입니다.
마우스로 더블 클릭하거나, 화살표키로 이동한 후 탭키를 눌러 함수를 입력합니다.
그리고, A1셀 주소를 입력하거나 A1셀을 클릭한 후 (괄호를 닫고) 엔터키를 누르면
수식이 입력되고 원하는 값인 ₩이 구해집니다.
그런데 함수명은 이상하게 get_Currency_Type이라고 첫 번째 g가 대문자가 아니라 소문자로 표시됩니다. 어쩔 수 없습니다.
이제 C1셀의 채우기 핸들을 더블 클릭하면 C6셀까지 수식이 복사되고 원하는 값이 모두 구해졌습니다.
파일 메뉴에서 다른 이름으로 저장 메뉴를 누른 후 파일명을 통화 표시형식2(완성).xlsm으로 수정하고 저장합니다.