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 :

Copie données dans plage variable


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Copie données dans plage variable
    Bonjour à tous !

    Je suis nouveau sur le forum car j'ai besoin d'un petit coup de pouce de votre part
    Je suis également novice en VBA que je pratique depuis peu pour mes fonctions pro'. (export données, envoi de rapports excel mail ...)

    Le principe de mon développement en cours est de copier des données d'un fichier vers l'autre pour en réaliser une sauvegarde.
    Le second fichier compilera les données "à la suite" jour après jour.

    Quelques soucis apparaissent lorsqu'il s'agit de copier un champs unique sur une plage de cellule variable.
    Je m'explique.

    Je copie une fois une date en A1.
    Dans la colonne B, j'ai une série de données qui est variable en fonction des jours et représente des productions (2-4-10-25 lignes).

    Pour réaliser les synthèses, j'ai besoin de me référer à la donnée de la colonne A (Y produits par jour). Manuellement, je réaliserai un copier collé jusqu'à la dernière ligne pleine de la colonne B.
    C'est cette opération que je n'arrive pas à traduire en VBA...

    Dans mon approche, l'idée est de :
    - Chercher la dernière ligne pleine de la colonne B
    - Copier la valeur de A1
    - La coller de A1 à Axxx en fonction du nombre de cellule précédemment importé en B.

    Pourriez-vous m'aider sur ce point ?

    En espérant avoir pu être clair...

    Merci par avance !

    Nissaij

  2. #2
    Membre éprouvé
    Bonjour,

    Belle approche, tu pourrais faire ces manipulations en utilisant l'enregistreur de macro.

    Ça te donnerai déjà une bonne partie du code final.

  3. #3
    Futur Membre du Club
    Bonjour,

    Je viens de tester et découvrir la fonction "AutoFill".

    Ici j'ai besoin de compléter de A6 à A14 (car mon tableau descend jusque B14) avec la valeur de A6.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     Selection.AutoFill Destination:=Range("A6:A14"), Type:=xlFillCopy


    Le soucis se pose pour la sélection de la zone à remplir (A6:A14).
    Ici, c'est manuel et simple, mais comment faire pour que ce soir la macro qui choisisse automatiquement cette zone ...

    Autant je maîtrise la sélection de champs "manuelle", mais automatiquement avec des xldown, xlup etc, ça devient compliqué ...

    Merci,

    Nissaij

  4. #4
    Futur Membre du Club
    Bonjour à tous,

    Après quelques temps de congés (il faut bien ), je reprend le développement de mon fichier de compilation.

    J'ai toujours des soucis pour réaliser cette macro afin de copier la valeur de la cellule automatiquement en vis à vis de la dernière ligne occupée...

    Pourriez-vous éclairer ma lanterne ?

    En vous remerciant.

    Cordialement,

    Nissaij

  5. #5
    Membre éprouvé
    Hello,

    Power query fait très bien ce genre de manipulation sans aucune ligne de code ( option fill Down).

    Sinon en vba, sans l'utilisation de Tableaux structurés pourtant plus que recommandable en 2020.

    Le code devrait donner ( sur mobile donc non testé)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub FillDown() 
     
    Dim lastRow As Long
     
        With Worksheets("Nom De Ta Feuille") 
            lastRow = .Cells(Rows.Count, "B").End(xlUp).Row  'on récupère la dernière cellule remplie de col B
            .Range("A2:A" & lastRow).value = .Range("A1").value
        End With
     
    End sub

  6. #6
    Futur Membre du Club
    Bonjour mfoxy,

    Merci d'avoir prit le temps de me répondre.

    La macro n'est pas tout à fait exacte, c'est un bon début qui m'a déjà aidé.

    Je met un fichier d'exemple à dispo pour mieux expliquer ma problématique.



    Pourrais-tu m'aider à finaliser stp ?

    Merci !

  7. #7
    Responsable
    Office & Excel

    Salut

    Quelque chose du genre?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub FillDown()
      Dim RowA As Long
      Dim RowB As Long
     
      RowA = Range("a1048576").End(xlUp).Row
      RowB = Range("b1048576").End(xlUp).Row
      Range("a" & RowA & ":a" & RowB).Value = Range("a" & RowA).Value
    End Sub


    Après, on peut optimiser sur le nom des colonnes, tableau structuré ou autre, mais voyons d'abord si on a compris ton problème...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Futur Membre du Club
    Salut Pierre,

    C'est parfait !

    Je ne suis pas sur de comprendre entièrement le code, surtout sur la phase : "Range("a" & RowA & ":a" & RowB).Value "
    Pour ma culture, pourrais-tu apporter quelques commentaires pour que je comprenne comment ça fonctionne ?

    Dernière question :
    Si ce n'est pas uniquement la colonne B qui donne la dernière ligne pleine, mais que ça puisse être variable entre les colonnes B, C et D, comment intégrer cette nuance ?

    Encore merci !

    Nissaij

  9. #9
    Responsable
    Office & Excel

    L'idée:
    • On repère la dernière ligne utilisée en A;
    • On repère la dernière ligne utilisée en B;
    • On peut donc disposer d'une plage qui va, en colonne A, de la dernière utilisée en A à la dernière utilisée en B;
    • On copie la valeur de la dernière ligne de A sur cette plage.



    • RowA = Range("a1048576").End(xlUp).Row : on repère la dernière ligne utilisée en A (un peu comme si on se mettait en A1048576 et qu'on faisait CTRL+FLECHE HAUT dans Excel;
    • RowB = Range("b1048576").End(xlUp).Row : Idem pour B;



    On dispose de ces deux variables, grâce auxquelles on recompose la plage en A en concaténant (collant) les parties de texte les unes derrière les autres (comme on le ferait en Excel): Range("a" & RowA & ":a" & RowB).

    Après, le copier-collage spécial valeurs peut s'effectuer en une opération en collant sur une plage les valeurs d'une autre. C'est efficace lorsque la plage source contient une cellule ou le même nombre de cellule que la plage d'arrivée. Dans le code qui suit, la plage d'arrivée est à gauche du signe = et contient normalement plusieurs lignes, et reçoit la valeur de la plage source qui est la dernière valeur saisie en A, un peu comme si tu sélectionnais une plage, que tu saisissais une valeur dans sa première cellule et que tu validais avec CTRL+ENTER: Range("a" & RowA & ":a" & RowB).Value = Range("a" & RowA).Value.

    Avec ton fichier, colonnes A et B:
    • RowA vaudra 5;
    • RowB vaudra 10;
    • Range("a" & RowA & ":a" & RowB) pointera donc vers A5:A10
    • Range("a" & RowA) pointera vers A5;
    • Range("a" & RowA & ":a" & RowB).Value = Range("a" & RowA).Value transfère donc la valeur de A5 sur A5:A10


    Citation Envoyé par Nissaij Voir le message
    [...]
    Dernière question :
    Si ce n'est pas uniquement la colonne B qui donne la dernière ligne pleine, mais que ça puisse être variable entre les colonnes B, C et D, comment intégrer cette nuance ?[...]
    il faut en dire plus, et peut-être coller une image du classeur avec la vraie situation rencontrée en détaillant ton besoin
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Futur Membre du Club
    Bonjour Pierre,

    Merci pour ces précisions, je comprends mieux ainsi !

    Pour la suite, voici le fichier.

    La quantité de données peut varier d'un jour à l'autre et chaque colonne peut donner "la marque de fin" pour copier la date.
    Il faudra copier le contenu de la dernière date en fonction, soit de la colonne "Référence","Autre" ou "Bidule". (les titres sont indicatifs).
    La macro doit pouvoir choisir entre plusieurs colonnes pour déterminer la fin de zone.

    J'espère être clair ...

    Merci par avance,

    Nissaij

  11. #11
    Membre habitué
    Hello,

    Petite remarque par rapport à la structure de ton fichier: tu sembles ajouter de nouveaux jours en colonne et non en ligne.
    Sur ton exemple c'est lisible car tu n'as que trois jours, mais cela risque de devenir plus compliqué à lire au bout d'une centaine de jour...


    Cela dit, si tu tiens à construire le fichier comme cela il va falloir variabiliser ta zone à la fois à l'horizontale (du bas du fichier vers le haut) mais également à la verticale (de la droite du fichier vers la gauche).

    Tu peux te tourner vers une formule similaire à celle proposée par @Pierre Fauconnier : DColonne= Range("AAA1").end(XlLeft).column

    Bon courage !

  12. #12
    Futur Membre du Club
    Hello,

    (Edit)

    Effectivement je compile les données du jour en colonne pour l'exemple.

    L'idée est de créer une base de données pour les traiter en ligne avec un TCD par la suite.


    Tu as bien compris mon problème, il s'agit de variabilité horizontale et verticale pour trouver une plage où copier la date.
    Je vais essayer de compléter la proposition de Pierre (je ne garantie rien ).

    - Je dois chercher la dernière ligne pleine en A.
    - Chercher quelle est la colonne la plus pleine entre plusieurs (B, C, D, E, ...).
    - Déterminer la dernière ligne pleine de cette colonne.
    - Déterminer la plage à compléter.
    - Copier la valeur la dernière ligne pleine en A dans cette plage.

    Je vous ferrai un feedback de mon avancée.

    Merci !

    Nissaij

  13. #13
    Futur Membre du Club
    Re-bonjour à tous,

    Je reviens vers vous avec l'avancée sur le code.
    Ça fonctionne pour mon application !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub FillDown()
      Dim RowA As Long
      Dim DerniereCelluleRemplie As Long
     
      RowA = Range("a1048576").End(xlUp).Row
      DerniereCelluleRemplie = Columns("A<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
      Range("a" & RowA & ":a" & DerniereCelluleRemplie).Value = Range("a" & RowA).Value
     
    End Sub


    La démarche est de chercher la dernière cellule remplie dans une plage (A:D), garder le numéro de ligne et compiler selon le code proposé par @Pierre Fauconnier.

    J'ai un peu cherché sur d'autres forums et regroupé les infos.

    Je vous remercie tous pour votre aide : mfoxy, Pierre Fauconnier, Mickamax !

    Je pense vous solliciter pour d'autres problématiques

    A bientôt !

    Nissaij

###raw>template_hook.ano_emploi###