EXCEL - VBA

텍스트로 된 수식의 값 구하기(4 - 2) - 사용자 정의 함수

별동산 2023. 7. 20. 08:09
반응형

텍스트로 된 수식의 값 구하기(4 - 1) - Evaluate 함수에서 VBA의 Evaluate 함수를 이용해 수식의 값을 구할 수 있다는 것을 알았는데,

https://lsw3210.tistory.com/entry/%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A1%9C-%EB%90%9C-%EC%88%98%EC%8B%9D%EC%9D%98-%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B04-1-Evaluate-%ED%95%A8%EC%88%98

 

직접 실행창에서 매번 실행할 수는 없으므로 사용자 정의 함수를 만들어 사용해야 합니다.

텍스트수식5.xlsx
0.01MB

 

 

 

1. VB 에디터 실행

개발도구 - Visual Basic을 눌러 VB Editor를 연 다음

엑셀 파일명을 클릭한 다음

사용자 정의 폼 삽입 옆의 콤보 상자 버튼을 누릅니다.

 

그러면 모듈이 나오는데 모듈을 누릅니다.

 

그러면 엑셀 파일명 아래 모듈이 생기고, 그 아래 Module1이 추가되고, 오른쪽에 에디터 창이 보입니다.

 

2. 사용자 정의 함수 만들기

사용자 정의 함수이므로

function이라고 입력한 다음 함수명을 입력해야 하는데

calc_text1이라고 입력하겠습니다.

 

그리고, 인수를 받아야 하는데 셀 주소를 받을 것이므로

인수명은 text_Rng라고 하고, 형식을 as Range라고 범위 형식으로 지정하고,

괄호를 닫은 다음 엔터키를 누릅니다.

 

그러면 아래와 같이 Function으로 시작해서 End Function으로 끝나고,

Function 다음에 함수명, 그리고 괄호 안에 인수와 형식이 설정됐습니다.

 

함수의 반환 값은 함수명 = 수식 형식으로 지정하므로

calc_text = evaluate(text_Rng.value)

라고 입력합니다.

사용자 정의 함수가 완성됐습니다.

 

파일 메뉴 아래 엑셀 아이콘을 눌러 워크시트로 돌아갑니다.

 

아래와 같이 사칙 연산자를 이용해 수식을 입력했는데, 

 

B3셀에 =calc까지만 입력해도 함수명 calc_text가 표시되므로 탭키를 누른 다음 셀 주소 a3을 마우스로 클릭하고 괄호를 닫은 다음 엔터키를 누릅니다.

1*2의 결괏값 2가 구해졌습니다.

 

이제 B3셀의 채우기 핸들을 더블 클릭하면

워크시트에서 복잡하게 함수를 이용해 구했던 값을

https://lsw3210.tistory.com/entry/%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A1%9C-%EB%90%9C-%EC%88%98%EC%8B%9D%EC%9D%98-%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B02-%EC%82%AC%EC%B9%99-%EC%97%B0%EC%82%B0%EC%9E%90-%EC%A0%81%EC%9A%A9

 

=IF(MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0)),1)="*",
LEFT(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))-1)
*
MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))+1,10),
IF(MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0)),1)="+",
LEFT(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))-1)
+
MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))+1,10),
IF(MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0)),1)="/",
LEFT(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))-1)
/
MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))+1,10),
IF(MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0)),1)="-",
LEFT(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))-1)
-
MID(A4,MAX(IFERROR(FIND("+",A4),0),IFERROR(FIND("*",A4),0),IFERROR(FIND("/",A4),0),IFERROR(FIND("-",A4),0))+1,10))
)
)
)

 

너무나 쉽게 구할 수 있습니다.

 

3. 사용자 정의 함수 적용

사칙 연산에만 적용했는데 다양한 경우에 적용해 보겠습니다.

 

가. 사칙 연산자를 여러 번 사용한 경우

2번에서와 같이 사칙 연산자를 한 번 사용하는 경우뿐만 아니라 여러 번 사용하거나

괄호를 사용해도 모두 맞는 값을 구해줍니다.

예) 2*3+4 또는 2+3*4 또는 (2+3)*4

 

 

나. ^(거듭제곱 연산자)를 사용한 경우

2의 제곱 2^2과 2의 제곱근을 구하는 수식인 2^(1/2)도 맞는 값이 구해집니다.

 

다. 배분율을 구하는 % 연산자를 사용한 경우

예) 500*10%

 

라. 몫을 구해주는 % 연산자를 사용한 경우

예) 3%2는 1을 반환해야 하는데, #VALUE! 에러가 발생합니다.

 

마. 비교 연산자(=, >, >=, <, <=, <>)를 사용한 경우

예) 2=2 : 2가 2와 같은지이므로 Truie 반환

2<>3 : 2가 3과 다른지이므로 True 반환

3>2 : 3이 2보다 큰지이므로 True 반환

4>=3 : 4가 3 이상인지이므로 True 반환

텍스트수식5.xlsm
0.01MB

반응형