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 :

VBA Problème copier-coller colonne dans selection sous forme de tableau [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut VBA Problème copier-coller colonne dans selection sous forme de tableau
    Bonjour à tous,

    Je suis néophyte et grâce à ce forum je progresse sur VBA.
    Malheureusement je n'ai pas trouvé réponse à mon problème c'est pourquoi je me lance sur ce forum.

    Je travail sur une base de donnée conséquente c'est pourquoi j'ai pris un exemple simple pour faciliter votre compréhension.

    D'une feuille F1 je veux sélectionner et copier colonne par colonne vers une feuille F2 en collant la sélection à la suite d'un tableau.
    Résultat la première colonne se colle au bon endroit mais les suivantes se trouvent décalées. Probablement parce que dans mon code je demande la dernière ligne non vide et que je suis en format tableau...

    Ci-joint mon exemple.

    Merci d'avance pour votre aide!

    Mathieu
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    c'est pourquoi je me lance sur ce forum.
    Dans ce cas là il serait bien avant de commencer, de lire les règles du forum, à commencer par celle-ci :
    https://www.developpez.net/forums/d8...s-discussions/

    Le mieux c'est d'expliquer littéralement de façon claire et exhaustive avec tous les tenants et aboutissants ainsi que le but à atteindre.

    là ce n'est pas assez clair …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Désolé pour cette erreur...

    Je vais essayer d'être plus clair:

    Je cherche à copier certaines colonnes d'une feuille (F1) vers une seconde feuille (F2) dans le but d'alimenter une base de donnée au format tableau.
    Pour se faire j'utilise le code suivant:

    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
    Sub Copycolonne()
         Sheets("F1").Select
         Range("A2").Select
         Range(Selection, Selection.End(xlDown)).Select
         Selection.Copy
         Sheets("F2").Select
         dernonvide = Range("B1000").End(xlUp).Row + 1
         Cells(dernonvide, 2).Select
         ActiveSheet.Paste
         Sheets("F1").Select
         Range("B2").Select
         Range(Selection, Selection.End(xlDown)).Select
         Selection.Copy
         Sheets("F2").Select
         dernonvide = Range("E1000").End(xlUp).Row + 1
         Cells(dernonvide, 5).Select
         ActiveSheet.Paste
    End Sub

    Lorsque j’exécute cette macros la sélection range("A2") se place bien à la dernière ligne non vide colonne B de ma base de donnée en F2.
    En revanche la sélection range("B2") se place à la dernière ligne non vide de la colonne E mais en décalé vers le bas par rapport à la dernière ligne non vide de la colonne B.

    Tout fonctionnait jusqu'à ce que je passe ma base de donnée en F2 sous format tableau.

    Je cherche donc à ce que mes colonnes de la F1 se collent en F2 les une à côté des autres sans décalage des lignes.

    J'espère que c'est plus clair.
    Merci
    Mathieu

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    bonsoir
    Pour simplement copier une ligne entière voilà une proposition :
    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
    Sub test()
    Dim j As Long
    Dim i As Long
    Dim k As Integer
    Application.ScreenUpdating = False
    With Sheets("F1")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    For k = 2 To i
        If .Cells(k, 1) <> "" Then
        j = Sheets("F2").Range("A" & Rows.Count).End(xlUp).Row + 1
        .Cells(k, 1).EntireRow.Copy
        Sheets("F2").Activate
        Sheets("F2").Range("A" & j).Select
        ActiveSheet.Paste
        End If
    Next k
    End With
    Application.ScreenUpdating = True
    End Sub
    Mais attention deux clic égal à copier deux fois et ainsi de suite donc il faut chercher un clé unique tel que le matricule employé pour éliminer les doublons
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  5. #5
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,

    Regardes le Edit dans ce post
    et vois comment c'est utilisé dans la discussion

    EDIT : maj dans le post suivant
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonsoir RyuAutodidacte,

    Pas de place pour les débutants dans ce forum à ce que je vois...

    Au revoir...

  7. #7
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bien sûr que si.
    Je ne sais pas où tu as vu cela ?? Pour l'instant dans les transports en commun, je ne peux pas faire mieux.
    Mais sache que si il y a des choses que tu ne comprends pas, on peux expliquer et donner des exemples, mais je ne donne pas du tout fait.
    Ce que je t'ai donné permet de copier en une seule fois les colonnes voulues et dans l'ordre que tu le souhaites.
    Au lieux de copier coller en plusieurs fois avec des select.
    Est ce bien ce que tu avais en tête ???

    Et jusqu'à preuve du contraire je ne vais pas faire du Excel avec mon téléphone

    Edit : je viens de me rendre compte que je me suis trompé de lien dans mon post précédent, c'était celui-ci plutôt, donnant à des fonctions que j'ai créé :
    https://www.developpez.net/forums/d1...e/#post9746320
    Voilà ce qui peut arriver en écrivant de son téléphone
    Donc se sont les codes dans l'Edit en rouge qui sont à voir

    Exemple :
    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)):    Next
        Next
        Index_Tab = VB
    End Function
     
    Sub exemple()
    VA = Sheets(1).Range("A1:C3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(2).Row
     
    VA = Index_Tab(VA, 1, 3, 1, 2)
     
    Sheets(1).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    End Sub
    A Adapter bien sûr …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  8. #8
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonsoir RyuAutodidacte,

    Merci pour ton message. Je pense que c'est en effet la solution à mon problème et un bon moyen de simplifier mon code.

    En revanche j'ai des difficultés à l'adapter à ma situation car était novice je ne maîtrise pas les variables et autres. C'est pourquoi mon code doit paraitre ultra basique mais reflète mon niveau...

    Aller j'y retourne essayer de décrypter ton code

    Merci
    Mathieu

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Comme le code donné n'est qu'un exemple, il faut prendre en compte les paramètres suivant pour faire ton code :
    - le pointage de la feuille source et de sa plage en utilisant la dernière ligne de ledit feuille
    - le pointage de la feuille de destination et la cellule de début pour la copie en utilisant la dernière ligne de ledit feuille

    VA est la création d'une variable tableau à 2 dimensions dont l'indice commence à 1.
    Donc quelque soit la plage visée, on ne tiendra pas compte des colonnes comme dans une plage (objet Range), mais de sa position dans la variable tableau.
    Ex : si dans la plage les colonnes C à G sont prises en compte, alors dans la variable tableau, la colonne C aura la position 1, D=>2, F=>3, etc…
    C'est sur cet aspect là que tu dois te concentré pour mettre l'ordre de tes colonnes.
    PS : Même si la plage contient plus de colonnes qu'il n'en faut, la copie ne se fera qu'avec les colonnes choisies et dans l'ordre choisi.

    Pour le reste c'est comme une formule mathématique , il y a juste à appliquer.
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  10. #10
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour les explications. J'ai fini par comprendre la mise en place de l'ordre des colonnes et j'ai mis avec succès en application dans mon fichier test.

    Je suis en train de l'appliquer à ma base de donnée et je suis confronté à une "erreur d'execution '9', l'indice n'appartien pas à la selection". Erreur que je n'avais pas sur mon fichier test.

    Ci-dessous mon code: l'erreur intervient au niveau de la partie surlignée en jaune.

    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)): Next
        Next
        Index_Tab = VB
    End Function
    
    Sub exemple()
    VA = Sheets(1).Range("A3:T11").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 13, 2, 5, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 26, 28, 29, 30, 32)
     
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    End Sub
    Autres questions:
    - Lorsqu'il est écrit "Sheet(1)", le 1 fait référence au 1er onglet où au nom donné à un onglet?
    - Dans Sub exemple (), Est-ce possible de ne pas donner une plage fixe (ex A3:T11")? Concrètement j'ai toujours le même nombre de colonnes mais pas le même nombre de lignes.

    Merci encore d'avance pour votre aide!
    Mathieu

  11. #11
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Autre question, lorsqu'il est écrit "Sheet(1)", le 1 fait référence au 1er onglet où au nom donné à un onglet?
    Cela fait référence au 1er onglet

    si on prends en compte les colonnes de A à T
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VA = Sheets(1).Range("A3:T11").Value
    on ne compte que 20 colonnes
    comment se fait-il que l'on trouve dans l'appel de la fonction les nombres (en rouge) :
    VA = Index_Tab(VA, 1, 13, 2, 5, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 26, 28, 29, 30, 32)
    l'erreur vient d'ici à mon avis =>on ne s'occupe seulement que de l'ordre des colonnes sources pour les faire correspondre aux colonnes de destination

    Edit : de plus, tu utilises la dernières lignes de la feuilles en 1è position sur la 2è feuille, ce qui n'est pas logique et source d'erreur
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row

    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Merci Ryu pour ce retour.

    Je fais donc une erreur de compréhension. Je me suis probablement mal expliqué dès le début c'est pour ça.

    J'ai dans ma feuille 1 20 colonnes de A à T. Le nombre de ligne à copier de cette feuille est variable
    Dans ma feuille 2, j'ai 33 colonnes de A à AG. Le nombre de ligne actuel est de 8709 lignes

    Mon objectif est de copier le contenu de certaines colonnes de la feuille 1 vers la Feuille 2 afin d'alimenter une base de donnée en format tableau.

    Exemple: Feuille 1 colonne 1 vers Feuille 2 colonne 13, puis feuille 1 colonne 2 vers Feuille 2 colonne 2...
    Le nombre de colonnes entre Feuille 1 et Feuille 2 est différent car il y a des colonnes qui se remplissent automatiquement en fonction de l'information que je colle en faisant appel à une fonction RECHERCHEV.

    Raison pour laquelle j'avais indiqué VA = Index_Tab(VA, 1, 13, 2, 5, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 26, 28, 29, 30, 32) en pensant que les colonnes correspondaient à celles de la Feuille de destination.

    Comment puis-je faire pour demander le contenu de certaines colonnes de la feuille 1 pour le coller à la suite de ma base de données, uniquement dans les colonnes que je souhaite?

    Voici comment celà dois se faire:

    pour simplifier: F1 = Feuille 1, F2 = Feuille 2, C = colonne

    F1C1 => F2C13
    F1C2 => F2C2
    F1C3 => F2C5
    F1C4 => F2C8
    F1C5 => F2C9
    F1C6 => F2C10
    F1C7 => F2C11
    F1C8 => F2C12
    F1C9 => F2C14
    F1C10 => F2C15
    F1C11 => F2C16
    F1C12 => F2C17
    F1C14 => F2C18
    F1C15 => F2C26
    F1C16 => F2C28
    F1C17 => F2C29
    F1C18 => F2C30
    F1C19 => F2C32

    J'espère que ma description est plus claire ainsi.

    Merci pour vos retours
    Mathieu

  13. #13
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    Bonsoir
    malgré une réponse passée invisible (post 3 ou 4) et malgré que j'arrive pas a comprendre ta requête !!
    et en attendant une explication voila ce que je propose : un exemple pour remplir la feuille F2 sur la base d'un tableau figurant en feuille F1 ( ici le clé unique c'est la valeur unique de la colonne A)
    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
    Sub Copycolonne()
    With Sheets("F1") ' la feuille source
     Tablo = .Range("A2", "E" & .Range("E" & .Rows.Count).End(xlUp).Row)
    End With
    With Sheets("F2") ' feuille destination
    For i = LBound(Tablo, 1) To UBound(Tablo, 1)
            For j = 5 To 100 'juste pour exemple
                 If .Cells(j, 1) = Tablo(i, 1) Then  ' ici si la valeur de la colonne F2 est égal à la valeur de la colonne A de la feuille F1
                    .Cells(j, 3) = Tablo(i, 3)
                    .Cells(j, 4) = Tablo(i, 4)
                    .Cells(j, 5) = Tablo(i, 5)
                    .Cells(j, 6) = Tablo(i, 6)
                 End If
            Next j
      Next i
    End Sub
    pour ta demande F1C1 => F2C13 : si tu veux dire F1C1 = F2C13 si non c'est le contraire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets("F1").cells(1,3) = sheets("F2").cells(13,3)
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  14. #14
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    En fait, ce n'est pas très clair, mais j'ai 'l’impression que toutes tes colonnes ne sont pas contiguës …

    A première vue, il faudrait s'y reprendre à plusieurs fois avec les colonnes contiguës, genre (concernant la feuille 2) :
    - 8, 9, 10, 11, 12
    -14, 15, 16, 17, 18
    - 28, 29, 30, 32
    puis colonne par colonne :
    - 13, 2, 5, 26

    je vais y jeter un oeil …

    Edit : en fait la colonne 13 de la feuille 2 fait partie du contiguës
    Correction :
    - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
    - 28, 29, 30, 32
    puis colonne par colonne :
    - 2, 5, 26
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  15. #15
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonsoir BENNASR,

    Désolé de ne pas avoir réagi avant sur ton poste.
    Je viens d'essayer avec ton code et il semble manquer un "End With". Je l'ai ajouté avant le End Sub.

    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
    Sub Copycolonne()
    With Sheets("F1") ' la feuille source
     Tablo = .Range("A2", "E" & .Range("E" & .Rows.Count).End(xlUp).Row)
    End With
    With Sheets("F2") ' feuille destination
    For i = LBound(Tablo, 1) To UBound(Tablo, 1)
            For j = 5 To 10 'juste pour exemple
                 If .Cells(j, 1) = Tablo(i, 1) Then  ' ici si la valeur de la colonne F2 est égal à la valeur de la colonne A de la feuille F1
                    .Cells(j, 3) = Tablo(i, 3)
                    .Cells(j, 4) = Tablo(i, 4)
                    .Cells(j, 5) = Tablo(i, 5)
                End If
            Next j
      Next i
    End With
    End Sub
    Lorsque je lance la macro rien ne se passe et pas de message d'erreur. Il semble que ça tourne en rond juste après "Next J" et ca reprends à "If .Cells(j, 1)". (D'après le débogage pas à pas".

    Merci pour ton aide
    Mathieu

  16. #16
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonsoir Ryu,

    Je pense que tu as raison avec cette histoire de colonnes contigües. Ci-dessous le code en fonction de tes dernières informations:


    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)): Next
        Next
        Index_Tab = VB
    End Function
    
    
    Sub exemple()
    
    'F1C2 = F2C2
    VA = Sheets(1).Range("B3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 2)
    
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    
    'F1C3 = F2C5
    VA = Sheets(1).Range("C3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 3)
    
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    
    'F1C4 à F1C14 = F2C8 à F2C18
    VA = Sheets(1).Range("D3:L3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14)
    
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    
    'F1C15 = F2C26
    VA = Sheets(1).Range("O3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 15)
    
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    
    'F1C16 à F1C19 = F2C28 à F2C32
    VA = Sheets(1).Range("P3:S3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
     
    VA = Index_Tab(VA, 1, 16, 17, 18, 19)
    
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA
    
    End Sub
    Pour le moment ça ne fonctionne pas... Le "ReDim" au début est surligné en jaune. De plus je pense dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VA = Sheets(1).Range("D3:L3").Value
    ,
    la sélection n'est pas conforme mais je ne sais pas comment l'écrire pour prendre toutes les cellules de chacune des colonnes (du genre "End(xlUp)").

  17. #17
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,

    Déjà pour composer ton code, il faut :

    Etape 1 :
    1 - déterminer la dernière ligne de la Feuille 1
    2 - en reprenant la valeur de la dernière ligne, on détermine la plage en Feuille 1
    2 bis -on peut créer directement la variable tableau à partir de la plage que l'on détermine en feuille 1
    3 - à partir de la fonction on créer la variable tableau en mettant dans l'ordre les colonnes (que l'on veut) de la feuille 1 en rapport à la feuille2
    Ce qui donne avec ton interprétation :

    F1C2 F2C2
    F1C3 F2C5
    F1C4 F2C8
    F1C5 F2C9
    F1C6 F2C10
    F1C7 F2C11
    F1C8 F2C12
    F1C1 F2C13
    F1C9 F2C14
    F1C10 F2C15
    F1C11 F2C16
    F1C12 F2C17
    F1C14 F2C18
    F1C15 F2C26
    F1C16 F2C28
    F1C17 F2C29
    F1C18 F2C30
    F1C19 F2C32

    et par conséquent si toutes les colonnes étaient contiguës:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     VB = Index_Tab(VA, 1, 2, 3, 4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19)
    Etape 2 :
    1 - déterminer la dernière ligne de la Feuille 2

    Voici la manières dont j'interprète les correspondances :

    COLONNE FEUIL1 2 3 4 5 6 7 8 1 9 10 11 12 14 15 16 17 18 19
    COLONNE FEUIL2 2
    non
    contiguë
    5
    non
    contiguë
    8 9 10 11 12 13 14 15 16 17 18 26
    non
    contiguë
    28 29 30 32
    non
    contiguë

    VB = Index_Tab(VA, 1, 2) => Sheets(2).Cells(DL_Feuil2 ,2).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    VB = Index_Tab(VA, 1, 3) => Sheets(2).Cells(DL_Feuil2,5).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    VB = Index_Tab(VA, 1,4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14) => Sheets(2).Cells(DL_Feuil2,8).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    VB = Index_Tab(VA, 1, 15) => Sheets(2).Cells(DL_Feuil2,15).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    VB = Index_Tab(VA, 1, 16, 17, 18) => Sheets(2).Cells(DL_Feuil2,16).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    VB = Index_Tab(VA, 1, 19) => Sheets(2).Cells(DL_Feuil2,32).Resize(UBound(VB), UBound(VB, 2)).Value = VB

    il va de soit que l'on pourrait le faire en plusieurs fois vu ton niveau, mais c'est pas l'idéal dans l'absolu (chaque chose en son temps)

    PS :
    tu devrais lire ce sujet même si il ne correspond pas à ton pb, mais il apporte tout un tas de conseils et d'information qui te permettrait de progresser

    Question : que contiennent les autres colonnes dans la feuilles 2 qui ne sont pas concernées par la copie ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  18. #18
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour Ryu,

    Merci pour ton retour. Très intéressant le lien que tu m'as conseillé! Ce qui m'amène peut-être tardivement à t'expliquer de manière plus en détail mon projet:

    4 onglets:

    1er: "SAP EXTRACT" = base de donnée extraite du logiciel SAP organisé comme suit:

    A: type de document
    B: H Mondial Nom
    C: H Région Nom
    D: Vendu à Nom
    E: Livré à Nom
    F: Lieu de livraison
    G: Facturé à Nom
    H: N° Document
    I: N° Facture
    J: Crée le
    K: Date livraison souhaité
    L: Date livraison
    M: Statut
    N: Ingrédient
    O: Désignation
    P: Quantité livrée
    Q: Quantité à livrer
    R: Quantité d'ordre
    S: Prix net
    T: Valeur nette

    2ème onglet: "BDD FACTURE": Cet onglet me sers de base de donnée avec un historique de 2 ans de commandes (format tableau).
    Pour le mettre à jour je souhaite récupérer les données de certaines colonnes de l'onglet 1 et les coller à la suite dans l'onglet 2 sans perdre mon historique. J'intercale des colonnes dans cet onglet car les informations extraites de SAP ne sont pas suffisantes.
    J'utilise des formules "RECHERCHEV" pour que les colonnes intercalées se remplissent automatiquement en fonction du contenu des cellules des colonnes de l'onglet 1. Pour se faire j'ai un 3ème onglet que j'ai appelé "MATRICES" dans lequel figure des tableaux qui servent à alimenter ma RECHERCHEV.

    L'onglet 2 est constitué comme suit: (en gras les colonnes de l'onglet 1, le reste les colonnes qui se remplissent automatiquement avec RECHERCHEV)

    A: Région
    B: H Mondial Nom
    C: Groupement Négociation
    D: Responsable groupement
    E: H Régional Nom
    F: Membre groupement Négociation
    G: Responsable client
    H: Vendu à Nom
    I: Livré à Nom
    J:Lieu de livraison
    K:Facturé à Nom
    L: N°Document
    M: Type de document
    N: N°Facture
    O: Crée le
    P: Date livraison souhaité
    Q: Date de livraison
    R:Statut
    S:Campagne
    T:Trimestres
    U: Mois de facturation
    V: Culture
    W: Campagne produit
    X: Famille
    Y: Composition
    Z: Désignation
    AA: Produit
    AB:Quantité livré
    AC: Quantité à livrer
    AD: Quantité d'ordre
    AE: Quantité facturé
    AF: Prix facturé
    AG: CA facturé

    Cet onglet "BDD FACTURE" me sers d'intermédiaire. Il me permet d'alimenter ma base historique et y ajouter automatiquement des informations complémentaires avec les RECHERCHEV.
    J'ai un 4ème et dernier onglet "BDD FINAL" dans lequel je vais cette fois copier certaines colonnes de l'onglet "BDD FACTURE". C'est une sorte de synthèse où ne figure pas de formules, pas certaines colonnes, que je vais pouvoir facilement envoyer à mes collègues. Plus facile à partager par mail que le fichier complet.

    Je crois que c'est difficile de faire plus explicite

    Pour faire suite à ton dernier message Ryu, voici ce que j'ai fait:

    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)): Next
        Next
        Index_Tab = VB
    End Function
     
    Sub exemple()
     
    VA = Sheets(1).Range("B3").Value 'détermine la dernière ligne de la feuille 1
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row 'détermine la plage de la feuille 1
    VB = Index_Tab(VA, 1, 2) >= Sheets(2).Cells(DL_Feuil2, 2).Resize(UBound(VB), UBound(VB, 2)).Value = VB 'variable tableau en mettant dans l'ordre les colonnes de la feuille 1 en rapport à la feuille2
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 2)).Value = VA 'déterminer la dernière ligne de la Feuille 2
     
    VA = Sheets(1).Range("C3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
    VB = Index_Tab(VA, 1, 3) >= Sheets(2).Cells(DL_Feuil2, 5).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 5)).Value = VA
     
    VA = Sheets(1).Range("A3:M3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
    VB = Index_Tab(VA, 1, 4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14) >= Sheets(2).Cells(DL_Feuil2, 8).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 8)).Value = VA
     
    VA = Sheets(1).Range("O3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
    VB = Index_Tab(VA, 1, 15) >= Sheets(2).Cells(DL_Feuil2, 15).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 15)).Value = VA
     
    VA = Sheets(1).Range("P3:R3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
    VB = Index_Tab(VA, 1, 16, 17, 18) >= Sheets(2).Cells(DL_Feuil2, 16).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 16)).Value = VA
     
    VA = Sheets(1).Range("S3").Value
    DL = Sheets(1).Cells(Rows.Count, 1).End(xlUp)(1).Row
    VB = Index_Tab(VA, 1, 19) >= Sheets(2).Cells(DL_Feuil2, 32).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    Sheets(2).Range("A" & DL).Resize(UBound(VA), UBound(VA, 32)).Value = VA
    End Sub
    C'est pas encore ca... le ReDim s'affiche toujours en jaune quand je lance la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
    Ah oui, je n'ai pas besoin de copier les Entêtes.

    Pas simple tout ça mais très intéressant!

    Merci
    Mathieu

  19. #19
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    bonjour,

    Dans mon post précédent, les lignes de codes ne sont là que pour montrer la correspondance/vers quoi cela mène, mais est en aucun cas un code construit aboutit,
    mis entre les balises [Code].

    Le lien fourni est là afin de te fournir tout le nécessaire afin de combler tes lacunes (pour une meilleure compréhension),
    grâce aux conseils et liens fournis que l'on trouve dans cette discussion (que l'on peut voir dès la 1ère page de celle-ci)

    Concernant ton code, on voit bien que tu as du mal à comprendre, car dès les 1ère lignes (mis à part ma fonction), la façon de faire est fausse car :
    - La plage n'est pas définie
    - du code recopier sans se demander si c'est la bonne démarche où si l'on ne commet pas une erreur
    - DL répéter x fois. Pourquoi ?

    je ne suis pas aller au bout !
    Donc il est important que tu maitrise les bases avec des petits tests (et ne pas faire de bricolage) en utilisant les ressources données dans le lien de mon précédent post !

    Ne sachant pas quel sont les colonnes sur lesquelles on doit se baser pour les dernières lignes en Feuille 1 et 2 je me suis basé sur les colonnes A.

    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)):    Next
        Next
        Index_Tab = VB
    End Function
     
    Sub Exemple()
    Dim DL_F1 As Long, DL_F2 As Long, VA As Variant, VB As Variant
     
        DL_F1 = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
        VA = Sheets(1).Range("A3:T" & DL_F1).Value
     
        DL_F2 = Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row
     
    Application.ScreenUpdating = False
     
        VB = Index_Tab(VA, 1, 2)
        Sheets(2).Cells(DL_F2, 2).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 3)
        Sheets(2).Cells(DL_F2, 5).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14)
        Sheets(2).Cells(DL_F2, 8).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 15)
        Sheets(2).Cells(DL_F2, 15).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 16, 17, 18)
        Sheets(2).Cells(DL_F2, 16).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 19)
        Sheets(2).Cells(DL_F2, 32).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
    Application.ScreenUpdating = True
     
    End Sub
    PS : j'ai fait le code à la volé j'ai pas vérifié, dis moi ce qu'il en est …
    tu pourras y ajouter les commentaires …

    Mis à part pour ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        VB = Index_Tab(VA, 1, 4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14)
        Sheets(2).Cells(DL_F2, 8).Resize(UBound(VB), UBound(VB, 2)).Value = VB
    on aurait bien pu passer par de simple copie de plages

    Edit : en effet, je suis d'accord avec toi ce n'est pas simple quand l'on débute, et cela demande pas mal de travail au début mais une fois l'effort fait,
    cela devient plus simple.

    la base :
    http://silkyroad.developpez.com/VBA/LesVariables/
    https://msdn.microsoft.com/fr-fr/vba...property-excel
    https://msdn.microsoft.com/fr-fr/vba...e-object-excel
    https://www.developpez.net/forums/d5...e-range-cells/
    http://silkyroad.developpez.com/VBA/FeuilleDeCalcul/

    après :
    http://silkyroad.developpez.com/vba/tableaux/
    http://didier-gonard.developpez.com/...s-tableau-vba/
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  20. #20
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Re Ryu,

    Tout fonctionne comme sur des roulettes !!!
    J'ai apporté les quelques modifs pour les correspondances entre F1 et F2 et ca fonctionne bien. Les colonnes avec fonctions RECHERCHEV fonctionnent elles aussi

    Le code:

    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
    Function Index_Tab(VA As Variant, Entete As Byte, ParamArray Arr()) 'Les paramètres : 1-Variable tableau, 2-Entete (afin de la supprimer ou pas), 3-Array (colonne voulu de la variable tableau, ex : 4, 7, 9)
    Dim VB(), i&, j&
        ReDim VB(1 To UBound(VA) - Entete + 1, 1 To UBound(Arr) + 1)
        For i = Entete To UBound(VA)
            For j = 1 To UBound(Arr) + 1:    VB(i - Entete + 1, j) = VA(i, Arr(j - 1)):    Next
        Next
        Index_Tab = VB
    End Function
     
    Sub BDDFACTURE()
    Dim DL_F1 As Long, DL_F2 As Long, VA As Variant, VB As Variant
     
        DL_F1 = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
        VA = Sheets(1).Range("A3:T" & DL_F1).Value
     
        DL_F2 = Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row
     
    Application.ScreenUpdating = False
     
        VB = Index_Tab(VA, 1, 2)
        Sheets(2).Cells(DL_F2, 2).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 3)
        Sheets(2).Cells(DL_F2, 5).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 4, 5, 6, 7, 8, 1, 9, 10, 11, 12, 14)
        Sheets(2).Cells(DL_F2, 8).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 15)
        Sheets(2).Cells(DL_F2, 26).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 16, 17, 18)
        Sheets(2).Cells(DL_F2, 28).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
        VB = Index_Tab(VA, 1, 19)
        Sheets(2).Cells(DL_F2, 32).Resize(UBound(VB), UBound(VB, 2)).Value = VB
     
    Application.ScreenUpdating = True
     
    'Efface le contenu de la feuille "SAP EXTRACT"
     
    Sheets("SAP EXTRACT").Select
    Rows("2:20000").Select
    Selection.Delete Shift:=xlUp
    Range("A2").Select
     
    End Sub
    J'ai même ajouté à la fin quelques lignes pour faire disparaitre les le contenu des colonnes de la F1 une fois quelles sont collées dans la F2 (pas de risque de doublons).

    En ce qui concerne l'onglet BDD FINAL (la synthèse), j'ai fais le code suivant:

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    Sub BDDFINAL()
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("A2", ActiveSheet.Range("A2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("A2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("D2", ActiveSheet.Range("D2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("B2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("G2", ActiveSheet.Range("G2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("C2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("C2", ActiveSheet.Range("D2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("D2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("F2", ActiveSheet.Range("F2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("E2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("L2", ActiveSheet.Range("L2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("F2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("N2", ActiveSheet.Range("N2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("G2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("O2", ActiveSheet.Range("O2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("H2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("P2", ActiveSheet.Range("P2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("I2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("Q2", ActiveSheet.Range("Q2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("J2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("S2", ActiveSheet.Range("S2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("K2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("T2", ActiveSheet.Range("T2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("L2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("U2", ActiveSheet.Range("U2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("M2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("V2", ActiveSheet.Range("V2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("N2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("W2", ActiveSheet.Range("W2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("O2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("X2", ActiveSheet.Range("X2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("P2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("Y2", ActiveSheet.Range("Y2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("Q2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("AA2", ActiveSheet.Range("AA2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("R2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("AC2", ActiveSheet.Range("AC2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("S2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("AE2", ActiveSheet.Range("AE2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("T2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("AF2", ActiveSheet.Range("AF2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("U2").Select
    ActiveSheet.Paste Link:=True
     
    Sheets("BDD FACTURE").Select
    ActiveSheet.Range("AG2", ActiveSheet.Range("AG2").End(xlDown)).Select
    Selection.Copy
    Sheets("BDD FINAL").Select
    Range("V2").Select
    ActiveSheet.Paste Link:=True
     
    End Sub
    Alors OUI, c'est basique... probablement simplifiable aussi. Au moins celui-ci je le comprends

    En tout cas Ryu merci beaucoup pour ton aide! Le temps que tu as consacré à mon cas ainsi que les conseils!
    Je me rends compte que j'ai du boulot pour maitriser les bases et tu m'as donné des outils pour que je progresse.

    MERCI!

    Mathieu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème Copier Coller Colonne VBA
    Par Thomas A dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/04/2016, 17h56
  2. [WD-2007] Problème copier/coller texte et mise en forme
    Par fubuntu dans le forum Word
    Réponses: 4
    Dernier message: 29/01/2014, 10h09
  3. copier-coller colonne sans mise en forme
    Par dandy87 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/12/2010, 14h43
  4. [Joomla!] Créer une table et l'afficher dans Joomla sous forme de tableau
    Par sago974 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 23/02/2009, 16h34
  5. Réponses: 2
    Dernier message: 31/03/2006, 11h29

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