문제
이것이이 함수의 목적이 아니므로 수식 평가로는이 작업을 수행 할 수 없습니다. 그게 왜 불려지는가요? 평가하다 , 그것은 공식을 평가하기위한 것입니다. 네가 원하는 것은 짐을 풀 때이다. 이것은 약간 특별한 필요로 Excel에서 도구로 구현되지 않지만 Visual Basic 함수 / 매크로를 만드는 경우 솔루션이 있습니다.
보시다시피 VBA 코드 모듈 (매크로) 만들기 이 튜토리얼 .
- 프레스 Alt + F11
- 클릭하여
Module
...에서 Insert
.
- 코드 붙여 넣기.
Function CellFormula(Target As Range) As String
CellFormula = Target.Formula
End Function
그런 다음 셀에 다음을 입력하십시오. =CellFormula(A1)
이것은 세포의 공식을 말할 것입니다. 이 코드의 유일한 문제점은 한 수준에서만 작동한다는 것입니다. 포함 된 셀 수식도 압축하려는 경우 재귀를 사용하여보다 복잡한 코드가 필요합니다.
해결책
그것은 긴 jurney했지만이 함수를 구현하는 VBA 매크로를 만들었습니다. 나는이 코드가 모든 수식에 대해 작동 할 것이라고 말하지는 않지만 대부분의 수식에서 사용할 수 있습니다. 또한이 코드는 원래 입력 된 코드와 동일한 수식을 생성하거나 원본과 동일한 결과를 제공한다고 명시하지 않습니다.
소스 코드
Option Explicit
Function isChar(char As String) As Boolean
Select Case char
Case "A" To "Z"
isChar = True
Case Else
isChar = False
End Select
End Function
Function isNumber(char As String, isZero As Boolean) As Boolean
Select Case char
Case "0"
If isZero = True Then
isNumber = True
Else
isNumber = False
End If
Case "1" To "9"
isNumber = True
Case Else
isNumber = False
End Select
End Function
Function CellFormulaExpand(formula As String) As String
Dim result As String
Dim previousResult As String
Dim cell As Range
Dim stringArray() As String
Dim arraySize As Integer
Dim n As Integer
Dim trimmer As String
Dim c As Integer 'character number
Dim chr As String 'current character
Dim tempcell As String 'suspected cell's temporaly result
Dim state As Integer 'state machine's state:
Dim stringSize As Integer
result = formula
previousResult = result
state = 0
stringSize = 0
For c = 0 To Len(formula) Step 1
chr = Mid(formula, c + 1, 1)
Select Case state
Case 0
If isChar(chr) Then
state = 1
tempcell = tempcell & chr
ElseIf chr = "$" Then
state = 5
tempcell = tempcell & chr
Else
state = 0
tempcell = ""
End If
Case 1
If isNumber(chr, False) Then
state = 4
tempcell = tempcell & chr
ElseIf isChar(chr) Then
state = 2
tempcell = tempcell & chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell & chr
Else
state = 0
tempcell = ""
End If
Case 2
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
ElseIf isChar(chr) Then
state = 3
tempcell = tempcell + chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 3
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
ElseIf chr = "$" Then
state = 6
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 4
If isNumber(chr, True) Then
state = 4
tempcell = tempcell + chr
Else
state = 0
stringSize = stringSize + 1
ReDim Preserve stringArray(stringSize - 1)
stringArray(stringSize - 1) = tempcell
tempcell = ""
End If
Case 5
If isChar(chr) Then
state = 1
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case 6
If isNumber(chr, False) Then
state = 4
tempcell = tempcell + chr
Else
state = 0
tempcell = ""
End If
Case Else
state = 0
tempcell = ""
End Select
Next c
If stringSize = 0 Then
CellFormulaExpand = result
Else
arraySize = UBound(stringArray)
For n = 0 To arraySize Step 1
Set cell = Range(stringArray(n))
If Mid(cell.formula, 1, 1) = "=" Then
trimmer = Mid(cell.formula, 2, Len(cell.formula) - 1)
If trimmer <> "" Then
result = Replace(result, stringArray(n), trimmer)
End If
End If
Next
If previousResult <> result Then
result = CellFormulaExpand(result)
End If
End If
CellFormulaExpand = result
End Function
Function CellFormula(rng As Range) As String
CellFormula = CellFormulaExpand(rng.formula)
End Function
그것을 만들기 위해서 그냥 매크로를 만들고 (내가 대답의 시작 부분에서 설명했듯이) 코드를 복사하여 붙여 넣으십시오. 이 후에는 =CellFormula(A1)
어디에 A1
모든 종류의 1x1 셀이 될 수 있습니다.
사례가 작동합니다.
나는 그것을 실제로 볼 수 있도록 몇 가지 예를 만들었습니다. 이 경우에는 문자열로 사용하는 방법을 보여줍니다. 당신은 그것이 완벽하게 작동하는 것을 볼 수 있습니다. 유일한 버그는 알고리즘이 세미콜론을 쉼표로 변경한다는 것입니다. 당신이 그들을 대체 한 후에 (나는이 예제에서와 같이) 올바른 결과를 얻는다.
숫자와 함께 작동하는 방식을 볼 수 있습니다. 이제 우리는 알고리즘이 수학 연산 순서에 관심을 갖지 않는 첫 번째 문제에 직면하게됩니다. 즉, 10 일 때 빨간색 숫자가 6이되는 이유입니다. 덧셈과 뺄셈 같은 민감한 연산을 괄호에 넣으면 주어진 다시 입력 한 수식은 하단의 10이라는 녹색 숫자에서 볼 수있는 것과 동일한 출력을 제공합니다.
작동하지 않는 경우
이 알고리즘은 완벽하지 않습니다. 나는 가장 일반적인 용도로만 구현하려고 했으므로 범위와 같은 다른 경우를 처리하는 더 많은 기능을 추가하여 향상시킬 수 있습니다.
이 예제에서 볼 수 있듯이 SUM()
범위를 매개 변수로 사용합니다. 알고리즘은 위에서 아래로 셀 내용을 해독하기 때문에 SUM()
매개 변수는 나중에 다른 것보다. 따라서 :
그 주위에있는 동안 모든 것이 바뀌어 새로운 세포가 그 주변으로 바뀌고 누가 그 세포의 의미를 바꿀 것인가? 따라서 출력이 틀립니다. 따라서이 경우에만이 매크로를 사용하여 원래 수식을 연구 할 수 있습니다.