XL 2013 Résultat de formule sans la calculer

benabou

XLDnaute Nouveau
Bonsoir, après plusieurs heures d'essai et de recherche sur le net sans résultat, je met ma question entre vos mains en espérant avoir une réponse pertinente.
Bon voilà, je cherche à avoir le résultat d'une formule sans le calcul comme suit:
A1=12 ; A2= 23 ; A3=A1+A2=35 et A4=A3*20%
C'est à dire avoir en A4=35*20% sans exécuter le calcul, comme ça on montre sur l'imprimé la manière dont est calculée la valeur dans A4.
Merci.
 

david84

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Bonsour®david84

petite correction :
Chaine = Chaine.FormulaLocal
:)
:( perfectible pour formules contenant ":"
Euh, ça plante dur avec Formula.Local sur mon fichier test (composé il est vrai de plus de formules et plus complexes) !
Mais après je n'ai pas revu la structure de la fonction par rapport à cela...mais sur le principe qu'apporterait de plus Formula.Local par rapport à Formula ?
perfectible pour formules contenant ":"
Que veux-tu dire ? As-tu des exemples qui ne donnent pas le résultat voulu ? Si oui lesquelles ?

Sinon Gérard j'aime bien l'idée mais sur des formules plus complexes et variées le résultat n'est pas toujours concluant chez moi. Mais bon c'est toujours pareil : avec les trois exemples basiques généreusement fournis par le demandeur, difficile de tester sérieusement...
A toutes fins utiles je mets le lien vers la discussion où j'avais déposé un fichier test...sans être sûr d'ailleurs que le résultat corresponde bien à l'attente du demandeur !

A+
 

job75

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Hello David,

Sinon Gérard j'aime bien l'idée mais sur des formules plus complexes et variées le résultat n'est pas toujours concluant chez moi.

Ma macro du post #15 laissait en effet à désirer, je l'ai modifiée dans ce fichier (2) :

1) il faut définir la plage a par :

Code:
Set a = dp(1): For Each c In dp: Set a = Range(a, c): Next
2) bien sûr il ne faut pas convertir les adresses des plages (exemple A1:A2).

Bonne soirée.
 

Pièces jointes

  • Formule Antécédents(2).xlsm
    24.6 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Bonjour à tous,

Il y avait encore bien des insuffisances.

Cette macro traite tous les cas de valeurs, nombres, textes, logiques, erreurs :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A:A]) Is Nothing Then Exit Sub
Dim c As Range, dp As Range, a As Range, i&, b As Range, btxt, t$, adr$, j%, k%
Application.ScreenUpdating = False
[B:B].ClearContents 'RAZ
For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
  If c.HasFormula Then c(1, 2) = "'" & c.FormulaLocal
Next
On Error Resume Next 's'il n'y a pas d'antécédents
Set dp = [A:A].DirectPrecedents 'antécédents
On Error GoTo 0
If dp Is Nothing Then Exit Sub
Set a = dp(1): For Each c In dp: Set a = Range(a, c): Next
For i = a.Rows.Count To 1 Step -1
  Set b = Intersect(a.Rows(i), dp)
  If Not b Is Nothing Then
    For Each b In b
      btxt = IIf(IsNumeric(b) Or IsError(b), b.Text, """" & b.Text & """")
      For Each c In b.DirectDependents 'dépendants
        t = Replace(c(1, 2), "$", "")
        adr = b.Address(0, 0)
        If InStr(t, adr & ":") + InStr(t, ":" & adr) = 0 Then
          For j = 1 To 0 Step -1
            For k = 1 To 0 Step -1
              c(1, 2) = "'" & Replace(c(1, 2), b.Address(j, k), btxt)
          Next k, j
        End If
    Next c, b
  End If
Next i
End Sub
Fichier (3).

David qu'en est-il sur tes formules ?

Bonne journée.
 

Pièces jointes

  • Formule Antécédents(3).xlsm
    25.9 KB · Affichages: 49
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Bonjour à tous

@ David84 : Effectivement, cela me rappelait quelque chose.

@ David84 et Job75 : Je ne sais pas si cela couvre toutes les possibilités, tous les types de formules, mais c'est déjà pas mal du tout.

@ plus
 

job75

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Re, salut CISCO,

Moyennant un traitement de texte très serré je suis arrivé à faire ce que je voulais :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A:A]) Is Nothing Then Exit Sub
Dim c As Range, dp As Range, a As Range, i&, b As Range, btxt
Dim j%, k%, conv As Boolean, t$, adr$, n As Byte, p%, q%
Application.ScreenUpdating = False
[B:B].ClearContents 'RAZ
For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
  If c.HasFormula Then c(1, 2) = "'" & c.FormulaLocal
