Find en vba et macro

Résolu
Signaler
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous

je cherche à faire écrire une macro qui je le pensais allait être simple mais je bloque totalement. Je débute en VBA
Je veux faire une fonction qui recherche 5 suite de caractères différentes et suivant la suite de caractère trouvé, je veux écrire dans une colonne face à la cellule un code différent suite la suite trouvée.....
Il me semble qu'il faut utiliser la méthode find, avec For each mais je n'arrive pas à aller plus loin que ça..
Est que quelqu'un peut me guider dans la recherche de l'écriture de cette fonction
J'aurais besoin de trouver des coours, des info sur la recherhce de chaine de caractères
je peux trouver ça ou ?

19 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bon ...
N'oublie alors pas de cliquer sur le tag "réponse acceptée". (Cela est de nature à permettre aux autres forumeurs face au même problème de s'y retrouver)

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,
1) tu as posté dans un thème (VB.Net) ne correspondant pas à ton outil (VBA/Excel) de développement...
Prends s'il te plait dorénavant le plus grand soin au choix du thème adéquat, c'est très important !
2)
Je veux faire une fonction qui recherche 5 suite de caractères différentes et suivant la suite de caractère trouvé, je veux écrire dans une colonne face à la cellule un code différent suite la suite trouvée.....

Cela manque cruellement de précision ...
a) Ce que tu recherches doit-il être le seul contenu d'une cellule ou peut-il simplement être contenu, parmi d'autres chaines, dans une cellule ? (ce n'est pas pareil)
b) que veux dire exactement ce que j'ai mis en rouge dans la citation ?K Je ne comprends personnellement pas ...? C'est quoi, ce "code" ?

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

Désolé pour le post dans la mauvaise rubrique, je ne sais pas ce que j'ai fichu
C'est pas très claire mon histoire. J'ai voulu scinder mon problème en 2 morceaux avec cette histoire de code mais je ne sais pas si c'est une bonne idée.
Je vais essayer d'expliquer mieux, ça devrait maider à concevoir mon programme.
Je cherche donc à identifier les lignes de mon tableau en fonction de 5 chaines de caractères différentes qui doivent se trouver dans le contenu des cellules de la 1ere colonne de mon tableau. Ces chaines de caractères ne sont donc pas le contenu m^me de mes cellules mais une partie du contenu.
Je comptais donc faire une recherche des ces chaines de caractères et en fonction de ce que je trouve sur chaque ligne, je pensais indique dans une colonne un code me signifiant dans quelle feuille excel je devrais ensuite coller ma ligne. Cas 1, je demande à excel d'crire "onglet1" dans la dernière colonne, cas, 2 onglet 2, etc jusqu'à 5. Ensuite, je tris et fais mes copies à la main en attendant d'appréhender mieux VBA... ce n'est peut être pas la bonne méthode mais je pensais réussir à faire cette recherche de caractère plus facilement...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
d'accord, mùais :
dans quel "cas" écris-tu "onglet1", dans quel "cas" "onglet 2" etc...
Compte tenu de ce que tu cherches non pas UNE chaîne, mais 5 chaînes différentes possibles, je ne crois pas que la bonne méthode soit d'utiliser Find, mais plutôt de faire une boucle sur toutes tes cellules de la colonne A.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Et quid si dans une même cellule, sont présentes plus d'une des 5 chaînes cherchées ? A moins que tu ne confirmes que ce cas ne peut arriver !

Faut penser à tout
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

je confirme que ca ne peut pas arriver. en fait j'ai des désignation de produits, aucune n'est ecrite de la même manière, mais ce qui distingue ces produits, c'est la taille : 19 20 22 36 40 et 42 pouces. je souhaite repartir ces produits dans mes feuilles suivant leurs tailles

