IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Vérifier valeurs dans chaque feuille et boucle Do .. Loop Until [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut Vérifier valeurs dans chaque feuille et boucle Do .. Loop Until
    Bonjour à tous,

    J'ai 4 valeurs définies dans ma macro (fichier Excel A). Je souhaite chercher ces valeurs dans toutes les feuilles d'un classeur Excel B. Puis, lorsque la macro a trouvé une ligne dans le fichier Excel B avec mes 4 valeurs, faire apparaître un message "Correct".
    J'ai essayé plusieurs types de boucles avec Do .. Loop Until ou Do .. Loop ect. Mais cela ne fonctionne pas et je commence à sécher, je commence juste en VBA !
    Avec le code ci-dessous, la boucle continue alors qu'il a trouvé mes 4 valeurs... Et lorsque toutes les feuilles ont été vérifiées, un message d'erreur apparaît sur la ligne Loop Until ... "Erreur d'exécution 91 : Variable objet ou variable de bloc With non définie"

    Si vous avez des idées ou des corrections, je vous en serai grandement reconnaissante !! Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub AJOUT_OF()
     
    Dim DATE_OF As Date
    Dim Feuille As Worksheet
    Dim REFERENCE As Variant
    Dim OF As Variant
    Dim QUANTITE As Variant
    Dim REFERENCE_CHECK As Variant
     
    'Faire apparaître la fenêtre pour demander les données
    UF_DONNEES.Show
     
    REFERENCE = UF_DONNEES.TB_REFERENCE.Value
    OF = UF_DONNEES.TB_OF.Value
    DATE_OF = UF_DONNEES.TB_DATE.Value
    QUANTITE = UF_DONNEES.TB_QUANTITE.Value
     
    'Vérifier les valeurs dans le classeur des lancements dans T:\LOGISTIQUE
    Workbooks.Open Filename:="B:\DONNEES-2020.xlsx", Notify:=False
    Do
     
    For Each Feuille In ActiveWorkbook.Sheets
    Feuille.Activate
     
    With Feuille.Range("B:B")
    Set REFERENCE_CHECK = .Find(What:=REFERENCE)
    End With
     
    With Feuille.Range("A:A")
    Set OF_CHECK = .Find(What:=OF)
    End With
     
    With Feuille.Range("F:F")
    Set DATE_OF_CHECK = .Find(What:=DATE_OF)
    End With
     
    With Feuille.Range("E:E")
    Set QUANTITE_CHECK = .Find(What:=QUANTITE)
    End With
    Next Feuille
     
    Loop Until REFERENCE_CHECK = REFERENCE And OF_CHECK = OK And DATE_OF_CHECK = DATE_OF And QUANTITE_CHECK = QUANTITE
     
    '  MsgBox ("Correct")
    End Sub

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour lisa,

    Je te proposerai d'effectuer des filtres sur les tableaux de chaque feuille avec .AutoFilter

    (Je ne sais pas s'il est possible d'effectuer sur une seule ligne un .AutoFilter avec plusieurs Field, autrement...)

    En définissant des variables ainsi :

    BD Feuille 1 : t_sheets1
    BD Feuille 2 : t_sheets2...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Private Sub Test()
    Dim WbT as Workbook
    Dim t as ListObjects
    Dim WbO as Worksheet
    Dim Maniperr as Integer
     
    Set WbT = ActiveWorkbook
     
    For i = 1 to WbT.Sheets.Count 
          Set WbO  = WbT.Sheets(i)
          Set t = WbO.Listobjects("t_sheets" & i)
     
          t.DataBodyrange.AutoFilter Field:=2, Criteria1:=UF_DONNEES.TB_REFERENCE.Value
     
          With t.DataBodyRange.SpecialCells(xlCellTypeVisible)
                 .AutoFilter Field:=1, Criteria1:= UF_DONNEES.TB_OF.Value
                 .AutoFilter Field:=5, Criteria1:=UF_DONNEES.TB_QUANTITE.Value
                 .AutoFilter Field:=6, Criteria1:= UF_DONNEES.TB_DATE.Value
          End With
     
    On Error GoTo errorHandler
    Maniperr = t.DataBodyRange.SpecialCells(xlCellTypeVisible)
     
    errorHandler:
    If Err.Number = 1004 Then
         MsgBox("Aucune correspondance aux critères dans la feuille " & i)
    Else
         MsgBox("...Ce que tu veux faire. Copier ?")
    End If
    Next i
     
    End Sub
    Je n'ai pas testé ce code. Si tu veux plus d'informations sur son fonctionnement, je peux t'en donner. J'en ai un semblable dans mon projet, je me suis permis de l'adapter à ton besoin. Ne sachant pas ce que tu veux faire des données par la suite... Afficher un "OK" pour chaque ligne trouvée me paraît inadapté, surtout si tu trouves un millier de correspondance

    Révèr

  3. #3
    Membre averti
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    Merci pour ta réponse et ta rapidité !!

    Mon excel B (là où je vais chercher mes 4 valeurs provenant de A) n'est pas sous forme de tableau, je ne sais pas si ça peut influer pour .AutoFilter ?

    Par contre, le nombre de feuille va évoluer au fur et à mesure que l'on avance dans l'année, une nouvelle feuille est créée chaque semaine. C'est pour cette raison que j'utilisais "For Each Feuille". Est-ce que cela pourra fonctionner avec ton code ?

    En essayant ton code, j'ai une erreur "Erreur d'exécution '9' : L'indice n’appartient pas à la sélection" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set t = WbO.Listobjects("t_sheets" & i)
    Il ne devrait y avoir qu'une seule correspondance entre les valeurs de ma macro A et mon classeur B

    Merci encore pour ton aide !

  4. #4
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    je ne comprends pas que tu lances l'USerForm dans le code !?... Pour moi, tu devrais d'abord lancer l'UserForm UF_DONNEES qui aurait un CommandButton1 OK ou Valider avec le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub CommandButton1_Click()'
    Dim DATE_OF As Date
    Dim REFERENCE As Variant
    Dim OF As Variant
    Dim QUANTITE As Variant
    Dim REFERENCE_CHECK As Variant
    Dim FEUILLE As Worksheet
    Dim TV As Variant
    Dim I As Integer
    Dim MSG As String
     
     
    REFERENCE = UF_DONNEES.TB_REFERENCE.Value
    OF = UF_DONNEES.TB_OF.Value
    DATE_OF = CDate(UF_DONNEES.TB_DATE.Value)
    QUANTITE = UF_DONNEES.TB_QUANTITE.Value
     
    'Vérifier les valeurs dans le classeur des lancements dans T:\LOGISTIQUE
    Workbooks.Open Filename:="B:\DONNEES-2020.xlsx", Notify:=False
    For Each FEUILLE In ActiveSheet.Worksheets
        TV = FEUILLE.Range("A1").CurrentRegion
        For I = 1 To UBound(TV, 1)
            If CStr(TV(I, 1)) = OF And CStr(TV(I, 2)) = REFERENCE And CStr(TV(I, 5)) = QUANTITE And CDate(TV(I, 6)) = DATE_OF Then
                MSG = MSG & "Onglet : " & FEUILLE.Name & ", ligne : " & I & ", Correct" & Chr(13)
            End If
        Next I
    Next FEUILLE
    MsgBox MSG
    End Sub

  5. #5
    Membre averti
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    Bonjour Thautheme,

    L'Userform est lancé au départ car un utilisateur rentre manuellement les 4 fameuses valeurs que je cherche ensuite dans le classeur B.

    Ton code semble correspondre à ce que je souhaitais faire, merci beaucoup !
    Par contre, à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CStr(TV(I, 1)) = OF And CStr(TV(I, 2)) = REFERENCE And CStr(TV(I, 5)) = QUANTITE And CDate(TV(I, 6)) = DATE_OF Then
    J'ai une erreur concernant une incompatibilité de type au niveau de la date. J'ai vérifié dans mon classeur B. Et la colonne Date est bien au format "Date", et la date rentrée dans la macro est au même format (JJ/MM/AAAA)... Aurais-tu une idée d'où vient le problème ?

    Merci encore !

  6. #6
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Pour les dates sur VBA, utiliser la fonction CDate(var)

    La méthode .Count de l'objet Sheets s'adaptera à la création de tes nouvelles feuilles. Il faut surtout faire attention à ce que dans chaque feuille, ton tableau soit bien nommé "t_sheets" suivi du numéro de la feuille.

    En effet, à chaque boucle le code va logiquement (non testé donc je prends des pincettes) pointer la variable WbO sur la feuille de l'indice de boucle PUIS pointer l'objet t sur le tableau t_sheets suivi de l'indice de la feuille.

    L'erreur que tu as apparaît sur quelle feuille ? Sur celle où il y a une correspondance ? Ou sur celles où il n'y en a pas ?

    Je regarde avec attention ton code Thauthème, pour essayer de l'adapter à ma situation aussi

    Bon après-midi,

    Rév_r

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    Citation Envoyé par lisaw9682 Voir le message
    Bonjour Thautheme,
    J'ai une erreur concernant une incompatibilité de type au niveau de la date. J'ai vérifié dans mon classeur B. Et la colonne Date est bien au format "Date", et la date rentrée dans la macro est au même format (JJ/MM/AAAA)... Aurais-tu une idée d'où vient le problème ? Merci encore !
    Peut-être en supprimant le Cdate...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/01/2012, 14h08
  2. Insérer une procédure dans chaque feuille automatiquement
    Par melouille56 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/01/2008, 14h45
  3. Recherche de valeur dans une feuille et affichage dans une autre
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/05/2007, 09h40
  4. affichage de valeur dans une feuille excel
    Par blanka6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2007, 14h25
  5. [Excel] Total de valeurs dans plusieurs feuilles
    Par Fealendril dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/01/2006, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo