Le problème
Vous ne pouvez pas faire cela avec Evaluate Formula parce que ce n'est pas le but de la fonction. C'est pourquoi on l'appelle évaluer , c'est pour évaluer les formules. Ce que vous voulez, c'est une sorte de déballage. C'est un besoin un peu spécial, de sorte qu'il n'est pas implémenté comme outil dans Excel, mais il existe des solutions si vous créez des fonctions / macros Visual Basic.
Créez un module de code VBA (macro) comme vous pouvez le voir dans ce tutoriel .
- Appuyez sur Alt+F11
- Cliquez pour
Module
dans Insert
.
- Coller le code.
Function CellFormula(Target As Range) As String
CellFormula = Target.Formula
End Function
Puis entrez ce qui suit dans une cellule: =CellFormula(A1)
Cela dira la formule de la cellule. Le seul problème avec ce code est qu'il ne fonctionne que pour un niveau. Si vous souhaitez également décompresser les formules de cellules contenues, vous avez besoin d'un code plus complexe avec récursivité.
La solution
Le voyage a été long, mais j’ai créé pour vous une macro VBA qui implémente cette fonction. Je ne dis pas que ce code fonctionnera pour toutes les formules, mais cela fonctionnera dans la plupart / certaines d'entre elles. De plus, je ne précise pas que ce code générera des formules équivalentes au code entré à l'origine ou donnera le même résultat que l'original.
Code source
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
Pour que cela fonctionne, il suffit de créer une macro (comme je l'ai décrite au début de la réponse) et de copier-coller le code. Après cela, vous pouvez l'utiliser avec =CellFormula(A1)
où A1
peut être n'importe quel type de cellule 1x1.
Cas ça marche
J'ai créé quelques exemples pour que vous puissiez le voir en action. Dans ce cas, je démontre l'utilisation avec des chaînes. Vous pouvez voir que cela fonctionne parfaitement. Le seul petit problème est que, pour l’algorithme, l’algorithme change les points-virgules en virgules. Après les avoir remplacés (comme je l’ai fait dans cet exemple), vous obtenez le bon résultat.
Ici, vous pouvez voir comment cela fonctionne avec les chiffres. Maintenant, nous sommes confrontés au premier problème que l’algorithme ne se soucie pas de la séquence des opérations mathématiques, c’est pourquoi le nombre rouge est 6 alors qu'il devrait être 10. Si nous plaçons les opérations sensibles (comme l’addition et la soustraction) entre parenthèses, la formule donnée entrée en arrière donnera le même résultat que vous pouvez voir dans le nombre vert en bas qui dit 10.
Cas ça ne marche pas
Cet algorithme n'est pas parfait. J’ai seulement essayé d’implémenter les utilisations les plus courantes. Il est donc possible de l’améliorer en ajoutant davantage de fonctionnalités prenant en charge d’autres cas, comme les plages.
Comme vous pouvez le voir dans cet exemple, j'ai utilisé SUM()
une plage en tant que paramètre. Étant donné que l’algorithme décrypte le contenu des cellules de haut en bas, il commence par le remplacement des SUM()
paramètres au plus tard. Par conséquent, les :
objets restent à sa place pendant que tout est remplacé, de sorte que les nouvelles cellules sont remplacées à proximité, ce qui en changera le sens. Ainsi, la sortie sera fausse. Donc, dans ce cas, vous ne pouvez utiliser cette macro que pour étudier la formule d'origine.