Cria o valor das células com base na fórmula no Excel VBA

0

Eu tenho uma planilha do Excel como essa, existe uma maneira de obter valor no C8 usando o C6 no VBA?

    
por Ravi chawla 29.07.2016 / 18:54

1 resposta

3

Um método não VBA:

Nomeie os intervalos pelos respectivos detalhes

Então, C2 seria x , C3 seria y e ...

Para fazer isso rapidamente:

  1. Destaque B2: C4

  2. Na guia Fórmula, clique em Create from Selection

  3. Escolha Left e, em seguida, clique em OK

IssonomearáascélulasrealçadasnaColunaC;x,y,zrespectivamente.

EntãosuafórmulaemC6seria:

=x*y*1000/z

EmC8:

=FORMULATEXT(C6)

Seissonãofuncionar,asseguintesUDFsfarãooquevocêdeseja:

FunctionFoo(rngAsRange)AsStringDimMathArr()'AddtothisarrayasneededtofindallthemathfunctionsMathArr=Array("*", "-", "+", "/", "(", ")")

    Dim strArr() As String
    Dim temp As String
    Dim strFormula As String
    Dim i As Long

    'Hold two versions of the formula, one manipulate and the other to use.
    strFormula = rng.Formula
    temp = rng.Formula

    'Replace all math functions with space
    For i = LBound(MathArr) To UBound(MathArr)
        strFormula = Replace(strFormula, MathArr(i), " ")
    Next i

    'Split on the space
    strArr = Split(strFormula)

    'iterate and test each part if range
    For i = LBound(strArr) To UBound(strArr)
        If test1(strArr(i)) Then
            'If range then we repace that with the value to the right of that range
            temp = Replace(temp, strArr(i), Range(strArr(i)).Offset(, -1).Value)
        End If
    Next i

    'Return text
    Foo = "=" & temp

End Function

Function test1(reference As String) As Boolean
Dim v As Range

' if the string is not a valid range it will throw and error
On Error Resume Next
Set v = Range(reference) 'try to use referenced range, is address valid?
If Err.Number > 0 Then
    Exit Function 'return false
End If
On Error GoTo 0
test1 = True
End Function

Sem os intervalos sendo nomeados, então a fórmula em C6 é =C2*C3*1000/C4 , eu coloco isso em C8:

=Foo(C6)

    
por 29.07.2016 / 19:00