"텍스트로 된 수식의 값 구하기(1)"에서는 곱하기만을 다뤘는데,
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%B01-%EA%B3%B1%ED%95%98%EA%B8%B0%EB%A7%8C
이번에는 *뿐만 아니라 +, /, - 등 사칙 연산을 제대로 계산해서 값을 구하는 것을 구현해 보겠습니다.
1. 연산자 위치 알아내기
"텍스트로 된 수식의 값 구하기(1)"에서도 연산자인 *의 위치를
=find("*",a3) 수식을 이용해 구했으나,
사칙 연산 기호가 모두 적용돼야 하므로
위 수식을 수정해야 합니다.
그런데 문제점은 B3셀에 =find("+",a3)라고 입력하면 +기호가 없기 때문에 #VALUE! 에러가 발생합니다.
따라서, ifError함수와 결합해서 에러가 날 때는 0은 반환하도록 해야 합니다.
=iferror(find("+",a3),0)
사칙 연산자 *, +, /, -가 있는 위치를 구하려면,
에러가 아니면 그 위치를 반환하고, 에러면 0을 반환하도록 해야 하며,
4개의 수중 최댓값이 사칙 연산자의 위치가 됩니다.
따라서 이를 수식으로 표현하려면
=다음에 max라고 최댓값을 구하는 함수명을 입력하고,
IFERROR(FIND("+",A3),0)까지 복사한 후
,(쉼표)를 입력한 후 붙여 넣고, *로 수정하고,
이런 작업을 두 번 더 하고, +를 /와 -로 수정한 다음 괄호를 닫고 엔터키를 누릅니다.
그러면 수식은 IFERROR(FIND("+",A3),0) 형식이 네 번 반복되고,
=MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))
이 되고, 연산자가 두 번째에 있으므로 2가 반환됩니다.
B3셀의 채우기 핸들을 더블 클릭하면 B6셀까지 수식이 복사되고, 값 2, 3, 4, 4가 반환됩니다.
2. 연산자 구하기
연산자는 연산자의 위치에서 한 개의 텍스트를 가져오면 되므로
Mid함수를 이용해 위에서 구한 위치에서 1개를 가져오도록
먼저 B3셀의 수식 입력줄에서 max부터 끝까지 복사한 후[MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))]
Esc키를 누르고,
C3셀을 클릭한 다음 =mid(a3, 까지 입력한 다음 붙여 넣고
,1을 입력한 다음 괄호를 닫고 엔터키를 누르면 됩니다.
수식은 =MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)
이 됩니다.
C3셀의 채우기 핸들을 더블 클릭해서 A3셀부터 A6셀에 있는 연산자를 구해줍니다.
3. 연산자를 기준으로 두 개의 숫자 구하기
왼쪽 숫자는 Left함수를 이용해 연산자의 위치-1까지 텍스트를 구하고,
두 번째 숫자는 Mid함수를 이용해 연산자의 위치+1부터 10개 텍스트를 가져오면 됩니다.
따라서, B3셀에서 Max부터 끝까지
[MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))]
복사한 후 Esc키를 누르고,
C3셀의 수식 입력줄의 = 다음에 커서를 놓고 left(a3,를 입력한 후 붙여 넣기를 하고 -1)를 입력한 후
그 뒤의 사칙 연산자와 결합하기 위해 & 연산자를 입력하고 엔터키를 누릅니다.
그러면 아래와 같은 수식이 되고 값은 1*가 반환됩니다.
=LEFT(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))-1)&MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)
이 번에는 수식 입력줄의 맨 뒤에 커서를 넣은 다음
&mid(a3, 까지 입력한 후 복사한 것을 붙여 넣고,
+1,10)를 입력합니다.
그러면 수식은 복잡하지만
=LEFT(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))-1)
&MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)
&MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))+1,10)이 됩니다.
그런데 문제는 1*2이지만 값이 2가 반환되지 않는 것입니다.
원인은 사칙 연산자를 &(결합 연산자)로 결합하면 안 되고, 연산자의 종류에 따라 *, +, /, - 등을 입력해야 합니다.
따라서, 수식 중 연산자를 구하는 부분인 &MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)& 를
*로 바꾸면 값이 제대로 구해집니다.
4. 연산자의 종류에 따라 연산자를 입력하기
연산자가 *인 경우는 *를 입력하고, *가 아니고 +면 +를 입력하는 식이 돼야 하므로 중첩 if문을 사용해야 합니다.
가. 연산자가 *인 경우
연산자가 *인 경우는
if(MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)="*", 가 됩니다.
따라서, 위 수식을 기존 수식 앞에 추가하고 맨 끝으로 이동한 다음 괄호를 닫고 엔터키를 누르면 값 2가 구해집니다.
=IF(MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0)),1)="*",
LEFT(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))-1)
*
MID(A3,MAX(IFERROR(FIND("+",A3),0),IFERROR(FIND("*",A3),0),IFERROR(FIND("/",A3),0),IFERROR(FIND("-",A3),0))+1,10)
)
Microsoft 365에서는 아래와 같이 수식 사이에 Alt+Enter 키를 입력해서 수식을 이해하기 쉽도록 구분할 수 있는데, 이전 버전에서는 안될 수도 있습니다.
나. 연산자가 +인 경우
이제 중첩 if문을 사용해야 하므로
=다음 if부터 맨 끝의 괄호까지(아래 하면에서 빨간 줄로 표시한 부분) 복사한 후 쉼표(,)를 입력하고 붙여 넣는데 *를 +로 두 군데 고치고, 닫는 괄호를 입력하고 엔터키를 누릅니다.
C3셀의 채우기 핸들을 더블 클릭하면 *와 +는 제대로 처리가 되는데, /와 -는 False라고 표시됩니다.
왜냐하면 /와 -에 대한 처리가 없기 때문입니다.
다. /와 - 연산자 처리하기
C3셀을 클릭한 다음
수식 입력줄에서
=다음 if부터 4번째 줄 ,(쉼표) 전까지 복사한 후 쉼표(,)를 입력하고 붙여 넣기를 하고 *를 /로 바꾸고,
Mid 수식이 끝나는 12번째 줄에 쉼표를 입력하고 *를 -로 고치고, 닫는 괄호를 두 번 입력합니다.
그러면 아래와 같은 수식이 됩니다.
복잡하지만 같은 구문이 4번 반복된 것이고, 연산자만 다를 뿐입니다.
=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))
)
)
)
C3셀부터 C6셀까지 값이 제대로 구해졌습니다.
한 걸음 한 걸음 걷다 보면 어느덧 정상에 도달해 있습니다.
'Excel' 카테고리의 다른 글
여러 가지 조건을 만족하는 값을 찾을 때(1) - VLookup, Index+Match, XLookup함수 (0) | 2023.07.24 |
---|---|
텍스트로 된 수식의 값 구하기(3) - Let, Switch 함수 이용 (0) | 2023.07.18 |
RandArray 함수 (0) | 2023.07.15 |
RandBetween 함수 (0) | 2023.07.14 |
Rand 함수 (0) | 2023.07.12 |