Utilisation de "rechercher / remplacer" dans une macro

Mesdames et Messieurs bonsoir (ou bonjour peut-être).

Je me permets de solliciter votre aide pour le problème suivant:

Pour un besoin particulier, j'ai des cellules dans lesquelles il y a des données du genre "_= 147 + 547*5/3 + 14 + 654*4/3". Ces données proviennent d'une compilation de cellules qui sont mises ensemble avec des &"_=", des &" + ", des &" * " et des &"/". Donc pour Excel ce ne sont pas des formules mais du texte. Ce dont j'ai besoin, c'est d'avoir le calcul visible dans la barre de formule, et d'avoir le résultat dans la cellule.

J'obtiens exactement ce que je souhaite en utilisant la fonctionnalité "rechercher/remplacer", en recherchant "_=" que je remplace par "=", car ainsi Excel considère cette donnée comme une formule qu'il exécute; le calcul reste lisible dans la barre de formule, et le résultat s'affiche dans la cellule.

Mon souci c'est que cela ne fonctionne pas du tout dans une macro :-( et c'est pour cela que je vous envoie ce SOS.

D'avance un grand merci à vous toutes et tous qui vous donnez la peine de m'aider à résoudre ce problème qui m'a déjà causé une nuit d'insomnie.

Au plaisir de vous lire

Superpépé

Bonsoir Superpépé,

A tester pour une colonne

Sub ConvertTextToFormula()
    Dim rng As Range
    Dim cell As Range

    ' Spécifiez la plage de cellules à traiter
    Set rng = ThisWorkbook.Sheets("Feuil1").Range("A1:A10") ' Modifiez la plage selon vos besoins

    ' Parcourez chaque cellule dans la plage
    For Each cell In rng
        If InStr(cell.Value, "_=") > 0 Then ' Vérifiez si la cellule contient "_="
            ' Remplacez "_=" par "=" et activez le calcul automatique
            cell.Value = Replace(cell.Value, "_=", "=")
            cell.Formula = cell.Value
        End If
    Next cell
End Sub

et la feuille complète

Sub ConvertTextToFormulaInSheet()
    Dim ws As Worksheet
    Dim cell As Range
    Dim lastRow As Long
    Dim lastCol As Long

    ' Spécifiez la feuille à traiter
    Set ws = ThisWorkbook.Sheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre feuille

    ' Trouvez la dernière ligne et la dernière colonne avec des données
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' Parcourez chaque cellule dans la feuille
    For Each cell In ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
        If InStr(cell.Value, "_=") > 0 Then ' Vérifiez si la cellule contient "_="
            ' Remplacez "_=" par "=" et activez le calcul automatique
            cell.Value = Replace(cell.Value, "_=", "=")
            cell.Formula = cell.Value
        End If
    Next cell
End Sub

bonjour Superpépé, Stepaustras,

2 manières pour cette formule en texte

Sub Superpépé()

     Cells.Replace "_=", "=", xlPart         'rechercher & remplacer

     s = "_= 147 + 547*5/3 + 14 + 654*4/3"   'votre formule
     MsgBox Evaluate(Replace(s, "_=", ""))   'calculer le résultat directement en VBA

End Sub

Bonjour Stepaustras.

Merci pour la piste, mais malheureusement mon problème n'est pas résolu. Ca coince au niveau du cell.Value = Replace(cell.Value, "_=", "=")

C'est comme avec le "rechercher/remplacer", je peux par exemple remplacer des "Pierre" par des "Paul", des "Jacques=" par des "Jean=", mais Excel n'accepte pas de remplacer des .... par des "=" (un égal tout nu)

Au plaisir de vous lire

Superpépé

Bonjour,
Une proposition avec la fonction Evaluer() , fonction Xl4.
A adapter.
Cdlt.

50superpepe.xlsm (56.53 Ko)

Bonjour à tous !

Une proposition via Power Query ?

Bonjour à toutes et à tous

Merci à BsAlv, à JFL et à Jean-Eric pour vos propositions de solution.

Je n'ai pas vraiment compris comment la fonction Evaluate peut répondre à mon besoin, car je n'ai vraiment aucune marge de manoeuvre sur la contrainte de l'affichage; 1) le résultat dans la cellule, et 2) le calcul dans la barre de formule. Si toutefois vos propositions permettent d'obtenir un tel résultat, merci de m'expliquer un peu plus en détail comment je dois faire (je ne suis pas un as en VBA...)

