Optimisation de formule

Résolu/Fermé
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 - Modifié par pijaku le 11/07/2014 à 07:39
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 - 11 juil. 2014 à 11:00
Bonjour,

J'ai créé le code ci-dessous qui me permet de vérifier si des mots cibles sont contenus dans une cellule. Sachant que je peux avoir de nombreux "mots cibles" à chercher, je recopie mon code autant de fois qu'il y a de "mots cibles".

Sub recherche_multiple()

Dim derLigne As Long
Dim r As Integer


With Sheets("Feuil1")
    derLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        
    For r = 2 To derLigne
        
        If InStr(1, .cells(r, 6), "CHIEN") = 0 And InStr(1, .cells(r, 6), "CHAT") = 0 And InStr(1, .cells(r, 6), "SERPENT") = 0 Then

              Sheets("Feuil2").cells(r, 1).Value = 0

        Else: Sheets("Feuil2").cells(r, 1).Value = 1

        End If
        
    Next r
     
End With
End Sub

J'aimerais savoir s'il existe une solution pour n'écrire le code qu'une seule fois et que ça recherche l'ensemble des cibles. J'avais trouvé le code ci-dessous sur internet mais cela ne fonctionne pas. Ca ressemble tout de même à ce que j'aimerais faire.

Sub recherche_multiple()

Dim derLigne As Long
Dim r As Integer
Dim Cible As String

Cible = "CHIEN, CHAT, SERPENT"

With Sheets("Feuil1")
    derLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        
    For r = 2 To derLigne
        
        If InStr(1, .cells(r, 6), "Cible") = 0 Then

              Sheets("Feuil2").cells(r, 1).Value = 0

        Else: Sheets("Feuil2").cells(r, 1).Value = 1

        End If
        
    Next r
     
End With
End Sub





Merciiii !
A voir également:

7 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
11 juil. 2014 à 08:08
Option Explicit
Option Base 1
'-------
Sub tester_colF()
Dim Derlig As Long, T_choix(), T_colF(), T_colA()
Dim Idx As Long, Cptr As Byte, Ref As String

T_choix = Array("ZAZA1", "ZAZA2", "ZAZA3")

Application.ScreenUpdating = False
With Sheets(1)
Derlig = .Columns("F").Find("*", , , , , xlPrevious).Row
T_colF = Application.Transpose(.Range("F2:F" & Derlig))
End With
ReDim T_colA(Derlig - 1)
For Idx = 1 To UBound(T_colF)
Ref = UCase(T_colF(Idx))
For Cptr = 1 To UBound(T_choix)
If InStr(1, Ref, T_choix(Cptr)) > 0 Then
T_colA(Idx) = 1
Exit For
Else
T_colA(Idx) = 0
End If
Next Cptr
Next Idx

With Sheets(2)
.Range("A2:A30000").ClearContents 'a adapter svt nbre lignes maxi
.Range("A2").Resize(Derlig - 1) = Application.Transpose(T_colA)
.Activate
End With

End Sub
1
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 9/07/2014 à 11:21
Bonjour

Combien de lignes environ ?
D'où vient la liste des bestioles : existe t'il dans un coin de ton classeur une sélection de chien, chat... combien d'éléments possible

en VBa savoir le nombre de lignes est important pour le choix d'une méthode de codage

dans l'attente
Michel
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 9/07/2014 à 12:34
Comme pas de réponses et peu de temps pour cet aprèm....

Solution avec nbre de lignes important
Option Explicit
Option Base 1
'-------
Sub tester_colF()
Dim Derlig As Long, T_choix(), T_colF(), T_colA()
Dim D_choix As Object, Idx As Long

T_choix = Array("ZAZA1", "ZAZA2", "ZAZA5")

Application.ScreenUpdating = False
With Sheets(1)
Derlig = .Columns("F").Find("*", , , , , xlPrevious).Row
T_colF = Application.Transpose(.Range("F2:F" & Derlig))
End With
ReDim T_colA(Derlig - 1)

Set D_choix = CreateObject("scripting.dictionary")
For Idx = 1 To UBound(T_choix)
D_choix.Add T_choix(Idx), ""
Next

For Idx = 1 To UBound(T_colF)
If D_choix.exists(UCase(T_colF(Idx))) Then
T_colA(Idx) = 1
Else
T_colA(Idx) = 0
End If
Next

With Sheets(2)
.Range("A2:A100000").Clear 'a adapter svt nbre lignes maxi
.Range("A2").Resize(Derlig - 1) = Application.Transpose(T_colA)
.Activate
End With

End Sub


Maquette de W
https://www.cjoint.com/?DGjmHMR3AG5

Michel
0
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 1
10 juil. 2014 à 09:21
Désolé, j'ai du partir tôt hier, je n'avais plus accès à internet.

Je teste ta solution
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 1
10 juil. 2014 à 16:19
Je n'arrive pas à adapter ta formule, le problème c'est que la cellule dans laquelle je cherche le mot cible ne contient pas seulement 1 mot. Elle peut en contenir beaucoup et il faut que je vérifie qu'elle contient le mot que je chercher parmis l'ensemble des caractères de la cellule.