Next
On Error Resume Next 's'il n'y a pas d'antécédents
Set dp = [A:A].DirectPrecedents 'antécédents
On Error GoTo 0
If dp Is Nothing Then Exit Sub
Set a = dp(1): For Each c In dp: Set a = Range(a, c): Next
For i = a.Rows.Count To 1 Step -1
  Set b = Intersect(a.Rows(i), dp)
  If Not b Is Nothing Then
    For Each b In b
      btxt = IIf(IsNumeric(b) Or IsError(b), b.Text, """" & b.Text & """")
      For Each c In b.DirectDependents 'dépendants
        For j = 1 To 0 Step -1
          For k = 1 To 0 Step -1
            conv = False: t = c(1, 2): adr = b.Address(j, k): n = Len(adr)
            For p = Len(t) To 2 Step -1
              q = IIf(p = 2, 2, p - 2)
              If Mid(t, p, n) = adr Then _
                If InStr(Mid(t, q, n + 3), ":") = 0 Then _
                  t = Left(t, p - 1) & btxt & Mid(t, p + n): conv = True
            Next p
            If conv Then c(1, 2) = "'" & t
    Next k, j, c, b
  End If
Next i
End Sub
Bien sûr le traitement est alourdi.

Fichier (4), la cellule B11 est maintenant convertie au mieux.

A+
 

Pièces jointes

  • Formule Antécédents(4).xlsm
    25.9 KB · Affichages: 38

Modeste geedee

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Bonsour®
Re, salut CISCO,

Moyennant un traitement de texte très serré je suis arrivé à faire ce que je voulais :
A+

:rolleyes:
chapeau bas ...

pour en revenir à l'idée du :
https://www.excel-downloads.com/threads/resultat-de-formule-sans-la-calculer.20002854/

peut etre pourrait-on éviter la colonne intermédiaire en plaçant directement le résultat en commentaire ???

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Intersect(Target, [A:A]) Is Nothing Then Exit Sub
 Dim c As Range, dp As Range, a As Range, i&, b As Range, btxt
 Dim j%, k%, conv As Boolean, t$, adr$, n As Byte, p%, q%
 Application.ScreenUpdating = False
 [B:B].ClearContents 'RAZ
 For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
   If c.HasFormula Then c(1, 2) = "'" & c.FormulaLocal
 Next
 On Error Resume Next 's'il n'y a pas d'antécédents
 Set dp = [A:A].DirectPrecedents 'antécédents
 On Error GoTo 0
 If dp Is Nothing Then Exit Sub
 Set a = dp(1): For Each c In dp: Set a = Range(a, c): Next
 For i = a.Rows.Count To 1 Step -1
   Set b = Intersect(a.Rows(i), dp)
   If Not b Is Nothing Then
     For Each b In b
       btxt = IIf(IsNumeric(b) Or IsError(b), b.Text, """" & b.Text & """")
       For Each c In b.DirectDependents 'dépendants
         For j = 1 To 0 Step -1
           For k = 1 To 0 Step -1
             conv = False: t = c(1, 2): adr = b.Address(j, k): n = Len(adr)
             For p = Len(t) To 2 Step -1
               q = IIf(p = 2, 2, p - 2)
               If Mid(t, p, n) = adr Then _
                 If InStr(Mid(t, q, n + 3), ":") = 0 Then _
                   t = Left(t, p - 1) & btxt & Mid(t, p + n): conv = True
             Next p
             If conv Then c(1, 2) = "'" & t
     Next k, j, c, b
   End If
 Next i
 '=================================
 On Error Resume Next
For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
   c.ClearComments
   If c.HasFormula Then
        c.AddComment c.Offset(0, 1).Text
   Else
        c.ClearComments
   End If
   c.Offset(0, 1).ClearContents
Next
'================================='
 End Sub
 

job75

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Re,

Très juste Modeste geedee, affichage des formules dans des commentaires :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not CommandButton1.Caption Like "Annuler*" Then Exit Sub
Dim c As Range, dp As Range, a As Range, i&, b As Range, btxt
Dim j%, k%, conv As Boolean, t$, adr$, n As Byte, p%, q%
Application.ScreenUpdating = False
Cells.ClearComments 'RAZ
For Each c In Me.UsedRange
  If c.HasFormula Then c.AddComment c.FormulaLocal: _
    c.Comment.Shape.TextFrame.AutoSize = True: c.Comment.Visible = True
Next
On Error Resume Next 's'il n'y a pas d'antécédents
Set dp = Cells.DirectPrecedents 'antécédents
On Error GoTo 0
If dp Is Nothing Then Exit Sub
Set a = dp(1): For Each c In dp.Areas: Set a = Range(a, c): Next
If a.Rows.Count > 1000 Then Set a = a.Resize(1000) 'limitation
If a.Columns.Count > 1000 Then Set a = a.Resize(, 1000) 'limitation
For i = a.Rows.Count To 1 Step -1
  Set b = Intersect(a.Rows(i), dp)
  If Not b Is Nothing Then
    For Each b In b
      btxt = IIf(IsNumeric(b) Or IsError(b), b.Text, """" & b.Text & """")
      For Each c In b.DirectDependents 'dépendants
        For j = 1 To 0 Step -1
          For k = 1 To 0 Step -1
            conv = False: t = c.Comment.Text
            adr = b.Address(j, k): n = Len(adr)
            For p = Len(t) To 2 Step -1
              q = IIf(p = 2, 2, p - 2)
              If Mid(t, p, n) = adr Then _
                If InStr(Mid(t, q, n + 3), ":") = 0 Then _
                  t = Left(t, p - 1) & btxt & Mid(t, p + n): conv = True
            Next p
            If conv Then c.Comment.Text t
    Next k, j, c, b
  End If
Next i
End Sub
On affiche maintenant toutes les formules de la feuille.

Edit : j'ai de nouveau modifié la définition de la variable a.

En effet il est impératif de limiter le nombre de lignes et de colonnes.

Pour que la macro s'exécute vite, évitez dans les formules les lignes et colonnes illimitées.

Fichier (5), voyez la cellule A12.

A+
 

Pièces jointes

  • Formule Antécédents(5).xlsm
    35.5 KB · Affichages: 31
Dernière édition:

david84

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Bonsoir,

Bravo Gérard !
J'ai testé rapidement et j'aime beaucoup la dernière version !
David qu'en est-il sur tes formules ?
J'ai regardé très rapidement : en fonction des cas il y a des résultats concordant et d'autres différents.
Cela me paraît logique car les 2 procédures ne font pas la même chose : la mienne calcule via l'utilisation d'Evaluate, avec effectivement les limites qui peuvent en découler (le ISNUMBER par exemple ou le #VALEUR engendré par le calcul, etc.).
La tienne recherche les antécédents et donc quand l'antécédent est une plage, elle ramène logiquement la plage.
Code:
=SOMME.SI(A1:A2;">0";A1:A2)+NB(A1:A2)
Ma procédure : =35,5+2
Ta procédure : =SOMME.SI(A1:A2;">0";A1:A2)+NB(A1:A2)

Après, je ne sais pas exactement quelles sont les attentes du demandeur sur ce type de formule mais personnellement je trouve ta manière d'aborder le sujet vraiment appropriée.

Je regarderai plus posément ta proposition ultérieurement.

A+
 

job75

XLDnaute Barbatruc
Re : Résultat de formule sans la calculer

Re,

Avec des colonnes ou lignes illimitées, le test supplémentaire If Not IsEmpty(b) Then

fait gagner beaucoup de temps, ci-joint les 2 derniers fichiers mis à jour.

PS : merci David pour tes commentaires.

A+
 

Pièces jointes

  • Formule Antécédents(4 bis).xlsm
    26.3 KB · Affichages: 34
  • Formule Antécédents(5 bis).xlsm
    35.9 KB · Affichages: 30

benabou

XLDnaute Nouveau
Re : Résultat de formule sans la calculer

Bonjour, je vous prie de m'excuser pour ce retard involontaire suite à une mission (boulot).
Alors, la dernière solution donnée par Mr. Victor21 a été fructueuse, seulement si je met A1-A2 par exemple, celà donne les deux décimales pour A1 et pour A2 c'est seulement le 1er décimale (le deuxième étant un Zéro) quelque soient les combinaisons réalisées. Donc si vous pouvez me donner un amendement pour cette solution et comment y intégrer la fonction rechercheV (avoir ="="&texte(A1-A2)"*"RechercheV()).
je vous remercie infiniment pour votre aide et partage. Merci
 

benabou

XLDnaute Nouveau
Re : Résultat de formule sans la calculer

Bonsoir, je m'excuse pour ce retard involontaire et heureux de vous retrouver.
Bon voilà, la solution donnée par Mr. Victor21 a vraiment résolu mon problème. Toutefois, avec deux décimales dont le deuxième est Zéro et si je saisie ="="&texte(A1-A2) par exemple, le résultat affiché est =234,67-167,7 au lieu de =234,67-167,70.
D'un autre côté, je cherche à incorporer une autre fonction telle que rechercheV dans ma formule et avoir comme résultat: =(234,67-167,7)*4% (4% étant le résultat de rechercheV, donc variable).
Merci pour votre aide et partage.
 

benabou

XLDnaute Nouveau
Re : Résultat de formule sans la calculer

Bonsoir, je m'excuse pour ce retard involontaire et heureux de vous retrouver.
Bon voilà, la solution donnée par Mr. Victor21 a vraiment résolu mon problème. Toutefois, avec deux décimales dont le deuxième est Zéro et si je saisie ="="&texte(A1-A2) par exemple, le résultat affiché est =234,67-167,7 au lieu de =234,67-167,70.
D'un autre côté, je cherche à incorporer une autre fonction telle que rechercheV dans ma formule et avoir comme résultat: =(234,67-167,7)*4% (4% étant le résultat de rechercheV, donc variable).
Merci pour votre aide et partage.
 

Discussions similaires

Statistiques des forums

Discussions
311 740
Messages
2 082 049
Membres
101 882
dernier inscrit
XaK_