VBA Fonction FIND imbriqué

  • Initiateur de la discussion Initiateur de la discussion solgti
  • 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 !

solgti

XLDnaute Junior
Bonjour à tous, je débute avec VBA et je crois que je me suis attaqué à un cas difficile, du moins je n'y arrive pas, donc SVP à l'aide:

Situation:
J'ai 2 feuilles, Data et Planification
Je souhaite:
1- Faire une recherche dans Data selon la colonne 1 et récupérer la valeur de la colonne 4
2- Avec la valeur de la colonne 4, je fais une recherche dans la feuille Planification
3- Lors que je trouve la valeur dans Planification je récupère une date qui est dans une cellule Offset
4- le problème est que la fonction trouve le premier cas, mais ma variable de recherche de la feuille Data est remise à blanc après la recherche de la feuille Planification:

Le Code:

Set FDest = Worksheets("Data")
Set FSource = Worksheets("Planification")
Set Range1 = FDest.Columns(1)
Set Range2 = FSource.Range("D5😀49")

'Le code recherché
CodeCommande = Worksheets("Planification").Range("CodeCommande").Value

'recherche du code de commande dans la feuille Data
Set CommandeCell = Range1.Find(What:=CodeCommande)

If Not CommandeCell Is Nothing Then
Set bCell = CommandeCell
Do While ExitLoop1 = False
'Récupération de la valeur pour la recherche dans la feuille Planification
CodeCelule = CommandeCell.Offset(0, 3).Value
'Recherche dans la feuille Planification
Set CelluleCell = Range2.Find(What:=CodeCelule)
DatePlanif = CelluleCell.Offset(0, -2).Value
CommandeCell.Offset(0, 11).Value = DatePlanif
'C'est ici que ça ce gâte, la valeur de CommandeCell ne retourne rien, par contre si je ne fais pas
'de recherche dans la feuille Planification, ça fonctionne bien et la recherche dans la feuille Data continu
'jusqu'à la fin.
Set CommandeCell = Range1.FindNext(After:=CommandeCell)
If Not CommandeCell Is Nothing Then
If CommandeCell.Address = bCell.Address Then Exit Do
Else
ExitLoop1 = True
End If
Loop
Else
End If

Espérant que quelqu'un pourra m'aider, merci à l'Avance
Sylvain
 
Re : VBA Fonction FIND imbriqué

Bonjour solgti et bienvenu 🙂

L'instruction FindNext (comme son nom le laisse entendre) semble rechercher la dernière valeur cherchée (qui est "CodeCelule" et non pas "CodeCommande"). En remplaçant le FindNext par un Find en reprécisant la valeur cherchée "CodeCommande", le code devrait fonctionner.
VB:
Sub Chercher()

Set FDest = Worksheets("Data")
Set FSource = Worksheets("Planification")
Set Range1 = FDest.Columns(1)
Set Range2 = FSource.Range("D5:D49")

'Le code recherché
CodeCommande = Worksheets("Planification").Range("CodeCommande").Value

'recherche du code de commande dans la feuille Data
Set CommandeCell = Range1.Find(what:=CodeCommande, LookAt:=xlWhole)  'MODIFIé
  If Not CommandeCell Is Nothing Then
  Set bCell = CommandeCell
    Do While ExitLoop1 = False
      'Récupération de la valeur pour la recherche dans la feuille Planification
      CodeCelule = CommandeCell.Offset(0, 3).Value
      'Recherche dans la feuille Planification
      Set CelluleCell = Range2.Find(what:=CodeCelule, LookAt:=xlWhole)  'MODIFIé
      DatePlanif = CelluleCell.Offset(0, -2).Value
      CommandeCell.Offset(0, 11).Value = DatePlanif
      
      Set CommandeCell = Range1.Find(what:=CodeCommande, After:=CommandeCell)  'MODIFIé
      If Not CommandeCell Is Nothing Then
        If CommandeCell.Address = bCell.Address Then Exit Do
      Else
        ExitLoop1 = True
      End If
    Loop
  End If
End Sub

NB: Pour augmenter vos chances de réponse, il est fortement recommandé de fournir un fichier exemple:
  • Non pas un fichier complet mais un "petit" fichier extrait de votre fichier de travail en ne conservant que quelques lignes par feuille.
  • Fichier expurgé de toutes données nominatives et confidentielles.
  • Avec une feuille montrant le résultat souhaité et avec les explications qui vont bien.