J'ai testé encore bon nombre de combines, mais je suis toujours au même point.

A ce stade, je baisse les bras et je vais me contenter d'utiliser le "rechercher/remplacer" manuellement, hors macro, pour arriver au résultat escompté. Ce n'est certes pas optimal mais finalement ce n'est pas affreusement contraignant pour moi.

Merci encore à vous tous.

Superpépé

ceci ne suffit pas ?

Sub Superpépé()
     Cells.Replace "_=", "=", xlPart         'rechercher & remplacer
End Sub

Non, pas chez moi...

Vous pouvez voir dans le fichier annexé ce que j'aimerais dans les cellules A1 et C1 par exemple. Le contenu des cellules de A2 à A8 et C2 à C8 me servaient à faire des tas de tests. Le plus diabolique, c'est que parfois j'arrivais à mes fins avec le contenu de la colonne A, mais jamais dans la colonne C. Je n'y comprends vraiment rien du tout.

Hors code VBA, si je clique dans la barre de formule et que j'efface l'espace avant le signe égal et fais ENTER, ça donne ce que je veux. Ou alors je fais le "rechercher/remplacer" en cherchant " =" que je remplace par "="

Mais dans une macro ça ne passe pas

Oh mystère

Cordialement

Bonsoir Superpépé, on dirais que t'as un problème d'espace avant le =

Salut Superpépé,

Vu ton accent, je te soupçonne d'être Suisse Si tes paramètres régionaux utilisent le point comme séparateur décimal, tu dois aussi remplacer les virgules de tes ''textes'' en des points, autrement ton Excel helvétique va continuer de considérer le contenu de tes cellules comme du texte.

A tester, sur la base du code de BsAlv et de stepaustras :

Sub Superpépé()
    Range("A1") = Trim(Range("A1"))
    Range("A1").Replace ",", ".", xlPart
    Range("A1").Replace "_=", "=", xlPart
End Sub

Cordialement.

re, et comme ceci ?

Sub Superpépé()
     Dim c     As Range, FA
     With ActiveSheet.UsedRange
          Set c = .Find(" =", lookat:=xlPart)     'recherchez ce " ="
          If Not c Is Nothing Then
               FA = c.Address                'adresse de la première cellule
               Do                            'boucler
                    c.FormulaLocal = Trim(c.Value)     'effacer l'éspace prefix et utiliser la formule dans la langue locale
                    Set c = .FindNext(c)     'cellule suivante
                    b = Not c Is Nothing
                    If b Then b = c.Address <> FA: c.Select
               Loop While b
          End If
     End With
End Sub

EDIT : Salut Yvouille, même piste

Bonsoir à tous. Bien joué BsAlv,

Bonsoir stepaustras.

Le problème ne réside pas dans l'espace avant le égal. J'ai réussi sans trop me torturer l'esprit à l'effacer avec une formule comme SUBSTITUE par exemple, ou en faisant Droite(cellule; Nbcar(cellule)-1)).

Le problème c'est que le résultat de ces opérations est toujours du texte (qui a l'air d'être une formule). Et je n'arrive pas à transformer ce texte en formule avec du code VBA...

cells(x,y).formula = cells(x,y).value n'a pas d'effet.

J'ai pu voir qu'il existe une combine (convert text to formula) dans les Kutools, mais ces Kutools ne sont pas disponibles sur l'ordi que j'utilise.

Sur le net il y a beaucoup de discussions sur la transformation de texte en formule, mais cela ne m'a pas fait avancer. Il y a sûrement quelque chose qui m'échappe.

Cordialement

Merci beaucoup.

Je vous donnerai des nouvelles demain.

Bonne nuit en attendant :-)

Salut Superpépé,

As-tu vu la dernière réponse de BsAlv et aussi un peu la mienne ?

Chaleureusement.

re, on peut supprimer le "c.select" dans ma code, "select", c'est quelque chose qu'on ne fait pas

Bonsoir à vous toutes et tous.

Whaouw, vous êtes mes sauveurs. Vous m'avez fourni une solution géniale et simple en même temps. Et dire que c'est à cause de points déguisés en virgules que j'ai galéré pendant des heures. MERCI infiniment Yvouille, BsAlv, Stepaustras, et Merci aussi bien sûr à toutes les personnes qui partagent leurs connaissances sur ce site génial.

Au plaisir d'échanger prochainement à nouveau avec vous.

Cordialement

Superpépé

Rechercher des sujets similaires à "utilisation rechercher remplacer macro"