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 :

Copie données dans plage variable [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut 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 Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut
    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 Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    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
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut
    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.

    Exemple copie date.xlsx

    Pourrais-tu m'aider à finaliser stp ?

    Merci !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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 billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    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
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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 billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    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
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2020
    Messages : 20
    Par défaut
    Bonjour Pierre,

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

    Pour la suite, voici le fichier. Essai.xlsx

    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2019
    Messages : 101
    Par défaut
    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 !

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

Discussions similaires

  1. [SQL2005] pousser des données dans une variable
    Par Monnier Eric dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/03/2008, 16h05
  2. recupération de donneés dans une variable
    Par youness_ka dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/08/2007, 16h18
  3. lire une donnée dans une variable de session
    Par pblb62 dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 14h23
  4. [VB.NET] lien d'une base de donnée dans une variable
    Par Anubis666 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/01/2006, 10h56
  5. Réponses: 2
    Dernier message: 14/10/2005, 10h11

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