Copie de données sous condition

  • Initiateur de la discussion Initiateur de la discussion Boo75
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

B

Boo75

Guest
Bonjour à tous,

Je souhaiterais créer une macro VBA me permettant de ne copier que les chiffres dans une colonne. Je m'explique, dans la colonne A par exemple, il y aura à la fois du texte et des chiffres, je voudrais copier uniquement ces derniers dans un nouvel onglet pour une extraction.
Etant un débutant en la matière, je me permet de demander votre aide.

Merci d'avance.

Cordialement,
 
Re : Copie de données sous condition

Bonjour,

Effectivement avec le fichier que je t'ai donné, ton code fonctionne parfaitement. Je ne t'ai fourni qu'une partie du document, voila le doc presque complet (j'ai retiré quelques lignes car il est trop gros sinon) avec ma macro (attention aux yeux...). Je te transmet la version complète, si vois où se situe le problème ça serait super. Je t'avouerais que je ne saisi pas encore très bien le RegEx avec mes notions de VBA.

Cordialement,
 

Pièces jointes

Re : Copie de données sous condition

Re,

Je viens de regarder.

Le code que je t'ai donné marche.

Par contre, tu as rajouté
Code:
WS_F2.Cells(ligne_Vide_WSF2, 1).Value = WS_F1.Cells(pcs_WSF1, 1).Value
WS_F2.Cells(ligne_Vide_WSF2, 2).Value = WS_F1.Cells(pcs_WSF1, 2).Value
WS_F2.Cells(ligne_Vide_WSF2, 3).Value = WS_F1.Cells(pcs_WSF1, 3).Value
WS_F2.Cells(ligne_Vide_WSF2, 4).Value = WS_F1.Cells(pcs_WSF1, 4).Value
WS_F2.Cells(ligne_Vide_WSF2, 5).Value = WS_F1.Cells(pcs_WSF1, 5).Value
WS_F2.Cells(ligne_Vide_WSF2, 6).Value = WS_F1.Cells(pcs_WSF1, 6).Value
WS_F2.Cells(ligne_Vide_WSF2, 7).Value = WS_F1.Cells(pcs_WSF1, 7).Value
WS_F2.Cells(ligne_Vide_WSF2, 8).Value = WS_F1.Cells(pcs_WSF1, 8).Value
WS_F2.Cells(ligne_Vide_WSF2, 9).Value = WS_F1.Cells(pcs_WSF1, 9).Value
WS_F2.Cells(ligne_Vide_WSF2, 10).Value = WS_F1.Cells(pcs_WSF1, 10).Value
WS_F2.Cells(ligne_Vide_WSF2, 11).Value = WS_F1.Cells(pcs_WSF1, 11).Value
WS_F2.Cells(ligne_Vide_WSF2, 12).Value = WS_F1.Cells(pcs_WSF1, 12).Value
WS_F2.Cells(ligne_Vide_WSF2, 13).Value = WS_F1.Cells(pcs_WSF1, 13).Value
WS_F2.Cells(ligne_Vide_WSF2, 14).Value = WS_F1.Cells(pcs_WSF1, 14).Value
WS_F2.Cells(ligne_Vide_WSF2, 15).Value = WS_F1.Cells(pcs_WSF1, 15).Value
WS_F2.Cells(ligne_Vide_WSF2, 16).Value = WS_F1.Cells(pcs_WSF1, 16).Value
WS_F2.Cells(ligne_Vide_WSF2, 17).Value = WS_F1.Cells(pcs_WSF1, 17).Value
WS_F2.Cells(ligne_Vide_WSF2, 18).Value = WS_F1.Cells(pcs_WSF1, 18).Value
Après l'utilisation des RegExp.

Du coup, tu annules le travail des RegExp en remettant les valeurs de cellules brut, donc ça annule quasi à chaque fois les instructions précédentes qui:
- Teste la condition
- Manipule la chaine textuelle pour récupérer les valeurs numériques
- Liste la valeur numérique trouvée dans le tableau

