[Déplacé VB6 --> VBA] pb boucle, chercher dans plusieurs cellules le meme conten

Signaler
Messages postés
114
Date d'inscription
vendredi 9 avril 2010
Statut
Membre
Dernière intervention
16 août 2011
-
Messages postés
31504
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
-
Bonjour

je cherche à faire un planning avec vba.
je voudrai que chaque fois que je cherche un jour avec une tranche horaire et un nom cela me mette un c.
j'ai fais un planning pour un mois. le problème c'est que dès qu'il a trouvé une cellule contenant ce que nous recherchons ca ne va pas plus loin.
par exemple je voudrai dire que l'ouvrier nanie est pris tous les lundi à 6h
il devrais donc chercher tous les lundi 6 et mettre un c dans la colonne nanie en face lundi 6

voici ce que j'ai fais :
Sub planning()

'modifier disponibilité des personnes
Dim vclasseurN2 As Worksheet
Dim l As Integer, r As Integer
chemin = "C:"
Set vclasseurN2 = Workbooks("planning.xls").Worksheets("Feuil4")
        l = 1
    While Not IsEmpty(vclasseurN2.cells(1, l)) And UCase("nanie") <> UCase(vclasseurN2.cells(1, l))
        l = l + 1
    Wend
        r = 1
    While Not IsEmpty(vclasseurN2.cells(r, 2)) And UCase(vclasseurN2.cells(r, 2)) <> UCase("Lundi 6")
        r = r + 1
    Wend
    While UCase(vclasseurN2.cells(r, 2)) = UCase("Lundi 6")
        If vclasseurN2.cells(1, 12) = "hebdomadaire" Then
        vclasseurN2.cells(r, l) = "C"
        r = r + 1
        End If
        r = r + 1
        Wend



End Sub




Avez vous une idée de pourquoi cela ne fonctionne pas ?





nanie

3 réponses

Messages postés
31504
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
344
Bonjour Nanie,

Je n'ai pas encore cherché dans ton code d'où pouvait provenir ton souci.

Par contre je me demande si l'utilisation d'une fonction de "recherche" (FIND) ne pourrait pas mieux répondre à tes besoins ....

En gros,(vraiment très synthétiquement ) .. tu lances un Find sur "LUNDI" => ça te trouves les coordonnées.. puis tu lances un Find pour l'heure=> la encore tu as les coordonnées.. et donc tu écris ton "NANIE".
Puis tu fais un Next pour passer au lundi suivant.. etc...

Je n'ai pas le temps de t'écrire le code complet, mais tu peux t'inspirer d'une fonction que j'utilise souvant :
Function cherchC(nomF As String, valCherch As String) As Boolean 
'fonction de recherche... 
'********************************************************** 
' recherche la valeur 'valCherch' et nous indique le 
' N° de ligne et de Colonne où elle se trouve VcLig / VcCol 
'********************************************************** 
Dim vc As Variant 
Sheets(nomF).Activate 
Sheets(nomF).Cells(1, 1).Activate 
Set vc = Cells.Find(what:=valCherch, lookAt:=xlWhole, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False) 
If Not vc Is Nothing Then 
VcCol = vc.Column 
VcLig = vc.Row 
cherchC = True 
End If 
End Function 

La fonction telle qu'elle écrite ci-dessus, retourne True si la recherche a aboutie.
Pour pouvoir utiliser les variables VcLig et VcCol vous devez les déclarer en public dans votre modul principal.

Enfin bon.. reste à l'adapter à tes besoins...
PS: ça ne répond pas directement à TA question, mais le fait de faire un Find te permet d'aller directement aux cellules recherchées sans avoir à Parcourir tout le classeur...
Ca va donc un peu plus vite

Si tu rencotres un PB, n'hésites pas à me recontacter.

Cordialement,
Jordane,
Messages postés
114
Date d'inscription
vendredi 9 avril 2010
Statut
Membre
Dernière intervention
16 août 2011

je n'ai pas compris ta macro.
je ne connais pas la fonction find

nanie
Messages postés
31504
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 février 2021
344
Re,
Lorsque tu fais un "Edition/ Rechercher" dans une feuille Excel, il génère un code qui utilise la fonction FIND (code non réutilisable tel quel) d'où la fonction que je te propose qui permet de l'utiliser sans problème.

En gros..; plutot que lire cellule par cellule la valeur jusqu'à trouver celle que tu veux, tu lances une recherche dans ta feuille..(qui pointera directement sur LA cellule contenant la valeur cherchée).

Set vc = Cells.Find(what:=valCherch, lookAt:=xlWhole, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, LookIn:=xlValues, MatchCase:=False, SearchFormat:=False) 

' Quelques explications sur les paramètres de la fonction FIND :
' valCherch : Valeur cherchée
' After:=ActiveCell > recherche APRES la cellule active
' SearchOrder:=xlByColumns ' recherche colonne par colonne (xlByrows => Ligne/ligne)
' MatchCase:=False (recherche resultat EXACTE si valeur à True, sinon valeur Proche si False.

 


Donc imaginons que tu veuilles trouver la valeur "TOTO" dans une cellule de ta feuille 1.. dans ton sub, (ta macro) tu appellerais ma fonction comme suit :


'Déclaration des variables publiques (A mettre en tête du module principale)
Public VcCol As Integer
Public VcLig As Integer

Sub Nom_de_ma_Macro()
'recherche de la valeur (du mot) "TOTO"
Cherche_TOTO = cherchC("Feuil1", "TOTO")
If Cherche_TOTO = True Then ' si TOTO trouvé....
    Ligne = VcLig 'Numero de ligne ou se trouve TOTO
    Colonne = VcCol 'Numero de Colonne ou se trouve TOTO
End If
End Sub


Cordialement,
Jordane,