c'est vrai qu'une boucle me semble plus adaptée
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
19 20 22 36 40 et 42 pouces ===>> ça fait 6 et non 5 !
Je veux bien te préparer (demain après le charcutage de mon dentiste) quelque chose, mais un renseignement de plus :
ces valeurs sont-elles au moins "isolables" (séparées par un espace, par exemple ?)
Ne réponds pas trop vite (je n'interviendrai pas avant demain) . Prends ton temps ... (cela nous en fera gagner beaucoup).


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

effectivement, je n'ai pas de 20 pouces !!!
non elles ne sont pas isolables. il y a souvent " (pouce) après mais parfois, il y a un espace et "pouces".. Traiter ce texte pour le rendre plus homogène n'est pas une option car il vient d'une extraction qui est refaite toute les semaines.
Désolée pour le flou artistique des mes explications.. et merci pour l'aide
bon courage pour le dentiste, le mien doit me charcuter très prochainemnt alors je compati !!!
=> pour la dent cassée !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Ca ne répondra pas à ta question précise, mais sache qu'il y a un moyen plus simple de présenter ses données :
Si tu as besoin de SAISIR une taille d'écran comme 19 ou 20, et que, pour la présentation, tu doives afficher "19 pouces" ou "20 pouces", il n'est pas nécessaire d'ECRIRE le texte "pouce" derrière le chiffre : Excel peut le faire seul, par un formattage de la cellule :
Menu "Format", "Cellule", onglet "Nombre", Catégorie "Personalisée" et dans la zone "Type" de saisie, entre ceci 0 " pouces"
Plus de détails dans l'aide Excel en cherchant "format nombre personnalisé"

En symbolique internationale, le mot pouce s'abrège par un "


En adoptant ce formattage, cela te permet de n'avoir qu'un chiffre dans la cellule --> plus facile à manipuler

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Erratum : le type est 0_ " pouces"
(manquait le _ )
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,
Je ne peux plus parler, mais peux encore écrire
JH'despère que je vais me montrer aussi précis que le dentiste qui ne m'a pas épargné, ce matin ...

1) fais d'abord une copie de ton classeur (juste pour le cas où)
2) code à lancer ;
Private Sub CommandButton1_Click()
  Dim i As Integer, j As Integer, macol As Integer, quoi As String
  Dim mesrefs, mesfeuilles, mesou, tablo
  mesrefs = Array(" 19 ", " 22 ", " 36 ", " 40 ", " 42 ") '<<=== ici tes références à répartir
  mesfeuilles = Array("Feuil7", "Feuil8", "Feuil9", "Feuil10", "Feuil11") '<<<=== ici tes feuilles d'accueil
  mesou = Array(1, 1, 1, 1, 1)
  With Sheets(6) ' <<<<====== ici ta feuille actuelle des données à répartir
    macol = .UsedRange.Columns.Count + 1
   tablo = .Range("A1:A" & .UsedRange.Rows.Count).Value
   For i = 1 To UBound(tablo)
     quoi = " " & Replace(tablo(i, 1), """", " ") & " "
     For j = 0 To UBound(mesrefs)
       If InStr(quoi, mesrefs(j)) Then
          .Range("A" & i).EntireRow.Copy Destination:=Sheets(mesfeuilles(j)).Range("A" & mesou(j))
          mesou(j) = mesou(j) + 1
          .Cells(i, macol).Value = mesfeuilles(j)
          Exit For
       End If
     Next
   Next
  End With
End Sub

Il devrait out faire d'un seul coup (inscrire dans ta dernière colonne et remplir les feuilles de répartition)
Attention ; dans l'array mesrefs, ce n'est pas par hasard que j'ai mis un espace devant chaque "référence"
Lance et dis-nous ...



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Attention également : les feuilles d'accueil doivent avoir été "chargées" (apparaître dans le bandeau des onglets ouverts
Si tu as de nombreuses lignes : le traitement va être assez long en durée.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

Merci merci merci !!!!
Quand je lis ton code, je me dis que je suis vraiment a des km année lumière de pouvoir écrire un tel code !
je pense que j'ai bien fait comme tu le demandes mais ca plante sur la ligne 13 => incompatibilité de type. J'ai créé 11 feuilles, saisi des données en colonne A avec les tailles recherché : je n'ai pas le classeur original je n'ai pas le droit de le sortir du boulot, je pourrais prendre le gauche mais je ne m'y risque pas !! bref, j'ai rempli 4 colonnes arbitrairement

tu sais que tu ne me rassure pas avec ton dentiste !!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Je n'ai pas besoin de ton classeur !
Montre tout simplement :
- tes onze feuilles créées (énumère les par leurs noms)
- le code que tu as écrit
- la ligne où il y a erreur
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Je viens de faire ubn test et pense que j'ai deviné ce qui se passe avec ton tableau !
L'une des lignes en colonne "vérifiée" contient une valeur en erreur quelconque !

Vérifie tes données en colonnes A et tu vas voir
Qu'à cela ne tienne ===>> on va ignorer la ou les ligne(s) qui pourraient être en erreur :

Private Sub CommandButton1_Click()
 Dim i As Integer, j As Integer, macol As Integer, quoi As String
  Dim mesrefs, mesfeuilles, mesou, tablo
  mesrefs = Array(" 19 ", " 22 ", " 36 ", " 40 ", " 42 ") '<<=== ici tes références à répartir
  mesfeuilles = Array("Feuil7", "Feuil8", "Feuil9", "Feuil10", "Feuil11") '<<<=== ici tes feuilles d'accueil
  mesou = Array(1, 1, 1, 1, 1)
  With Sheets(6) ' <<<<====== ici ta feuille actuelle des données à répartir
    macol = .UsedRange.Columns.Count + 1
   tablo = .Range("A1:A" & .UsedRange.Rows.Count).Value
   For i = 1 To UBound(tablo)
     If Not IsError(tablo(i, 1)) Then ' <<<<============ ne pas traiter si valeur en erreur
       quoi = " " & Replace(tablo(i, 1), """", " ") & " "
       For j = 0 To UBound(mesrefs)
         If InStr(quoi, mesrefs(j)) Then
            .Range("A" & i).EntireRow.Copy Destination:=Sheets(mesfeuilles(j)).Range("A" & mesou(j))
            mesou(j) = mesou(j) + 1
            .Cells(i, macol).Value = mesfeuilles(j)
            Exit For
         End If
       Next
     End If
   Next
  End With
End Su


Chez moi : ===>> Impec !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

ok, mes feuilles :
Feuil1 Feuil2 Feuil3 Feuil4 Feuil5 Feuil6
Feuil7 Feuil8 Feuil9 Feuil10 Feuil11

L'erreur : ligne 13 cad
For i = 1 To UBound(tablo)
(incompatibilité de type)


le code :
Private Sub Bouton2_QuandClic()
Dim i As Integer, j As Integer, macol As Integer, quoi As String
Dim mesrefs, mesfeuilles, mesou, tablo
mesrefs = Array(" 19 ", " 22 ", " 36 ", " 40 ", " 42 ") '<<=== ici tes références à répartir
mesfeuilles = Array("Feuil7", "Feuil8", "Feuil9", "Feuil10", "Feuil11") '<<<=== ici tes feuilles d'accueil
mesou = Array(1, 1, 1, 1, 1)
With Sheets(6) ' <<<<====== ici ta feuille actuelle des données à répartir
macol = .UsedRange.Columns.Count + 1
tablo = .Range("A1:A" & .UsedRange.Rows.Count).Value
For i = 1 To UBound(tablo)
quoi = " " & Replace(tablo(i, 1), """", " ") & " "

For j = 0 To UBound(mesrefs)
If InStr(quoi, mesrefs(j)) Then
.Range("A" & i).EntireRow.Copy Destination:=Sheets(mesfeuilles(j)).Range("A" & mesou(j))
mesou(j) = mesou(j) + 1
.Cells(i, macol).Value = mesfeuilles(j)
Exit For
End If
Next
Next
End With
End Sub
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Etonnante et bizarre, cette erreur sur cette ligne ! (pas chez moi !)
on va y voir clair :
ajoute donc :
MsgBox .Range("A1:A" & .UsedRange.Rows.Count).Address

juste avant
  For i = 1 To UBound(tablo)

lance et dis-moi le message qui s'affiche ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Vu !
Dis-moi, c'est bien sur ta feuille 6 que sont tes données à répartir ?
Pour mémoire :
With Sheets(6) ' <<<<======   ici ta feuille actuelle des données à répartir  

Si tes données sont dans ta première feuille, tu fois mettre 1 à la place de 6 !
(sinon, en effet, tablo est vide !)

Si tes données à ré^partir sont dans la feuille "Feuil1", tu peux écrire ainsi :
With sheets("Feuil1") également ...

Et pourquoi as-tu recopié cette ligne, telle qu'elle était ?
mesfeuilles  = Array("Feuil7", "Feuil8", "Feuil9", "Feuil10", "Feuil11") '<<<=== ici tes feuilles d'accueil 

à la place de "Feuil7", etc...., ce sont les noms de tes feuilles à toi (celles où tu veux envoyer tes répartitions, qu'il faut écrire)
exemple, si tu as tes données dans "Feuil1" et que tu veux les distribuer sur les feuilles "Feuil2" ... à "Feuil6"
.....
mesrefs = Array(" 19 ", " 22 ", " 36 ", " 40 ", " 42 ") '<<=== ici tes références à répartir
mesfeuilles = Array("Feuil2", "Feuil3", "Feuil4", "Feuil5", "Feuil6") '<<<===   ici tes feuilles d'accueil 
mesou  = Array(1, 1, 1, 1, 1)
With Sheets("Feuil1") ' <<<<====== ici ta feuille actuelle des données à répartir 
.....


JU'avais mis des commentaires en regard pour cela même


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
11
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
9 juillet 2010

c'etait bien ca !! Quelle andouille
et ca marche ! génial merci bcp !!
j'ai de quoi apprendre
merci encore