Faire une boucle de recherche double discriminante / VBA.

Résolu/Fermé
Knowhere Messages postés 3 Date d'inscription jeudi 27 novembre 2014 Statut Membre Dernière intervention 28 novembre 2014 - Modifié par jordane45 le 27/11/2014 à 15:01
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 - 1 déc. 2014 à 16:43
Bien le bonjour !

Je dois créer un fichier de saisit et d'enregistrement. Les fichiers de saisis vont aller s'enregistrer dans le fichier d'enregistrement.
Par contre l'un des fichier de saisis a besoin d'un rappel de ce qui a été précédemment enregistré.

Pour se faire, il faut que je fasse une recherche dans la colonne B de "Sauvegardes Enregistrements_Course Raideurs Décapages", pour trouver le tableau du bon numéro de lancement et de la bonne fraction du lot.
Cela me fait donc deux recherches, qui tournent jusqu'à faire correspondre les deux recherches ensemble.

Là où je coince, c'est que le programme se mort là queue : première recherche Ok, deuxième fausse, donc on recommence... ainsi de suite.
Je ne trouve pas le petit bout de code pour lui dire d'aller plus loin dans ses recherches.

J'espère avoir été compréhensible, et je vous remercie grandement d'avance.
Ci-joint, le code certainement hasardeux.

Private Sub CommandButton2_Click()

'recherche n° lancement:
Workbooks.Open Filename:="P:\Technique\METHODES\6.DECAPAGE\Saisies et sauvegardes décap' courses raid\Sauvegardes Enregistrements_Course Raideurs Décapages.xlsm"
    
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve2 As Range, PlageDeRecherche2 As Range
Dim Valeur_Cherchee2 As String, AdresseTrouvee2 As String

    'Set Trouve = .FindNext(Trouve)
    'Selection.Next(Unit:=wdLine, Count:=1).Select
    
     Do
     Set Trouve.Address = Trouve.Address + 1
     Valeur_Cherchee = Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("E3").Value
        Set PlageDeRecherche = ActiveSheet.Range("B9:B100")
        Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
            If Trouve Is Nothing Then
                AdresseTrouvee1 = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
            Else
                AdresseTrouvee1 = Trouve.Address
                Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("T1") = AdresseTrouvee1
            End If

'recherche fraction du lot:
        Valeur_Cherchee2 = Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("I3").Value
        Set PlageDeRecherche2 = ActiveSheet.Trouve.Address.Offset(rowOffset:=1, columnOffset:=0)
        Set Trouve2 = PlageDeRecherche2.Cells.Find(what:=Valeur_Cherchee2, LookAt:=xlWhole)
            If Trouve2 Is Nothing Then
                AdresseTrouvee2 = Valeur_Cherchee2 & " n'est pas présent dans " & PlageDeRecherche.Address
            Else
                AdresseTrouvee2 = Trouve2.Address
                Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("T2") = AdresseTrouvee2
            End If
    'If Trouve <> Trouve2.Offset(rowOffset:=-1, columnOffset:=0).Address Is Nothing Then
        
    Loop While Trouve <> Trouve2.Offset(rowOffset:=-1, columnOffset:=0).Address
    'End If
'On chope le tableau de contrôle et la valeur moyenne
Dim Trouve3 As Range, PlageDeRecherche3 As Range
Dim Valeur_Cherchee3 As String, AdresseTrouvee3 As String
        Valeur_Cherchee3 = "Moyenne"
        Set PlageDeRecherche3 = ActiveSheet.Range("C10:C100")
        Set Trouve3 = PlageDeRecherche3.Cells.Find(what:=Valeur_Cherchee3, LookAt:=xlWhole)
            If Trouve3 Is Nothing Then
                AdresseTrouvee3 = Valeur_Cherchee3 & " n'est pas présent dans " & PlageDeRecherche.Address
            Else
                AdresseTrouvee3 = Trouve3.Address
                Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("T3") = AdresseTrouvee3
            End If


'Condition de vérification et affichage valeur de la moyenne
On Error GoTo xxx

If Trouve.Address = Trouve2.Offset(rowOffset:=-1, columnOffset:=0).Address Then

GoTo Fin
xxx:
    Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Activate
    MsgBox "Recherche non aboutie", vbOKOnly + vbExclamation, "Attention"
Fin:
    Workbooks("Sauvegardes Enregistrements_Course Raideurs Décapages").Close savechanges:=False
Exit Sub

    Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("D12").Value = Trouve2.Offset(rowOffset:=0, columnOffset:=1).Value
Else
    Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Activate
    MsgBox "Recherche non aboutie"
End If

Workbooks("Sauvegardes Enregistrements_Course Raideurs Décapages").Close savechanges:=False

End Sub
A voir également:

16 réponses

Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
27 nov. 2014 à 21:51
Bonjour,
Avant de poursuivre, avez-vous réalisé un pas à pas sur votre procédure pour voir si la boucle s'incrémente ou pas et aussi le contrôle des valeurs obtenues qui permettent la suite et ou fin de boucle ?

