[Hola
Pues sí, cuando hablas de "Auditoría de fórmulas" es relativamente fácil de entender y más con la explicación que complementa. Eso sí, el hacerlo no es fácil pero por suerte el gran "Chip" Pearson (QEPD) nos dejó algo que ayudará.
Lo primero es dejar en claro algunas cosas:
- Solo será útil para fórmulas hechas con operadores matemáticos: * / + - =
- Si hay otro tipo de fórmulas (que usen funciones, que tengan paréntesis, etc.) no funcionará (habría que hacer muchos más cambios que conlleva un tiempo que no es el que damos algunos para ayudar ad honorem).
- El ejemplo lo he dejado para aplicar en una celda en específico ("C1"), pero por ejemplo con un "For Each" puede ser adaptado a varias a la vez (ya esa es tarea tuya si lo necesitas).
Entonces, lo primero es copiar y pegar esto en un módulo "standard":
Function SplitMultiDelims(Text As String, DelimChars As String) As String()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SplitMutliChar
' This function splits Text into an array of substrings, each substring
' delimited by any character in DelimChars. Only a single character
' may be a delimiter between two substrings, but DelimChars may
' contain any number of delimiter characters. If you need multiple
' character delimiters, use the SplitMultiDelimsEX function. It returns
' an unallocated array it Text is empty, a single element array
' containing all of text if DelimChars is empty, or a 1 or greater
' element array if the Text is successfully split into substrings.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim Pos1 As Long
Dim N As Long
Dim M As Long
Dim Arr() As String
Dim I As Long
''''''''''''''''''''''''''''''''
' if Text is empty, get out
''''''''''''''''''''''''''''''''
If Len(Text) = 0 Then
Exit Function
End If
''''''''''''''''''''''''''''''''''''''''''''''
' if DelimChars is empty, return original text
'''''''''''''''''''''''''''''''''''''''''''''
If DelimChars = vbNullString Then
SplitMultiDelims = Array(Text)
Exit Function
End If
'''''''''''''''''''''''''''''''''''''''''''''''
' oversize the array, we'll shrink it later so
' we don't need to use Redim Preserve
'''''''''''''''''''''''''''''''''''''''''''''''
ReDim Arr(1 To Len(Text))
I = 0
N = 0
Pos1 = 1
For N = 1 To Len(Text)
For M = 1 To Len(DelimChars)
If StrComp(Mid(Text, N, 1), Mid(DelimChars, M, 1), vbTextCompare) = 0 Then
I = I + 1
Arr(I) = Mid(Text, Pos1, N - Pos1)
Pos1 = N + 1
N = N + 1
End If
Next M
Next N
If Pos1 <= Len(Text) Then
I = I + 1
Arr(I) = Mid(Text, Pos1)
End If
''''''''''''''''''''''''''''''''''''''
' chop off unused array elements
''''''''''''''''''''''''''''''''''''''
ReDim Preserve Arr(1 To I)
SplitMultiDelims = Arr
End Function
Luego, también copias y pegas esta macro:
Sub Convertir()
Dim MiArray() As String
Dim MiFormula As String
Dim x As Integer
MiArray = SplitMultiDelims(Range("C1").Formula, "=+-*/")
MiFormula = Range("C1").Formula
For x = 2 To UBound(MiArray)
MiFormula = Replace(MiFormula, MiArray(x), Range(MiArray(x)).Value)
Next x
Range("C1").Formula = MiFormula
End Sub
Esa macro es la que usaras para obtener el resultado deseado. No olvides que en "C1" debes tener la fórmula.
Saludos]
Abraham Valencia