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 :

Copier la ligne du dessous [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 156
    Par défaut Copier la ligne du dessous
    Bonjour,

    J'ai fais le code ci dessous pour synthétiser une liste de matériel.
    Sur la feuille "liste de matériel" j'indique une quantité devant la désignation souhaité.
    Le but est de récupérer sur la feuille "FT" une synthèse de la liste. Simplement la qté et la désignation des matériels pour lesquels une quantité à été indiquée.
    Le code recopie les désignations et quantités <>""
    Mon problème est que le "Offset(i)" place la désignation et la qté sur le même n° de ligne que dans la feuille "liste de matériel".
    J'obtiens une liste avec des lignes vides.
    Hors j'aimerai que les lignes à reporter se succèdent l'une en dessous des autres.

    Il y a un certainement un truc du genre n=n+1 à faire mais je bute sur ce point.

    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
    Private Sub Worksheet_Activate()
     
     
    'recopier la liste de matériels
     
    Application.ScreenUpdating = False
     
    Dim i As Integer
     
     
     
    For i = 1 To 50
     
     
     
    If Sheets("Liste de matériels").Range("D2").Offset(i).Value <> "" Then
     
     
     
    Sheets("FT").Range("A2").Offset(i).Value = Sheets("Liste de matériels").Range("D2").Offset(i).Value
    Sheets("FT").Range("B2").Offset(i).Value = Sheets("Liste de matériels").Range("B2").Offset(i).Value
     
     
     
     
     
    End If
     
     
    Next i
     
    End Sub

  2. #2
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    bonjour,

    Le offset marche comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offset(nb de ligne, nb de colonne)
    de ce fait pour aller au dessous et non pas a coté il faut écrire:


  3. #3
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    @bboy-eazy : Euh non... justement, on veut se décaler d'une ligne et offset(nb de ligne, nb de colonne), donc pour lire la valeur d'en-dessous, on fait bien Offset(i, 0) ou Offset(i).
    @Walt51 : tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("FT").Range("A2").Offset(i).Value = Sheets("Liste de matériels").Range("D2").Offset(i).Value
    Tu mets le même offset sur la feuille FT et sur la feuille liste de matériels. Donc forcément, ça copie sur la même ligne...
    1. Plutôt que d'utiliser Offset, pourquoi ne travailles-tu pas directement sur les lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Activate() 
        Application.ScreenUpdating = False
        Dim i As Integer
        For i = 2 To 51
            If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
                Sheets("FT").Range("A" & i).Value = Sheets("Liste de matériels").Range("D" & i).Value
                Sheets("FT").Range("B" & i).Value = Sheets("Liste de matériels").Range("B" & i).Value
           End If
        Next i
    End Sub
    Première petite remarque, mais là, tu auras toujours le même problème ...
    2. Tu utilises le même indice pour les deux feuilles, or si une cellule est vide en "Liste matériel", elle ne va pas être recopiée en "FT", donc, à ce moment-là, tu dois passer à la prochaine ligne en "Liste matériel", mais pas en "FT". Utilise 2 variables : i l'indice de la boucle For et j une variable que tu incrémentes seulement quand tu fais une copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Activate() 
        Application.ScreenUpdating = False
        Dim i As Integer
        Dim j As Integer
        j = 2
        For i = 2 To 51
            If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
                Sheets("FT").Range("A" & j).Value = Sheets("Liste de matériels").Range("D" & i).Value
                Sheets("FT").Range("B" & j).Value = Sheets("Liste de matériels").Range("B" & i).Value
                j = j + 1     'j est incrémenté seulement lorsqu'on fait une copie.
           End If
        Next i
    End Sub
    3. Il y a plus efficace qu'une boucle pour faire cela. Tu peux utiliser AutoFilter et faire un copier-coller. AutoFilter te permet d'imposer une filtre sur tes données (dans ton cas <>""). Ensuite en faisant un copier-coller, tu copies les données issues du filtrage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Activate()
        With Sheets("Liste de matériels")
            .Range("A2:D50").AutoFilter Field:=4, Criteria1:="<>"
            .Range("B2:B50").Copy destination:=Sheets("FT").Range("B2")
            .Range("D2:D50").Copy destination:=Sheets("FT").Range("A2")
        End With
    End Sub
    C'est plus rapide qu'une boucle.
    Est-ce que tu comprends la méthode ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 156
    Par défaut
    Citation Envoyé par riaolle Voir le message
    Bonjour,
    @bboy-eazy : Euh non... justement, on veut se décaler d'une ligne et offset(nb de ligne, nb de colonne), donc pour lire la valeur d'en-dessous, on fait bien Offset(i, 0) ou Offset(i).
    @Walt51 : tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("FT").Range("A2").Offset(i).Value = Sheets("Liste de matériels").Range("D2").Offset(i).Value
    Tu mets le même offset sur la feuille FT et sur la feuille liste de matériels. Donc forcément, ça copie sur la même ligne...
    1. Plutôt que d'utiliser Offset, pourquoi ne travailles-tu pas directement sur les lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Activate() 
        Application.ScreenUpdating = False
        Dim i As Integer
        For i = 2 To 51
            If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
                Sheets("FT").Range("A" & i).Value = Sheets("Liste de matériels").Range("D" & i).Value
                Sheets("FT").Range("B" & i).Value = Sheets("Liste de matériels").Range("B" & i).Value
           End If
        Next i
    End Sub
    Première petite remarque, mais là, tu auras toujours le même problème ...
    2. Tu utilises le même indice pour les deux feuilles, or si une cellule est vide en "Liste matériel", elle ne va pas être recopiée en "FT", donc, à ce moment-là, tu dois passer à la prochaine ligne en "Liste matériel", mais pas en "FT". Utilise 2 variables : i l'indice de la boucle For et j une variable que tu incrémentes seulement quand tu fais une copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Activate() 
        Application.ScreenUpdating = False
        Dim i As Integer
        Dim j As Integer
        j = 2
        For i = 2 To 51
            If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
                Sheets("FT").Range("A" & j).Value = Sheets("Liste de matériels").Range("D" & i).Value
                Sheets("FT").Range("B" & j).Value = Sheets("Liste de matériels").Range("B" & i).Value
                j = j + 1     'j est incrémenté seulement lorsqu'on fait une copie.
           End If
        Next i
    End Sub
    3. Il y a plus efficace qu'une boucle pour faire cela. Tu peux utiliser AutoFilter et faire un copier-coller. AutoFilter te permet d'imposer une filtre sur tes données (dans ton cas <>""). Ensuite en faisant un copier-coller, tu copies les données issues du filtrage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Activate()
        With Sheets("Liste de matériels")
            .Range("A2:D50").AutoFilter Field:=4, Criteria1:="<>"
            .Range("B2:B50").Copy destination:=Sheets("FT").Range("B2")
            .Range("D2:D50").Copy destination:=Sheets("FT").Range("A2")
        End With
    End Sub
    C'est plus rapide qu'une boucle.
    Est-ce que tu comprends la méthode ?
    Merci pour cette réponse très compléte.

    de mon coté, en me cresant la tête, je suis arrivé à ç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
    Private Sub Worksheet_Activate()
     
     
    'recopier la liste de matériels
     
    'Application.ScreenUpdating = False
     
    Dim i As Integer
    Dim n As Integer
     
     
     
     
    For i = 1 To 51
     
     
        If Sheets("Liste de matériels").Range("D2").Offset(i).Value <> "" Then
     
        n = n + 1
            Sheets("FT").Range("A2").Offset(n).Value = Sheets("Liste de matériels").Range("D2").Offset(i).Value 'copie qté
            Sheets("FT").Range("B2").Offset(n).Value = Sheets("Liste de matériels").Range("B2").Offset(i).Value 'copie désignation
     
        End If
     
    Next i
     
     
     
    End Sub
    Ça ressemble à ce que tu as écris, à la différence que le n=n+1 n'est pas au même endroit.
    Quelle conséquence?

    Pour la proposition du filtre ça ne marche pas chez moi car je pense que ma mise en forme "Insérer => Tableau" ne permet pas de filtrer de cette façon.

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Ça ressemble à ce que tu as écris, à la différence que le n=n+1 n'est pas au même endroit.
    Quelle conséquence?
    Si j'intialise avec n=1, alors tu devras intialiser avec n=0, car tu effectues le +1 avant de coller dans la ligne n.
    Pour la proposition du filtre ça ne marche pas chez moi car je pense que ma mise en forme "Insérer => Tableau" ne permet pas de filtrer de cette façon.
    Tu peux donc utiliser les propriétés du tableau. Utilise l'enregistreur de macro pour savoir quel est le code pour filtrer dans un tableau.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 156
    Par défaut
    Citation Envoyé par riaolle Voir le message
    Si j'intialise avec n=1, alors tu devras intialiser avec n=0, car tu effectues le +1 avant de coller dans la ligne n.

    Tu peux donc utiliser les propriétés du tableau. Utilise l'enregistreur de macro pour savoir quel est le code pour filtrer dans un tableau.
    Ok merci, finalement ça donne ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With Sheets("Liste de matériels")
            .ListObjects("Tableau2").Range.AutoFilter Field:=4, Criteria1:="<>" 'filtrer les non vides
            .Range("B2:B50").Copy Destination:=Sheets("FT").Range("B2")
            .Range("D2:D50").Copy Destination:=Sheets("FT").Range("A2")
            .Range("C2:C50").Copy Destination:=Sheets("FT").Range("C2")
            .ListObjects("Tableau2").Range.AutoFilter Field:=4 'Enlever le filtre
    End With

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

Discussions similaires

  1. [XL-2007] copier la ligne les une en dessous des autres
    Par pilounet54 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/03/2012, 14h20
  2. copier des lignes excel
    Par deathsurfer dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/01/2006, 10h39
  3. language SQL - Copier une ligne dans autre table
    Par fxd dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/10/2005, 18h16
  4. Copier des lignes d'une table
    Par thomas_strass dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 01/07/2005, 15h42
  5. copier une ligne dans une autre table
    Par BoeufBrocoli dans le forum SQL
    Réponses: 5
    Dernier message: 24/10/2003, 22h59

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