Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 VBA supprimer toutes les parenthèses sauf les 2 dernieres

raf26

XLDnaute Occasionnel
Bonjour,

J'aurais besoin de votre aide pour une macro

Je reçois des lignes de livraisons, avec aléatoirement des mots entre parenthèses et toujours la variété en dernier entre parenthèses.

Ces lignes sont collés par macro dans un tableau et ensuite une formule m'extrait la variété entre parenthèses.

Seulement si d'autres parenthèses sont présentes avant celles de la variété ma formule échoue.

Je chercher donc à intégré à ma macro de collage la "formule" qui me supprime toutes les parenthèses sauf les 2 dernières.

J'ai bien essayé avec l'enregistreur de macro et la fonction remplacer mais cela ne me permets pas de sélectionner certaines parenthèses.

Exemple
ligne reçue POMME (Espagne) CAL 3 (golden)
ligne collée après traitement macro POMME Espagne CAL 3 (golden)

J'espère avoir été assez claire dans ma demande.

Je vous joins un fichier exemple.

Merci d'avance

Cordialement
 

Pièces jointes

  • Classeur1.xlsx
    10.1 KB · Affichages: 15

Dranreb

XLDnaute Barbatruc
D'où l’intérêt de spécifier ByVal devant les paramètres objets qui ne sont pas redéfinis par la procédure invoquée et ceux d'autres types qui ne sont pas modifiés par elle.
 

raf26

XLDnaute Occasionnel
Bon du coup, en attendant d'être moins perdue, j'utilise la solution de Stapple1600

J'ai modifié mes formules d'extraction, j'aurais préféré par vba, mais je n'ai pas votre niveau

Merci à tous et bon week-end

 

Staple1600

XLDnaute Barbatruc
Bonjour @fanch55

pourquoi demander d'intégrer une solution dans une macro si c'est pour retenir des formules de cellule ???

[aparté post café et macarons]
Parce que souvent le demandeur ne choisit pas toujours la voie la plus évidente ou la plus simple pour travailler avec Excel
(cf le non emploi des TCD, des filtres , de Données/Convertir, de PQ , etc...)
Il est alors permis aux répondeurs d'évoquer un chemin plus simple (surtout si le demandeur ne maitrise pas encore Excel.

[/aparté post café et macarons]
 

raf26

XLDnaute Occasionnel
Au delà de tout ça, la question est :
pourquoi demander d'intégrer une solution dans une macro si c'est pour retenir des formules de cellule ???
Bonjour au fil,

Ma demande initiale portait effectivement sur une macro, puisque mon collage (qui peut comporter des parenthèses) se fait via macro, cela me semblait logique d'associer les 2 et ainsi obtenir des données immédiatement exploitables.

Toutefois vu mes difficultés à adapter vos différentes solutions à ma macro originelle, et dans l'urgence, je me suis rabattue sur la solution "formule" car comme le suggère Stapple1600 :
Il est alors permis aux répondeurs d'évoquer un chemin plus simple (surtout si le demandeur ne maitrise pas encore Excel.

Je ne maîtrise pas assez VBA, je ne fais que copier vos lignes, même si avec le temps j'arrive à comprendre quelques subtilités.

J'aurais un peu plus de temps les prochaines semaines, pour affiner mon fichier et essayer d'intégrer vos solutions et ainsi travailler avec ma demande initiale.

Bon week-end à tous et très certainement à bientôt
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Si des formulistes affiliés à la Guilde du 14ième Carré Centré
=1+2*14*(14-1)
passent dans le fil, je sollicite un petit coup de main de leur part
En A1, j'ai : POMME (Espagne) CAL 3 (golden)
Ceci fonctionne en B1
=SUBSTITUE(SUBSTITUE(TEXTE.AVANT(A1;mot(A1);1);")";"");"(";"")&mot(A1)
avec mot
=LAMBDA(a;PRENDRE(FRACTIONNER.TEXTE(a;" ";;VRAI);;-1))

Pourquoi ceci me renvoie "Cette fonction est incorrecte" ?
Formule nommée dans le gestionnaire : extraction
=LAMBDA(a;SUBSTITUE(SUBSTITUE(TEXTE.AVANT(a;mot(a);1);")";"");"(";"")&mot(a))

si je fais en B1 =extraction(A1)
 

laurent950

XLDnaute Barbatruc
Bonjour

Si je souhaite appliquer votre macro à ma plage qui est collée
Ex de : B14 à B180, quelles références je dois spécifier ?
Modifier
Set Rgn = Range(Cells(14, 2), Cells(180, 2)) ' .................................. La plage en question
Ou
Set Rgn = Range("B14:B180") ' .................................. La plage en question

VB:
Private Sub Parth(ByVal Z As Range)
   Dim Trg As Variant, Ttab As Variant, Phrase As String, Parth As String, i As Integer ' Les Variable
   Trg = Z.Value ' ................................................................ Transfert la plage Range dans Variables tableau
   For i = LBound(Trg, 1) To UBound(Trg, 1) ' ..................................... Boucle pour toutes les Phrases de la plage
        Ttab = Split(Trg(i, 1), "(") ' ............................................ La Phrase découpé en Tableau
        Parth = "(" & Ttab(UBound(Ttab)) ' ........................................ Ajoute ( a Parth
        ReDim Preserve Ttab(UBound(Ttab) - 1) ' ................................... Supprime Parth
        Phrase = Join(Ttab, " ") ' ................................................ Phrase
        Z(1)(i, 1).Value2 = Replace(Replace(Phrase, ")", " "), "  ", " ") & Parth ' Phrase & Parth / Position de la phase avec Range : Z(1)(i, 1).Value2
        Erase Ttab: Parth = Empty: Phrase = Empty   ' ............................. Efface le contenu des variables
    Next i ' ...................................................................... Fin de la boucle
   End Sub
Sub MiseEnForme()
Dim Rgn As Range ' Plage
    Set Rgn = Range(Cells(8, 5), Cells(13, 5)) ' .................................. La plage en question
    Parth Rgn ' ................................................................... Vers la procédure privé Parth
End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonsoir à tous
perso j'aime bien celle de sylvanu
VB:
Function keepLastparenthese(x As String)
deb = Mid(x, 1, InStrRev(x, "(") - 1)
keepLastparenthese = Replace(x, deb, Replace(Replace(deb, "(", ""), ")", ""))
End Function

formule
=keepLastparenthese(E8)
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…