Cherche de ce côté là pour peaufiner, ça devrait aller mieux.

Pour répondre à ton interrogation sur les RegExp, ce sont des méthodes de manipulation de chaines textuelles extrêmement poussées puisqu'elles permettent de manipuler du texte selon des masques.

Pour une adresse IP, par exemple, c'est ce qui permet de lister des adresses comme 192.168.0.1 et 201.224.13.100 comme étant sous le même masque textuel.

Ca permet de récupérer des chaines à l'intérieur de chaines plus grandes, qui répondent à un critère de recherche.

Basiquement, la méthode "Rechercher" (ctrl + F) utilise le même principe, mais la plupart des gens ne font que des recherches de mots.
Quand tu utilises les RegEx, tu peux étendre tes recherches sur d'autres moyens.
 
Re : Copie de données sous condition

Effectivement, sans ces lignes de code, la macro fonctionne. En revanche il existe dans la colonne A des données telles que "25158956-F", avec cette macro les lettres après le tiret disparaissent ce qui est dommageable, est il possible de conserver ces lettres (c'est juste dans la colonne A). Je sais que je t'en demande beaucoup, dis le moi si je te harcèle trop !

Merci beaucoup !!
 
Re : Copie de données sous condition

Re,

Je vais pas te reposter un fichier dans l'immédiat (cause de boulot à faire).

Localise la ligne qui détermine le pattern pour la RegExp. La variable s'appelle "str_Pattern" et est affectée de la manière suivante:
Code:
str_Pattern = "[0-9]+"

C'est le masque utilisé pour les RegExp.

Vois un peu comment ça marche, essaye de reproduire, et vois ce que ça donne.

Je t'aiderai plus avant si tu n'y arrives pas, mais voilà la procédure à suivre:
- Créer une nouvelle variable de Pattern pour la colonne A spécifique
- Créer le masquer qui va bien et l'affecter à la nouvelle variable.
- Juste avant de tester la RegExp sur la colonne A, tu précises le pattern spécifique
- Juste après la colonne A, tu remets le pattern générique pour les autres colonnes

Le masque à renseigner devrait être le suivant (je suis pas un spécialiste, je découvre juste):
Code:
str_Pattern_Col_A = "([0-9]+|[0-9]+-([a-z]|[A-Z]))"
Ca se traduit par:
- [0-9]+ ==> une suite de nombre de 0 à 9
- | ==> élément qui permet d'indiquer un "choix"
- [a-z] ==> une lettre minuscule comprises entre a et z
- [A-Z] ==> une lettre majuscule comprises entre A et Z

La traduction littérale est la suivante: une suite de chiffre OU une suite de chiffre avec un tiret et une lettre (minuscule OU majuscule)
 
Dernière édition:
Re : Copie de données sous condition

Grâce à tes pistes j'ai réussi à trouver pour les lettres ça donne :

Code:
str_Pattern = "([0-9]+|[0-9\-]+([A-M]))

J'ai borduré A-M car il y a des lignes intermédiaires contenants des "-Off" par exemple.

Mais il s'avère finalement qu'il y a également des données sous ce format "20027487-0" j'ai donc essayé de rajouter des chiffres derrière le "-" :

Code:
str_Pattern = "([0-9]+|[0-9\-]+([A-M])+|(0-9))

mais cela ne fonctionne pas. Ce document me rend fou..
 
Re : Copie de données sous condition

Ah, j'avais pas pensé que le - était un caractère réservé. Du coup, tu as raison de l'échapper.

Par contre, c'est une erreur de l'inclure dans les crochets.

Du coup, le Pattern donnerait plus ceci:
Code:
    str_Pattern_Col_A = "([0-9]+|[0-9]+\-([a-z]|[A-Z]))"

Pour informations, le "+" indique une suite de caractères (ici, numériques).
Inversement, son absence indique une seule occurence.

Ainsi, [0-9]+ indique bien une suite de chiffres, alors que [a-z] implique une seule lettre.

Pour le coup, en revanche, je me pose la question pour ton "-Off" ... Je crois qu'il va garder le "-O" et virer "ff", pas sûr que ça t'arrange :/
 
Re : Copie de données sous condition

Par contre le "Col_A" ne fonctionne pas, ça ne m'extrait aucune donnée à l'inverse du simple"'str_pattern". Il n'y a pas un autre moyen ? Quitte à rajouter une ligne comme les tiret ne concernent que la colonne A, est il possible d'avoir deux pattern ?

Exemple :

Code:
str_Pattern_Col_A = "([0-9]+|[0-9\-]+([A-M]))
str_Pattern = "[0-9]+"


Mon autre problème concerne les formats "20027487-0" (avec un chiffre après le tiret) en plus des "20027487-A". Comment ajouter cette condition à la colonne A ?
 
Re : Copie de données sous condition

Re,

Oui, deux pattern, c'est ce que je t'avais précisé:
Je t'aiderai plus avant si tu n'y arrives pas, mais voilà la procédure à suivre:
- Créer une nouvelle variable de Pattern pour la colonne A spécifique
- Créer le masquer qui va bien et l'affecter à la nouvelle variable.
- Juste avant de tester la RegExp sur la colonne A, tu précises le pattern spécifique
- Juste après la colonne A, tu remets le pattern générique pour les autres colonnes



Code:
    str_Pattern_Col_A = "([0-9]+|[0-9]+\-([a-m]|[A-M]|[0-9]))
    str_Pattern = "[0-9]+"
 
Re : Copie de données sous condition

J'avais déjà essayé et le pattern général remplace celui de la colonne A. J'ai tenté avec un code comme ça :

Code:
    str_Pattern_Col_A = "([0-9]+|[0-9]+\-([a-m]|[A-M]|[0-9]))
    str_Pattern_Col_B = "[0-9]+"
    str_Pattern_Col_C = "[0-9]+"
    Etc...

Mais ça ne fonctionne pas.
 
Re : Copie de données sous condition

Le bon code pour la colonne A est :

Code:
str_Pattern = "([0-9]+|[0-9\-]+([A-M]|[0-9]))"

Il faudrait juste extraire la condition des tirets aux autres colonnes et ça sera terminé !
 
Re : Copie de données sous condition

Re,

Ok, pigé.

Les deux masques sont bons.
Code:
    str_Pattern_Col_A = "([0-9]+|[0-9]+\-([a-m]|[A-M]|[0-9]))
    str_Pattern = "[0-9]+"

En revanche, tu dois aussi avoir une ligne (avant la boucle sûrement) qui s'écrit comme ça:
Code:
    reg_Numero.Pattern = str_Pattern

Il faut l'enlever, et ensuite, juste avant le If de la colonne A, tu mets:
Code:
    reg_Numero.Pattern = str_Pattern_Col_A
Et juste après le End If correspondant, tu mets
Code:
    reg_Numero.Pattern = str_Pattern
 
Re : Copie de données sous condition

Re,

Parce qu'ils le sont en fait. Quand on réfléchit en terme de chaines textuelles, la soustraction est bel et bien un tiret.

Code:
    str_Pattern_Col_A = "(\-){0,1}([0-9]+|[0-9]+\-([a-m]|[A-M]|[0-9]))
    str_Pattern = "(\-){0,1}[0-9]+"
Ca devrait le faire là.

Tu me fais un retour ?
 
Re : Copie de données sous condition

J'ai appliqué le code modifié et tout fonctionne parfaitement, merci beaucoup !
Rare sont les personnes avec une telle patience, encore merci pour tes explications.

Bonne continuation et bon week end.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
2
Affichages
283
Réponses
3
Affichages
326
Retour