Pour joindre un fichier:
Quand vous rédigez un nouveau message ou quand vous modifiez un de vos messages, passez en mode avancé et cliquez sur 'Gérer les pièces jointes' ou bien cliquez directement sur l'icone 'Trombone'.
Choisissez vos fichiers (boutons Choisir un fichier), cliquez sur envoyer (bouton envoyer) pour les charger, quand ils sont chargés (les noms des fichiers s'affichent en couleur) refermez la fenêtre (bouton Fermer cette fenêtre) puis cliquez sur 'envoyez...' ou 'enregistrer les changements'.
 

Pièces jointes

Dernière édition:
Re : VBA Fonction FIND imbriqué

Bonjour mapomme, merci beaucoup pour la réponse aussi rapide et d'une qualité exceptionnelle, j'ai intégré vos modifications dans mon code et ça fonctionne très bien.
Je prends bonne note de vos conseils pour une prochaine demande d'aide.

J'ai visité plusieurs site avant de choisir de m'inscrire ici, comme vous le savez surement, souvent les réponses aux questions sont plutôt vagues et incompréhensible, mais je suis très heureux d'avoir choisi de m'inscrire ici.
Pour une première expérience je reçois une réponse de très grande qualité.
Encore une fois merci et à la prochaine!
 
Re : VBA Fonction FIND imbriqué

J'aurais encore besoin de votre aide SVP.

Mon besoin a un peu évoluer et maintenant je dois faire une recherche selon 2 critères, soit un no de commande et un no de kit.
Dans l'onglet Planif j’inscris le no de commande et le no de kit, ensuite avec un find je recherche dans la colonne 1 de la feuille Data la concaténation de no de commande & "-" & No kit, mais la fonction ne trouve rien.

Est-ce que l'on peut utiliser un find avec un champ concaténé?
Est-ce parce que dans la colonne 1 de Data c'est une formule de concaténation qu'il ne trouve rien.

Merci de me donner un coup de main.
 

Pièces jointes

Re : VBA Fonction FIND imbriqué

Merci ça fonctionne.

Je profite de vous pour vous poser une autre question.

Il y a la méthode formatage conditionnel, qui fonctionne bien, mais dans mon cas j'ai un tableau de 2250 cellules qui font des validations sur des références différentes, comme par exemple:

Sur la feuille Data dans la cellule "D10" je veux qu'elle soit en jaune si le contenu de la cellule "D10" de la feuille Planif

Je sais que je peux faire une formule par cellule, mais 2250 cellules c'est un peu long.
Est-ce qu'il y aurait un moyen de définir une fonction globale au document qui se chargerait de faire ce changement de formatage automatiquement?
J'espère que ma question est clair.

Encore merci, pour les coups de main.
 
Re : VBA Fonction FIND imbriqué

Bonsoir Solgi,

Le fichier joint précédemment ne convenant pas (cellule D10 vides sur les deux onglets), pouvez vous joindre un fichier exemple pour le formatage conditionnel (avec au moins deux cellules devant être colorées) s'il vous plait ?
 
Re : VBA Fonction FIND imbriqué

Voilà, sur l'exemple la cellule Data D10 devient jaune si je met une valeur dans Planif D10, dans ce cas j'ai utilisé la mise en forme conditionnelle.
Je voudrais obtenir le même résultat pour toutes les cellules à l'intérieur des bordures, mais sans être obligé de faire une mise en forme conditionnelle sur chaque cellule.

Merci
 

Pièces jointes

Re : VBA Fonction FIND imbriqué

Bonjour solgti,

Pour cela:
  • sélectionner sur la feuille "DATA" la zone D10:H16 en partant de D10 (une fois la sélection faite, la cellule D10 est la cellule active de la sélection)
  • ouvrir le menu "format conditionnel"
  • mettre en formule : =Planif!D10>0

Le format conditionnel doit maintenant s'appliquer à chaque cellule de la zone D10:H16.

nb: Quand on applique une MFC à une zone (ici D10:H16), la formule de la MFC s'applique à chaque cellule cette zone. Mais on écrit la formule comme si on était placé dans la cellule D10. Excel va ensuite adapter cette formule (de base D10) à chaque cellule de la zone exactement comme si on faisait un "copier / coller" de la formule de D10 vers les autres cellules de la zone.

La formule =Planif!D10>0 sera interprétée par excel pour la MFC en =Planif!D11>0 pour la cellule D11 ou en =Planif!F13>0 pour la cellule F13. C'est ce qu'on désire.

Par contre, en conservant les $D$10 dans votre formule (référence absolue) pour la zone D10:H16, vous irez toujours rechercher la même valeur de cellule (celle de la cellule D10) quelque soit la cellule de la zone D10:H16.
 

Pièces jointes

Dernière édition:
Re : VBA Fonction FIND imbriqué

Bonjour solgti,

Voir dans le fichier joint. Le code est dans le module de code de la feuille "Planif".
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xcell As Range
For Each xcell In Intersect(Range("D10:H16"), Target)
If xcell.Value > 0 Then
  Sheets("Data").Range(xcell.Address).Interior.Color = RGB(255, 128, 128)
Else
  Sheets("Data").Range(xcell.Address).Interior.ColorIndex = xlNone
End If
Next xcell
End Sub
 

Pièces jointes

- 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

Discussions similaires

Réponses
4
Affichages
259
Réponses
2
Affichages
172
Réponses
3
Affichages
976
Retour