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 :

récupérer la ligne d'une feuille dans une autre après vérification de plusieurs conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut récupérer la ligne d'une feuille dans une autre après vérification de plusieurs conditions
    Bonjour a tous,
    Je suis débutante avec la programmation VBA, et j’ai besoin de votre aide pour réaliser un Code VBA, je ne sais pas par où commencer .
    J’ai 5 feuilles de calcules
    Feuille « F nom[/B] » colonne A :Nom
    Feuille « F etat » colonne A : Nom,colonne B : Phase (on a deux phase 1 ou 2) , colonne C : etat (peut etre Chk ou autres… )
    Feuille « F ph1 » et Feuille « F ph2 » colonne A : Nom ( et d’autres informations sur les autres colonnes)
    Feuille « F ph1et2 » où on va copier les données

    "F nom" : une liste des noms des produits j’ai besoin de faire une boucle qui cherche par ordre de la liste le nom dans la feuille « F etat »

    "F etat" : présente la phase de produit, il faut chercher si le nom de produit existe et que phase = PH1 et etat= chk, si oui chercher le nom dans la feuille « F ph1 » et copie la ligne dans la première ligne vide dans « F ph1et2 » .
    si non si phase = PH2 et etat= chk, chercher le nom dans la feuille « F ph2 » et copie la ligne dans la première ligne vide dans « F ph1et2 » .

    Je vous remercie par avance pour votre aide .

  2. #2
    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 : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

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

    Peut-être comme ça (si les onglets sont bien dans l'ordre décrit) :

    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 Macro1()
    Dim P12 As Worksheet 'déclare la variable P12 (onglet F ph1etph2)
    Dim O(1 To 4) As Worksheet 'déclare la tableau de 4 onglets O
    Dim DL(1 To 4) As Integer 'déclare le tableau de 4 Dernières Lignes)
    Dim TV(1 To 4) As Variant 'déclare le tableau de 4 Tableaux des Valeurs
    Dim PH As String 'déclare la variable PH (PHase)
    Dim ET As String 'déclare la variable ET (ÉTat)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim L As Integer 'déclare la variable L (incrément)
     
    Set P12 = Worksheets("F ph1etph2") 'définit l'onglet P12
    P12.Rows.Delete 'supprime toutes lignes de l'onglet P12
    For I = 1 To 4 'boucle sur 4 éléments
        Set O(I) = Worksheets(I) 'définit l'onglet O de la boucle
        DL(I) = O(I).Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL de la colonne A de l'onglet de la boucle
        TV(I) = O(I).Range("A1").CurrentRegion 'définit le tableau des valeurs de la boucle
    Next I 'prochain élément de la boucle
    For I = 2 To UBound(TV(1), 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV(1) de l'onglet O(1) (en partant de la seconde)
        For J = 2 To UBound(TV(2), 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TV(2) de l'onglet O(2) (en partant de la seconde)
            If TV(1)(I, 1) = TV(2)(J, 1) Then 'condition 1 : si les noms coïncident
                PH = TV(2)(I, 2): ET = TV(2)(I, 3) 'définit la phase PH en colonne 2 du TV(2), définit l'état ET en colonne 3 de TV(2)
                If ET <> "chk" Then GoTo suite 'si l'état est différent de "chk", va a l'étiquette "suite"
                Select Case PH 'agit en foction de la phase PH
                    Case "PH1" 'cas PH1
                        For K = 2 To UBound(TV(3), 1) 'boucle 3 : sur toutes les lignes K du tableau des valeurs TV(3) de l'onglet O(3) (en partant de la seconde)
                            If TV(1)(I, 1) = TV(3)(K, 1) Then 'condition si les noms coïncident
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                O(3).Rows(K).Copy DEST 'copie la ligne K de l'onglet O(3) et la colle dans DEST
                            End If 'fin de la condition
                        Next K 'prochaine ligne de la boucle 3
                    Case "PH2" 'cas PH1
                        For L = 2 To UBound(TV(4), 1) 'boucle 4 : sur toutes les lignes L du tableau des valeurs TV(4) de l'onglet O(4) (en partant de la seconde)
                            If TV(1)(I, 1) = TV(4)(L, 1) Then 'condition si les noms coïncident
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                O(4).Rows(L).Copy DEST 'copie la ligne L de l'onglet O(4) et la colle dans DEST
                            End If 'fin de la condition
                        Next L 'prochaine ligne de la boucle 4
                End Select 'fin de l'action en fonction de la phase PH
            End If 'fin de la condition 1
        Next J 'prochaine ligne de la boucle 2
    suite: 'étiquette
    Next I 'prochaine ligne de la boucle 1
    End Sub

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Pour ma part, il s'agirait d'un cas d'alimentation de zones de listes déroulantes Combobox en cascade.
    Au demeurant, bien entendu, une pratique des formulaires est nécessaire.

  4. #4
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2009
    Messages : 38
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonjour,

    Pour ma part, il s'agirait d'un cas d'alimentation de zones de listes déroulantes Combobox en cascade.
    Au demeurant, bien entendu, une pratique des formulaires est nécessaire.
    La personne affirmant être débutante en VBA, je doute que cette réponse soit parlante et/ou utile sans présentation d'un code correspondant à la méthode citée

  5. #5
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut
    Bonjour Thautheme,

    je vous remercie pour votre réponse, avec tous le détail par les commentaires du code, je vais tester le code et essayer de le comprendre, et je vais revenir vers vous

    Orda

  6. #6
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut
    Re bonjour,

    malheureusement votre code mais ne fonction pas, je pense que j'ai mal exprimé mon objectif.. le plus important que votre code m'a idée pour trouver une piste de travail afin de construire ce code et je vous remercie pour ca.

    maintenant quelques problème que je ne sais comment les résoudre .

    Pour la ligne 4 : j'ai besoin de supprimer toutes les lignes sauf la 1er ligne.
    pour la ligne 11: j'ai besoin de mettre le nombre des ligne non vide de la feuille nom
    Pour la ligne 16: j'ai besoin de copie la ligne dans une ligne non vide.
    pour la ligne 19: je pense que le Else ne fonction pas avec une condition, j'ai vu sur un document qu'il faut utiliser "Case" mais je ne sais pas comment l'utiliser.

    je vous remercie pour votre aide

    Orda



    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
     
    Sub Comptest()
     
    Dim P1, P2, P12, nom, etat As Worksheet
    Dim i As Integer 'déclare la variable I (incrément)
    Dim j As Integer 'déclare la variable J (incrément)
    Dim k As Integer 'déclare la variable K (incrément)
    Dim n As Integer 'déclare la variable n (incrément)
     
     
    Set P12 = Worksheets("F ph1et2") 'définit l'onglet PH1et2
        'P12.Rows.Delete 'supprime toutes lignes de l'onglet P12    // ne supprime que la 1er Ligne je veux supprimer toutes les ligne sauf la premiére
    Set nom = Worksheets("F nom")
    Set etat = Worksheets("F etat")
    Set P1 = Worksheets("F ph1")
    Set P2 = Worksheets("F ph2")
     
        For i = 2 To 6 'boucle sur les noms         // j'ai besoin de recuperer le nbre des cellule non vide sur la feuille  F nom
            For j = 2 To 6           'boucle pour vérifier l'etat du nom
                If nom.Cells(i, 1) = etat.Cells(j, 1) Then
                    If etat.Cells(j, 2) = "PH1" And etat.Cells(j, 3) = "chk" Then
                        For k = 2 To 5 'boucle pour chercher le nom dans la feuille ph1
                            If nom.Cells(i, 1) = P1.Cells(k, 1) Then
                                Sheets("F ph1").Rows(k).Copy Sheets("F ph1et2").Rows(2)   'copie la ligne de la feuille PH1 dans PH1et2 // j'ai besoin de copie la ligne dans la ligne non vide
                            End If
                        Next k
                    Else: etat.Cells(j, 2) = "PH2" And etat.Cells(j, 3) = "chk" 'ne fonction pas il faut utiliser Case
                        For n = 2 To 5 'boucle pour chercher le nom dans la feuille ph2
                            If nom.Cells(i, 1) = P2.Cells(n, 1) Then
                                Sheets("F ph2").Rows(n).Copy Sheets("F ph1et2").Rows(4)   'copie la ligne de la feuille PH1 dans PH1et2 // j'ai besoin de copie la ligne dans la ligne non vide
                            End If
                        Next n
     
                    End If
     
                End If
            Next j
     
        Next i
     
    End Sub

  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 : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

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

    Mon code me paraît identique au tien sauf qu'au lieu de balayer les cellules, j'utilise des tableaux virtuels (TV). Cela rend l'exécution du code extrêmement rapide.
    Ensuite tu me parles de lignes mais elle ne correspondent à rien. Quand tu utilises les balise code, cela numérote les lignes. Ce sont ces numéros qu'il faut utiliser pour faire référence à une ligne de code. Donc quand dans ton dernier code ligne 18 tu dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To 6 'boucle sur les noms         // j'ai besoin de recuperer le nbre des cellule non vide sur la feuille  F nom
    Pourquoi alors tu boucles de 1 à 6 ?

    Mon code faisait ça avec DL(1) qui récupérait la dernière ligne édité de la la colonne A de l'onglet O(1) (= F nom)
    De là, le tableau virtuel reprenait toutes les ligne de 1 à DL(1) avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TV(1) = O(1).Range("A1").CurrentRegion
    et ma boucle, plutôt que de parcourir les cellules de l'onglet, parcourrait le tableau virtuel TV(1) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For I = 2 To UBound(TV(1), 1)
    Ce qui signifie toutes les lignes éditées de la colonne A de l'onglet F nom (en partant de la seconde car je considère que la ligne 1 contient le titre)

    Pour résumer, tu me proposes un code très similaire au mien mais beaucoup mois efficace. Sans le fichier en pièce jointe ne ne pourrait t'aider davantage...

  8. #8
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut
    Bonjour Thautheme,

    je te remercie pour ta réactivité, tu m'as fait un petit cours de VBA .
    Effectivement comme je t'ai dit sur mon 1er message j'ai utilisé ton code, mais j'ai supprimé toutes les commandes que je ne comprends pas comme "case", "Ubound" , ".End(x1up).Row".... c'est la 1ere fois que j'utilise le VBA donc je ne connais rien sauf quelques notions sur internet .
    Bref, je n'ai pas réussi à faire tourner ton code au début, mais maintenant ca fonction 100 fois mieux que le mien.
    mais quand j'ai fait les test, le résultat n’était pas vraiment ce que j'attendais et je n'ai pas réussi a comprendre pourquoi.

    je mis en pièce joint le fichier excel avec des commentaires sur la feuille "cde" pour le résultat du test par rapport au code.

    mille merci
    Orda
    Fichiers attachés Fichiers attachés

  9. #9
    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 : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

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

    Le code modifié (avec un fichier c'est plus facile de tester) :
    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
    46
    47
    48
    49
    50
    51
    52
    Sub Macro1()
    Dim P12 As Worksheet 'déclare la variable P12 (onglet F ph1etph2)
    Dim O(1 To 4) As Worksheet 'déclare la tableau de 4 onglets O
    Dim DL(1 To 4) As Integer 'déclare le tableau de 4 Dernières Lignes)
    Dim TV(1 To 4) As Variant 'déclare le tableau de 4 Tableaux des Valeurs
    Dim PH As String 'déclare la variable PH (PHase)
    Dim ET As String 'déclare la variable ET (ÉTat)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim L As Integer 'déclare la variable L (incrément)
     
    Set P12 = Worksheets("F ph1et2") 'définit l'onglet P12
    P12.Range("A1").CurrentRegion.Offset(1, 0).Rows.Delete 'supprime toutes lignes éditées de l'onglet P12
     
    'en une seule boucle on définit l'onglet O(I) (= sheets(I)), la dernière ligne éditée DL(I) de la colonne A de l'onglet O(I) et la tableau des valeurs TV(I) de l'onglet O(I)
    For I = 1 To 4 'boucle sur 4 éléments
        Set O(I) = Worksheets(I) 'définit l'onglet O de la boucle
        DL(I) = O(I).Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL de la colonne A de l'onglet de la boucle
        'CurrentRegion revient à faire [Ctrl] + [*] sur la cellule indiqué donc cellectionne les cellules ajjacentes
        TV(I) = O(I).Range("A1").CurrentRegion 'définit le tableau des valeurs de la boucle
    Next I 'prochain élément de la boucle
     
    'Tout tableau a des limites supérieure pour les lignes (TV(l),1) et pour les colonnes (TV(1),2) et des limites inférieures avec LBound
    'UBound(TV(1),1)) correspond donc à la derniere ligne du tableau TV(1) / Ubound(TV(I),2) correspond à la dernière colonne du Tableau TV(1) (ici une seule colonne)
    For I = 2 To UBound(TV(1), 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV(1) [de l'onglet O(1)] (en partant de la seconde)
        For J = 2 To UBound(TV(2), 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TV(2) de l'onglet O(2) (en partant de la seconde)
            If TV(1)(I, 1) = TV(2)(J, 1) Then 'condition 1 : si les noms coïncident
                PH = TV(2)(J, 2): ET = TV(2)(J, 3) 'définit la phase PH en colonne 2 du TV(2), définit l'état ET en colonne 3 de TV(2)
                Select Case PH 'agit en foction de la phase PH
                    Case "PH1" 'cas PH1
                        For K = 2 To UBound(TV(3), 1) 'boucle 3 : sur toutes les lignes K du tableau des valeurs TV(3) de l'onglet O(3) (en partant de la seconde)
                            If TV(1)(I, 1) = TV(3)(K, 1) And ET = "chk" Then 'condition si les noms coïncident et l'etat ET vaur "chk"
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                O(3).Rows(K).Copy DEST 'copie la ligne K de l'onglet O(3) et la colle dans DEST
                                GoTo suite 'va à l'étiquette suite
                            End If 'fin de la condition
                        Next K 'prochaine ligne de la boucle 3
                    Case "PH2" 'cas PH2
                        For L = 2 To UBound(TV(4), 1) 'boucle 4 : sur toutes les lignes L du tableau des valeurs TV(4) de l'onglet O(4) (en partant de la seconde)
                            If TV(1)(I, 1) = TV(4)(L, 1) And ET = "chk" Then 'condition si les noms coïncident et l'état vaut "chk"
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                O(4).Rows(L).Copy DEST 'copie la ligne L de l'onglet O(4) et la colle dans DEST
                                GoTo suite 'va à l'étiquette suite
                            End If 'fin de la condition
                        Next L 'prochaine ligne de la boucle 4
                End Select 'fin de l'action en fonction de la phase PH
            End If 'fin de la condition 1
    suite: 'étiquette
        Next J 'prochaine ligne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    End Sub

  10. #10
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut
    Merci pour ton aide Thautheme, le code marche super bien exactement comme je voulais .
    je vais penser a rajouter le fichier en pièce jointe la prochaine fois.

    Bon après midi

    Ourda

  11. #11
    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 : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

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

    le même code sans utiliser des tableaux virtuels mais des plages. Peut-être plus compréhensible mais certainement moins rapide :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub Macro1()
    Dim P1 As Worksheet 'déclare la variable P1 (onglet F nom)
    Dim P2 As Worksheet 'déclare la variable P2 (onglet F etat)
    Dim P3 As Worksheet 'déclare la variable P3 (onglet F ph1)
    Dim P4 As Worksheet 'déclare la variable P4 (onglet F ph2)
    Dim P12 As Worksheet 'déclare la variable P12 (onglet F ph1et2)
    Dim DL1 As Integer 'déclare la variable DL1 (Dernière Ligne de l'onglet P1)
    Dim DL2 As Integer 'déclare la variable DL2 (Dernière Ligne de l'onglet P2)
    Dim DL3 As Integer 'déclare la variable DL3 (Dernière Ligne de l'onglet P3)
    Dim DL4 As Integer 'déclare la variable DL4 (Dernière Ligne de l'onglet P4)
    Dim PL1 As Range 'déclare la variable PL1 (PLage de l'onglet P1)
    Dim PL2 As Range 'déclare la variable PL2 (PLage de l'onglet P2)
    Dim PL3 As Range 'déclare la variable PL3 (PLage de l'onglet P3)
    Dim PL4 As Range 'déclare la variable PL4 (PLage de l'onglet P4)
    Dim PH As String 'déclare la variable PH (PHase)
    Dim ET As String 'déclare la variable ET (ÉTat)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim L As Integer 'déclare la variable L (incrément)
     
    Set P1 = Worksheets(1) 'définit l'onglet P1 (le premier onglet du classeur)
    DL1 = P1.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL1 de la colonne A de l'onglet P1
    Set PL1 = P1.Range("A1").CurrentRegion 'définit la plage PL1 de l'onglet P1
    Set P2 = Worksheets(2) 'définit l'onglet P2 (le second onglet du classeur)
    DL2 = P2.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL2 de la colonne A de l'onglet P2
    Set PL2 = P2.Range("A1").CurrentRegion 'définit la plage PL2 de l'onglet P2
    Set P3 = Worksheets(3) 'définit l'onglet P3 (le troisième onglet du classeur)
    DL3 = P3.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL3 de la colonne A de l'onglet P3
    Set PL3 = P3.Range("A1").CurrentRegion 'définit la plage PL3 de l'onglet P3
    Set P4 = Worksheets(4) 'définit l'onglet P4 (le quatrieme onglet du classeur)
    DL4 = P4.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne édité DL4 de la colonne A de l'onglet P4
    Set PL4 = P4.Range("A1").CurrentRegion 'définit la plage PL4 de l'onglet P4
    Set P12 = Worksheets("F ph1et2") 'définit l'onglet P12
    P12.Range("A1").CurrentRegion.Offset(1, 0).Rows.Delete 'supprime toutes lignes éditées de l'onglet P12
     
    For I = 2 To DL1 'boucle 1 : sur toutes les lignes I de la plage PL1 (en partant de la seconde)
        For J = 2 To DL2 'boucle 2 : sur toutes les lignes J de la plage PL2 (en partant de la seconde)
            If PL1.Cells(I, 1) = PL2.Cells(J, 1) Then 'condition 1 : si les noms coïncident
                PH = PL2.Cells(J, 2): ET = PL2.Cells(J, 3) 'définit la phase PH en colonne 2 de PL2, définit l'état ET en colonne 3 de PL2
                Select Case PH 'agit en foction de la phase PH
                    Case "PH1" 'cas PH1
                        For K = 2 To DL3 'boucle 3 : sur toutes les lignes K de la plage PL3 (en partant de la seconde)
                            If PL1.Cells(I, 1) = PL3.Cells(K, 1) And ET = "chk" Then 'condition si les noms coïncident et l'etat ET vaur "chk"
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                P3.Rows(K).Copy DEST 'copie la ligne K de l'onglet O(3) et la colle dans DEST
                                GoTo suite 'va à l'étiquette suite
                            End If 'fin de la condition
                        Next K 'prochaine ligne de la boucle 3
                    Case "PH2" 'cas PH2
                        For L = 2 To DL4 'boucle 4 : sur toutes les lignes L de la plage PL4 (en partant de la seconde)
                            If PL1.Cells(I, 1) = PL4.Cells(L, 1) And ET = "chk" Then 'condition si les noms coïncident et l'état vaut "chk"
                                Set DEST = P12.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST de l'onglet P12
                                P4.Rows(L).Copy DEST 'copie la ligne L de l'onglet O(4) et la colle dans DEST
                                GoTo suite 'va à l'étiquette suite
                            End If 'fin de la condition
                        Next L 'prochaine ligne de la boucle 4
                End Select 'fin de l'action en fonction de la phase PH
            End If 'fin de la condition 1
    suite: 'étiquette
        Next J 'prochaine ligne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    End Sub

  12. #12
    Membre averti
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    Octobre 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 38
    Par défaut
    quelle chance? j'ai passé une semaine à réfléchir pour trouver une solution, et maintenant j'ai deux solutions
    merci Thautheme, je vais utilisé la première solution j'aime l'idée d'avoir un tableau qui parcoure les feuilles
    @+
    Orda

  13. #13
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je ne partage pas l'avis de Tigris.
    Et je ne chercherai pas à identifier la personne qui m'a affecté un pouce vers le bas.
    (J'en ai eu un autre dans une récente discussion, et il a été compensé par Menhir que je remercie)

    J'ai pris une précaution de langage.
    De plus, notre collègue aura entendu évoquer les formulaires et les combobox en cascades.
    Dans quelques temps, lorsqu'elle rencontrera cette problématique, elle pourrait, avec quelque expérience acquise, développer en tenant compte de ces notions.
    Celles-ci deviennent vite fondamentales pour toute personne cherchant à progresser en VBA

    Ceux qui me connaissent savent que je n'ai pour ainsi dire jamais abandonné une discussion en cours.
    Je voulais juste susciter l'attention. Même si cette démarche fait lever les yeux au ciel.

    La suite des propositions - judicieuses sans doute - de Tauthème relevaient aussi de méthodes inconnues.
    Elles n'ont pas pour autant suscité la même réaction.
    Là encore, notre collègue pourra revenir sur celles-ci.

    Pas grave...

    Bonne continuation à Orda.

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 14h35
  2. Réponses: 2
    Dernier message: 30/10/2008, 14h28
  3. écrire le résultat d'une macro dans une cellule d'une feuille à choisir
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2008, 12h56
  4. Insérer une feuille dans une feuille
    Par PsychedeChed dans le forum Excel
    Réponses: 2
    Dernier message: 07/02/2008, 15h01
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48

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