최종 (비 공식, 가치 전용) 셀의 관점에서 복잡한 Excel 수식을 표현하는 방법이 있습니까?


4

복잡한 Excel 스프레드 시트 (여러 워크 시트에서 다른 수식을 사용하여 수식에 액세스하는 수식)가 결국 다른 여러 셀 (매개 변수)의 입력을 사용하여 단일 셀 (출력)을 계산합니다. 출력 셀에서 시작하여 재귀 적으로 계산을 언 롤링하는 자동화 된 방법 (Excel 매크로 또는 독립 실행 형 도구)이 매개 변수 셀의 관점에서 직접 수식을 나타낼 때까지 있습니까?

설명

의견에는 수식 평가 도구에 대한 제안이있었습니다. Mac 용 Excel 2008에서 활성화하는 방법을 찾지 못했지만 설명 사용자가 셀 평가를 단계별로 수행 할 수있는 것처럼 들립니다. 그건 내가 필요로하는 것이 아니다. 내가 필요한 것은 수식을 포함하는 다른 셀을 참조 할 수있는 주어진 셀의 수식을 최종 셀 (수식이 아닌 값을 포함하는 수식)으로 표현 된 동등한 수식으로 변환하는 방법입니다.

다음은 간단한 예입니다. 방해

  • A1 있다 = B1 + C1
  • B1 있다 = B2 * B2
  • C1 있다 = C2 * C2
  • B2 있다 1
  • C2 있다 2

수식을 평가하면 계산의 단계를 밟을 수 있습니다. A1 의 최종 가치에 도달하기 위해 5. 내가 필요로하는 것은 언롤 할 수있는 도구입니다. A1 수식에 = B2 * B2 + C2 * C2 실제로 그것을 평가하지 않고.


1
"수식 평가"가 원하는대로 할 수 있습니까? 그렇지 않다면 좀 더 명확하게 설명해 주시겠습니까? 해야 할 것 필요?
Scott

@ 스콧 - 제안 주셔서 감사하지만 그것이 내가 원하는 것 같지 않습니다. 귀하의 질문에 대답하기 위해, 나는 매개 변수 셀의 관점에서 수식을 직접 표현할 때까지 "계산을 푸는"도구가 필요합니다. 나는이 문장이 꽤 명확하다고 생각했지만 필자는 필자가 필요로하는 것과 필자가 필요로하지 않는 것에 대한 명백한 예를 추가하고 수식 평가가 아마도 내 문제의 올바른 해결책이 아닌 이유에 대한 설명을 추가했습니다.
George Skoptsov

좋은 예. 내 두 번째 추측은 당신이 원했을 것입니다. = (1*1) + (2*2) 그 상황을 위해; 그걸 정리 해줘서 고마워. "Step In"기능을 사용하여 "Evaluate Formula"를 사용할 수 있지만 그 과정에서 100 만회가 필요하며 수동으로 결과를 수집해야합니다. ( 이 합성 이미지 (화장품을 목적으로 많이 편집 된)이 과정을 설명합니다.) 분명히 실용적이지 않습니다.
Scott

나는 생각한다. 프로를 부양하다 그렇지만 나는 그것을 시도하지 않았으며 무료가 아닙니다 (무료 평가판이 있습니다). Mac에서 사용 가능한지 확실하지 않습니다 (그럴 것 같지 않습니다).
assylias

@ 조지,이 웹 사이트는 지금 구식 인 것 같아 보이지만이 종류의 상용 솔루션이 몇 가지 있다고 생각합니다. 현명하게 스프레드 시트 수식을 "기본"으로 개발 한 다음 도구를 실행하여 코드로 변환하면 Excel 자체를 비롯하여 어디서나 컴파일하고 호출 할 수 있습니다. calc4web.com
jtolle

답변:


3

문제

이것이이 함수의 목적이 아니므로 수식 평가로는이 작업을 수행 할 수 없습니다. 그게 왜 불려지는가요? 평가하다 , 그것은 공식을 평가하기위한 것입니다. 네가 원하는 것은 짐을 풀 때이다. 이것은 약간 특별한 필요로 Excel에서 도구로 구현되지 않지만 Visual Basic 함수 / 매크로를 만드는 경우 솔루션이 있습니다.

보시다시피 VBA 코드 모듈 (매크로) 만들기 이 튜토리얼 .

  1. 프레스 Alt + F11
  2. 클릭하여 Module ...에서 Insert.
  3. 코드 붙여 넣기.
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 셀이 될 수 있습니다.

사례가 작동합니다.

나는 그것을 실제로 볼 수 있도록 몇 가지 예를 만들었습니다. 이 경우에는 문자열로 사용하는 방법을 보여줍니다. 당신은 그것이 완벽하게 작동하는 것을 볼 수 있습니다. 유일한 버그는 알고리즘이 세미콜론을 쉼표로 변경한다는 것입니다. 당신이 그들을 대체 한 후에 (나는이 예제에서와 같이) 올바른 결과를 얻는다. Work with strings

숫자와 함께 작동하는 방식을 볼 수 있습니다. 이제 우리는 알고리즘이 수학 연산 순서에 관심을 갖지 않는 첫 번째 문제에 직면하게됩니다. 즉, 10 일 때 빨간색 숫자가 6이되는 이유입니다. 덧셈과 뺄셈 같은 민감한 연산을 괄호에 넣으면 주어진 다시 입력 한 수식은 하단의 10이라는 녹색 숫자에서 볼 수있는 것과 동일한 출력을 제공합니다. Work with numbers

작동하지 않는 경우

이 알고리즘은 완벽하지 않습니다. 나는 가장 일반적인 용도로만 구현하려고 했으므로 범위와 같은 다른 경우를 처리하는 더 많은 기능을 추가하여 향상시킬 수 있습니다.
이 예제에서 볼 수 있듯이 SUM() 범위를 매개 변수로 사용합니다. 알고리즘은 위에서 아래로 셀 내용을 해독하기 때문에 SUM() 매개 변수는 나중에 다른 것보다. 따라서 : 그 주위에있는 동안 모든 것이 바뀌어 새로운 세포가 그 주변으로 바뀌고 누가 그 세포의 의미를 바꿀 것인가? 따라서 출력이 틀립니다. 따라서이 경우에만이 매크로를 사용하여 원래 수식을 연구 할 수 있습니다. Work with ranges


이것에 노력을 기울여 줘서 고마워. 한계를 이해하고 있지만 이것이 내가 요청한 것에 가장 가깝다고 생각합니다.
George Skoptsov

1

귀하의 질문에 귀하의 단어 "추적"을 감안할 때, 나는 당신이 Trace PrecendentsTrace Dependents Excel의 수식 감사 섹션에있는 함수?

다음은 dummies.com의 수식 감사 도구에 대한 간략한 설명입니다.

Excel 2010의 수식 검사 도구 이해


예, 저는 이러한 도구를 알고 있습니다 - 의존성 화살표를 그립니다 (워크 시트가 크거나 종속성이 다른 시트의 셀에있을 때 비참하게 실패합니다). 의존성을 아는 것 이상을 필요로합니다. 실제 표현을 만드는 방법이 필요합니다. '흔적'이라는 단어의 사용에 관해서 - @killermist는 내 원래의 제목을 오히려 이상하고 무의식적으로 편집했습니다.
George Skoptsov

1
VBA에 익숙하다면, 설명 된 함수로 모든 선례를 반복함으로써 전체 함수를 풀 수 있습니다 이리 .
user1936123
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.