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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 64
    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 : 36
    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 : 64
    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

+ 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, 13h35
  2. Réponses: 2
    Dernier message: 30/10/2008, 13h28
  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, 11h56
  4. Insérer une feuille dans une feuille
    Par PsychedeChed dans le forum Excel
    Réponses: 2
    Dernier message: 07/02/2008, 14h01
  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, 13h48

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