Ta solution ne marche que si la cellule contient uniquement l'un des mots cherchés.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
10 juil. 2014 à 17:28
le problème c'est que la cellule dans laquelle je cherche le mot cible ne contient pas seulement 1 mot

Pourquoi ne l'avoir pas dit au départ ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
11 juil. 2014 à 08:09
Bonjour,

Je rejoins Michel_M (mes amitiés au passage). Pourquoi ne l'avoir pas dit au départ ?
Il est des informations essentielles qui font que le code sera radicalement différent. Celle-ci en fait partie.
Le nombre de lignes (demandé par Michel dans sa première réponse) également.

Extrait de la charte de notre site :
Description du problème

Lorsqu'un utilisateur poste un message concernant son problème, il connaît généralement le contexte de celui-ci. Or les usagers du forum ne peuvent lui venir en aide que s'ils savent de quel logiciel il s'agit, sur quel système d'exploitation, éventuellement le matériel concerné.

Il est donc essentiel de décrire l'erreur de la façon la plus complète possible


Le code, et donc le travail bénévole, fourni par Michel ne peut pas convenir à votre situation. A vous d'en tenir compte en communiquant :
- tous les détails de votre classeur (nom du classeur, noms des feuilles concernées, etc.),
- le nombre de lignes, de colonnes,
- qu'elle est la colonne concernée par la recherche,
- le type de données contenues dans les cellules ou vous cherchez votre "mot" (on ne cherchera pas de la même manière 111 dans "123 456789 111 2569" que chien dans "mon chien est bleu"),
- Pourquoi vouloir indiquer 1 et 0 en colonne A? Si c'est pour repérer les lignes concernées, il est peut être préférable d'en établir la liste, voire de filtrer la feuille en fonction de cela...

Dans l'absolu, et nous ne nous lasserons pas de le répéter, un classeur exemple contenant des données du même type, classées dans les mêmes colonnes, mais avec un nombre de lignes moindre est idéal.
Pour transmettre un fichier, il faut passer par un site de pièce jointe tel que https://www.cjoint.com/

Va sur ce site,
Clic sur parcourir,
Cherche ton fichier,
clic sur ouvrir,
Clic sur "Créer le lien cjoint",
Copier le lien,
Revenir ici le coller dans une réponse...

Voilà, bonne continuation et bonne journée à vous deux.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
11 juil. 2014 à 10:17
Bonjour Franck

Merci

Très bon texte
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
11 juil. 2014 à 10:25
Merci Michel.
J'ai pris le temps, mais je crois que je vais le conserver... Il devrait resservir... régulièrement!

Bonne journée et bon week end à toi.
0
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 1
11 juil. 2014 à 09:48
Je suis vraiment désolé de t'avoir fait perdre du temps, je connais pourtant la charte et suis conscient qu'il est nécessaire d'apporter tous les éléments du problème pour trouver la solution correspondante.
J'étais persuadé d'avoir joint le fichier ci-dessous mais en fait je l'avais joint à un post précédent sur ce forum m'ayant permis de trouver le code tout en haut.

https://www.cjoint.com/?0Gikya94oTk

Pour plus d'explications :


Je recherche ces mots clés (les noms d'animaux dans le fichier joint) dans la colonne F de ma feuille Feuil1 qui contient dans mon vrai fichier des informations sur des clients.
Le principe, c'est que sur ma Feuil2, j'ai différents libellés de colonnes qui correspondent à des types de clients différents. Je sais si un client appartient à un type de client grâce à des mots clés que je recherche dans la colonne F de la Feuil1. Pour chaque client, je teste l'appartenance à chacun des types de clients.


Prenons l'exemple d'un client dont je teste l'appartenance au type de client précisé dans le libellé de la colonne A de la feuille 2 :

Si pour le client situé à la ligne 2 de ma Feuil1, l'un des mots clés (me permettant de dire que le client appartient au type de client correspondant à la colonne A de la feuil2) est trouvé en colonne F de la Feuil1, je veux qu'il me mette un 1 dans la ligne 2 de la colonne A de la Feuil2, sinon un 0. Je veux donc tester cela pour chaque client contenu dans ma Feuil1. Pour le client à la ligne 3, je voudrais un 1 ou un 0 à la ligne 3 de la colonne A de la Feuil2...
Ce nombre de clients (de lignes) peut être très variable (de 100 à plus de 10 000) et change très régulièrement.

Je réaliserai ensuite cette même opération pour le type de client de la colonne B de la feuille 2, auquel correspondront d'autres mots clés.
Je le ferai ensuite pour la colonne C, puis la D... Ce nombre de colonnes sur la feuil2, donc le nombre de types de clients, peut également varier.

Ces 1 et ces 0 me permettent ensuite de faire une série de calculs puis de générer des TCD et des graphes. En réalité, je dois intégrer ce code dans ma macro complète qui réalise toute une série d'opérations en 1 click.

Merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
11 juil. 2014 à 09:50
Bonjour,

La réponse matinale de Michel (ICI) réponds, normalement, complètement à tes attentes.
A tester.
0
pzyko Messages postés 34 Date d'inscription vendredi 27 juin 2014 Statut Membre Dernière intervention 8 août 2014 1
11 juil. 2014 à 11:00
Ce code marche parfaitement, merci beaucoup !
0