0
Knowhere Messages postés 3 Date d'inscription jeudi 27 novembre 2014 Statut Membre Dernière intervention 28 novembre 2014
28 nov. 2014 à 10:28
Oui, en pas à pas la procédure fonctionne, c'est juste qu'il n'y a aucune fin. ce qu'il manque dans mon cas, c'est le code pour ignorer ce que m'a donné la première boucle de recherche (une sorte de +1 que je n'arrive pas à mettre en place)...
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
28 nov. 2014 à 11:27
Bonjour ..........!!!!!,
Pouvez-vous rappeler la condition qui doit mettre fin à la recherche dans la boucle... ?


0
Knowhere Messages postés 3 Date d'inscription jeudi 27 novembre 2014 Statut Membre Dernière intervention 28 novembre 2014
28 nov. 2014 à 11:57
J'ai deux valeurs à retrouver. La recherche des valeurs me donnera l'adresse de la valeur.
Il faut que la première Adresse trouvée ("Trouve"), soit juste au dessus de la seconde Adresse trouvée ("Trouve2")...

Merci d'avance
0

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

Posez votre question
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
28 nov. 2014 à 15:03
Bonjour,
Merci pour l'information qui est aussi instructive que votre bonjour.... !
Je vais donc décortiqué la procédure pour comprendre ce qui se passe... ce sera plus long car je dois créer un fichier fictif... !

0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
Modifié par Le Pingou le 28/11/2014 à 16:40
Bonjour,
Merci de m'indiquer dans quel classeur ou se trouve la procédure [Private Sub CommandButton2_Click()] ..... !


En plus il y a une erreur de compilation car votre variable [Trouve] n'as aucune valeur ..... ou les trouver.... ????

Salutations.
Le Pingou
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
29 nov. 2014 à 11:53
Bonjour,
Eh bien voilà, j'ai un sérieux doute sur le contrôle pas à pas que vous avez réalisé chez vous car il y a une erreur de compilation sur le code fourni dans votre message ou alors ce n'est pas le même... !
J'attends votre réponse explicative pour poursuivre...... !

0
Bonjour !
Désolé du retard mais le week-end je laisse tout cela de côté...

Le Private Sub CommandButton2 se trouve dans le fichier de saisies.

Voici des liens vers mes fichiers excel, ce sera plus explicite.
Il y a deux fichier de saisies pour les opérateurs et un fichier de sauvegarde.


https://www.transfernow.net/fr/8644n7k5o38v

Merci d'avance.
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
Modifié par Le Pingou le 1/12/2014 à 11:39
Bonjour,
Merci pour le fichier.
Premier constat concernant le pas à pas, j'avais raison car ce n'est pas exactement les mêmes procédures (dans le début...) cela ne pouvait pas fonctionner chez moi.
Je vais donc partir sur celle qui se trouve dans le classeur [Enregistrement_D%C3%A9capages.xlsm)... !


Salutations.
Le Pingou
0
D'accord j'attends vos retours, merci du temps que vous m'accordez !!!
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
1 déc. 2014 à 14:20
Bonjour,
Je reviens encore une fois, je vous avais signalé :
En plus il y a une erreur de compilation car votre variable [Trouve] n'as aucune valeur ..... ou les trouver.... ????
Je tombe sur le même problème avec la commande [CLIQUER POUR VALIDER] ..... ! Ligne en cause [Set Trouve = .FindNext(Trouve)] ...... !
Merci d'expliquer exactement ce que vous voulez réaliser avec cette instruction... !

0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
1 déc. 2014 à 14:37
Bonjour,
J'ai neutralisé l'instruction .... et cela continu :
Erreur d'exécution `438' ligne surlignée : Set PlageDeRecherche = ActiveSheet.i
Etes-vous sur que ce code fonctionne chez vous.... ?

0
Ne vous embêtez plus, j'ai trouvé. Voici le code énormément simplifié, et qui fonctionne. Désolé d'avoir gaché quelque peu votre temps !
Je vous souhaite une bien bonne journée !
Private Sub CommandButton2_Click()

'recherche n° lancement:
Workbooks.Open Filename:="P:\Technique\METHODES\6.DECAPAGE\Saisies et sauvegardes décap' courses raid\Sauvegardes Enregistrements_Course Raideurs Décapages.xlsm"


Do



Dim Trouve1 As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String

Valeur_Cherchee = Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("E3").Value
Set PlageDeRecherche = ActiveSheet.Range(ActiveCell.Address & ":B100")
Set Trouve1 = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
If Trouve1 Is Nothing Then
AdresseTrouve1 = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
Else
AdresseTrouve1 = Trouve1.Address
End If
'Recherche fraction de lot
If Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("I3").Text = Trouve1.Offset(1, 0).Text Then
Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("D12").Value = Trouve1.Offset(1, 2).Text
Else
Trouve1.Offset(-1, 0).Select
End If

Loop While Workbooks("Enregistrement_Décapages.xlsm").Sheets("Feuil1").Range("I3").Text <> Trouve1.Offset(1, 0).Text

End Sub
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
Modifié par Le Pingou le 1/12/2014 à 16:29
Bonjour,
D'après ce que je trouve dans le code, vous cherchez un couple de valeur (exemple : FLEU et V)
Dans la colonne [B] du classeur de sauvegarde et là vous en avez une quinzaine à des dates et heures différente....... Lequel est le bon couple... ?

Ensuite vous cherchez une [Moyenne] et on la trouve en [C84] et ceci correspond à un N0 de lancement 111 et Fraction de lot 11 ce qui est différent de FLEU et V .......Est-ce vraiment correct....Oui / Non

Enfin vous avez récupéré les adresses [$B£10, $B$11 et $C$84] dans la plage T1 :T3 ..... !
Au passage, le code est bizarre mais bon il faut voir....!


Salutations.
Le Pingou
0
La sauvegarde de l'EXCEL "sauvegarde" n'était pas représentative de celle qui sera utilisée par la suite... Les tableaux orange et violet seront intercallés un à un, avec des LOT et fractions différentes...

Tel qu'il est, le code fonctionne, j'ai juste à rajouter un IF pour bien vérifier qu'il s'agit du tableau d'enregistrements des courses.

Voilà, un grand merci et bonne soirée !!! ;)
0
Le Pingou Messages postés 12035 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 1 avril 2024 1 425
1 déc. 2014 à 16:43
Bonjour,
J'ai compris bonne suite.

0