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 :

[E-03] Copie de ligne avec condition de type rechercheV


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut [E-03] Copie de ligne avec condition de type rechercheV
    Bonjour!

    J'ai fouillé dans le forum et je n'ai pas trouvé de réponse à ma question. Je vous la soumet donc!

    J'ai un fichier Excel avec 2 feuilles:
    - "Data"
    - "Suivi"

    Voici un petit aperçu de mes colonnes (Les premières colonnes sont les même dans les deux feuilles, mais à partir de la colonne D c'est différent):

    A B C
    # Bon travail #Machine Date

    Je veux prendre les lignes de la feuille "Data" et les copier dans la feuille "Suivi ", mais je veux que la ligne dans "Data" soit copiée seulement si le numéro de bon de travail n'apparaît pas déja dans la feuille "Suivi".

    Ex:
    Feuille "Data"
    A B C
    A010255 112BB4C2 2009-02-07
    A010302 122C4R 2009-02-11
    A010333 112BB4 2009-02-25


    Feuille "Suivi
    A B C
    A010255 112BB4C2 2009-02-07
    A010333 112BB4 2009-02-25

    Je veux que le bon de travail #A010302 (2e ligne) se copie dans la feuille "Suivi" à la suite des autres, mais les bons de travail #A010255 et #A010333 ne doivent pas se recopier (l'utilisateur ira commenter dans les colonnes D et E de la feuille "Suivi" et je ne veux pas que les données soient écrasées). J'ai pensé utiliser une fonction de recherche verticale, mais je ne sais pas trop comment!

    Je ne sais pas si je suis claire, mais j'aimerais beaucoup trouver un code VBA qui pourra copier mes lignes en tenant compte de cette condition.

    Merci à l'avance pour vos bon conseil!!

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Ta question me semble clairement posée. Deux précisions :
    - Combien de lignes environ dans chaque feuille?
    - Combien de lignes, environ, nouvelles dans "Data" à chaque traitement?

    PGZ

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour!

    Ce fichier sera mis à jour régulièrement au cour de l'année alors le nombre de ligne augmentera graduellement. Je parle d'un maximum de 50 lignes au total.

    Ma procédure complète est en fait la suivante:

    1- Extraire les données d'un systèm X dans ma feuille "DonneBrut" par une requête SQL
    2- Suprimer toutes les entrées de la feuille "Data"
    3- Transférer les données de la feuille "DonneBrut"qui répondent à certains critères dans ma feuille "Data" et jouer avec la mise en forme (ajouter/supprimer certaines colonnes pour uniformiser avec la feuille "Suivi")
    4- Copier les lignes de la feuille "Data" à la feuille "Suivi" si elles ne s'y trouvent pas déja (c'est pour cette partie que j'ai besoin d'aide).

    Le but est que toutes les données de la feuille "DonneBrut" correspondantes à certains critères soient tranférées dans la feuille "Suivi", sauf que d'une mise à jour à l'autre, les données déja entrées dans la feuille "Suivi" ne doivent pas être écrasée. La feuille "Data" ne sert qu'à effectuer des modifications sur la mise en forme et l'ordre des colonnes.

    Merci

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    OK. Je te donne une méthode par dialogue avec les feuilles. Si c'est long, il faudra utiliser des variables tableaux, suivant le même principe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Déterminer LD, dernière ligne sur la feuille Data
    Déterminer LS, dernière ligne au départ de la feuille Suivi
     
    (SI les données commencent en ligne 1 sur les 2 feuilles)
    Pour L = 1 à LD
        Num =#BT
        Pour M = 1 à LS
            si Num = FeuilSUivi.Cells(M,col#BT) alors sortir du Pour...
        M suivant
        si M <= LS alors
            copier ligne Data(L) dans Suivi(LS)
            LS = LS+1
        fin si
    L suivant
    PGZ

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse!

    Malheureusement, les deux feuilles ne commencent pas à la ligne 1. La feuille "Data" commence à la ligne 2 et la feuille "Suivi" commence à la ligne 5.

    Aussi, je ne suis pas encore tout à fais à l'aise avec les code en VBA alors j'ai de la difficulté à adapter un code... Par exemple, lorsque tu dis "alors sortir du Pour..."

    Merc pour tes précisions, c'est vraiment très apprécié!!!

    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
     
    Déterminer LD, dernière ligne sur la feuille Data
    Déterminer LS, dernière ligne au départ de la feuille Suivi
     
    (SI les données commencent en ligne 1 sur les 2 feuilles)
    Pour L = 1 à LD
        Num =#BT
        Pour M = 1 à LS
            si Num = FeuilSUivi.Cells(M,col#BT) alors sortir du Pour...
        M suivant
        si M <= LS alors
            copier ligne Data(L) dans Suivi(LS)
            LS = LS+1
        fin si
    L suivant

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Lufia,

    Une fois codé, cela donne cela
    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
    Sub subMAJSuivi()
    Dim shData As Excel.Worksheet, shSuivi As Excel.Worksheet
    Dim L1Data As Long, L1Suivi As Long, LDData As Long, LDSuivi As Long
    Dim iBT As Integer, sNumBT As String
    Dim x As Long, y As Long
     
    Set shData = Application.ThisWorkbook.Worksheets("Data")
    Set shSuivi = Application.ThisWorkbook.Worksheets("Suivi")
     
    L1Data = 2
    L1Suivi = 5
    iBT = 1 'numéro colonne #BT
    LDData = shData.Cells(Application.Rows.Count, iBT).End(xlUp).Row
    LDSuivi = shSuivi.Cells(Application.Rows.Count, iBT).End(xlUp).Row
     
    For x = L1Data To LDData
        sNumBT = shData.Cells(x, iBT).Value
        For y = L1Suivi To LDSuivi
            If shSuivi.Cells(y, iBT).Value = sNumBT Then Exit For
        Next y
        If y > LDSuivi Then
            LDSuivi = LDSuivi + 1
            shData.Rows(x).Copy shSuivi.Rows(LDSuivi)
        End If
    Next x
     
    Set shData = Nothing
    Set shSuivi = Nothing
     
    End Sub
    A adapter si des paramètres ne sont pas bons. Je ne peux pas tester.

    Si le temps de traitement était trop long, il faudrait faire autrement.

    Cordialement,

    PGZ

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    WOW!

    Ça fonctionne très bien!
    Un très très grand merci!

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

Discussions similaires

  1. [XL-2010] macro copie et colle des lignes avec condition de cellule
    Par olive72 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2015, 16h34
  2. Copie de ligne avec condition
    Par lucazzo dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 07/09/2009, 17h58
  3. Copie de ligne avec 2 conditions
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 29/05/2009, 13h21
  4. inserer une ligne avec condition
    Par pepesese dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/02/2008, 19h22
  5. Affichage ligne avec condition dans /etc/passwd
    Par mzt.insat dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 17/04/2006, 21h25

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