2013-10-01 6 views
2

:vba에서 실제 값으로 수식을 얻는 방법은 무엇입니까?

는 다음과 같은 문제 제발 도와주세요 제가 엑셀에 코드를 쓰고 있어요 나는 새로운 해요 :

  • 내가 =B1*C1*D1
  • 세포 B1의 세포 A1에서 수식을 가지고, C1D1 내가 문자열로 공식을 얻으려면 각각의 (예 : 3,2,1) 값

이 - 즉 =3*2*1 - VBA

+4

코드를 게시하십시오. –

+1

나는 당신이 필요로 여기에 찾을 수 있다고 생각 : [link] (http://stackoverflow.com/questions/11579748/display-values-in-cell-formula-instead-of-references-alternatively-create-a-co) – L42

답변

2

당신은 모든 비 수학 연산자 부분을 구문 분석

  • 를 사용할 수
  • 그런 다음 Evaluate이 모든 문자열 섹션
,

그것은 아마도 복잡한 문자열을 finessing해야하지만 그

은 더 복잡한에 대한 업데이트 좋은 시작은

enter image description here

코드

Sub ParseEm() 
Dim strIn As String 
Dim strNew As String 
Dim strCon As String 
Dim lngCnt As Long 

Dim objRegex As Object 
Dim objRegMC As Object 
Dim objRegM As Object 

strCon = "|" 
Set objRegex = CreateObject("vbscript.regexp") 

With objRegex 
    .Pattern = "[^=/+/\/-/*\^]+" 
    .Global = True 
    strIn = [a1].Formula 
    If .test(strIn) Then 
     Set objRegMC = .Execute(strIn) 
     For Each objRegM In objRegMC 
     strNew = Evaluate(CStr(objRegM)) 
     If objRegM.Length >= Len(strNew) Then 
     Mid$(strIn, objRegM.firstindex + 1 + lngCnt, objRegM.Length) = strNew & Application.Rept(strCon, objRegM.Length - Len(strNew)) 
     Else 
      strIn = Left$(strIn, objRegM.firstindex + lngCnt) & strNew & Right$(strIn, Len(strIn) - objRegM.firstindex - objRegM.Length - lngCnt - 1) 
     lngCnt = lngCnt + Len(strNew) - objRegM.Length 
     End If 
     Next 
     strIn = Replace(strIn, strCon, vbNullString) 
     MsgBox strIn 
    Else 
     MsgBox "sorry, no matches" 
    End If 
End With 
End Sub 
+1

+1 멋지게 설명했습니다 : –

0

내가 아는 유일한 방법은 Precedents 기능을 사용하는 것입니다을 사용하여 :

Sub GetFormulaAsString() 
    Dim var As Range, temp As String, formulaAsString As String 

    temp = "=" 

    For Each var In Range("A1").Precedents 
     temp = temp & var & "*" 
    Next var 

    formulaAsString = VBA.Left$(temp, Len(temp) - 1) // "=3*2*1" 
End Sub 
+1

하드 코드 된'* '을 좋아하지 않아 –

+1

나는 당신의 요점을 이해합니다. 요구 사항이 좀 더 일반적인 경우 (예 :''''''''''''/''등을 처리 할 수있는 경우), 내 솔루션은 그것을 잘라 내지 않을 것입니다. –

0

아이디어가 대체하는 것입니다 일치 '값에 의해 .Formula 속성에서'셀 '참조. 단 하나의 문제는 수식의 $ 기호 때문입니다. 따라서 cA 및 rA주기가 추가되었습니다.

내가 문제를했던
Sub GetFormulaAsString() 
    Dim var As Range 
    Dim temp As String 
    Dim R As Range 
    Dim v As Variant 
    Dim cA As Integer 
    Dim rA As Integer 
    Dim cellname As String 

    Set R = Range("A1") 
    temp = R.Formula 
    Debug.Print temp 

    For Each var In R.DirectPrecedents 
     v = var.Value 
     For cA = 1 To 0 Step -1 
      For rA = 1 To 0 Step -1 
       cellname = var.Address(cA, rA) 
       temp = Replace(temp, cellname, v) 
      Next rA 
     Next cA 

    Next var 

    Debug.Print temp 
    msgbox temp 
End Sub 
+0

버그가 발견되었습니다 : 수식에 범위가있는 경우. – 4dmonster

0

, 의사는 다음과 같습니다

  1. 셀 A1에서이 ="="&b1&"*"&c1&"*"&d1 같은 새로운 공식을 만들어 문자열 A1 지하 1 층 C1에게

  2. 을 찾는

  3. a1의 값을 얻는다.

나쁘지 않습니까? :)

+0

을 수정하려고하면 VBA를 사용하고 싶다고 생각 했습니까? 적어도 그것은 당신이 처음에 요구 한 것입니다.또한 이것은 하드 코딩 된'*'을 가지고 있으므로 실제 수식이'+'등을 사용한다면 작동하지 않을 것입니다 –

관련 문제