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 des données d'une feuille dans un tableau [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2019
    Messages : 53
    Points : 50
    Points
    50
    Par défaut copier des données d'une feuille dans un tableau
    Bonjour,

    Je voudrais copier des valeurs (numériques et texte concaténé) à la dernière ligne d'un tableau.
    ma difficulté est de trouver le code sans erreur de syntaxe...
    J'ai essayé plusieurs options de code sans succès... comme par exemple ci-dessous:

    1. Range("ListingTableau[[#Totals],[NumDoc]]").Select se positionne dans la colonne NumDoc à la ligne des totaux
    2. Selection.ListObject.ListRows.Add ajoute une ligne vide dans le tableau( en dernier juste au dessus de la ligne des totaux
    3. Sheets("feuille2").Range("A4").Value = Sheets("feuille1").Range("A1").Value


    Cette 3è ligne me pose problème pour activer la cellule de la colonne A puis activer la colonne B, puis C, ...
    Faut-il d'abord se positionner à la ligne des totaux ou vaut mieux se placer en A1 puis descendre jusque la 1ère ligne vide ? ( Range("A")(rows.count).End(xlUp).Row - 1) ?


    Merci de votre aide et proposition

  2. #2
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Salut.

    L'intérêt du tableau structuré, des références structurées et du listobject (le tableau structuré en VBA), c'est que le code est très simplifié et que tu peux te dégager des syntaxes classiques. Nul besoin non plus de sélectionner les données, de se positionner correctement. La présence de la ligne de total n'est pas non plus un problème.

    Le principe est d'ajouter une nouvelle ligne et d'en retenir l'index, c'est-à dire la position dans la zone de données. on réalise cela avec le ListObject. Après, on travaille avec les références structurées en VBA en se positionnant sur la bonne ligne de chaque colonne et on transfère les données. On voit ici que l'ordre des colonnes du tableau structuré n'a pas d'importance car on utilise les références structurées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub SaveData()
      Dim r As Long
     
      r = Range("tableau1").ListObject.ListRows.Add.Index
      Range("tableau1[Prénom]")(r).Value = Range("f2").Value
      Range("tableau1[Nom]")(r).Value = Range("f1").Value
      Range("tableau1[Date naissance]")(r).Value = Range("f3").Value
    End Sub

    Avant et après l'exécution du code

    Nom : 2021-05-18_214838.png
Affichages : 442
Taille : 148,7 Ko

    Nom : 2021-05-18_214923.png
Affichages : 522
Taille : 161,3 Ko


    Lorsque l'on a "beaucoup" de colonnes (c'est très relatif) ou surtout que l'on veut détacher vraiment le code de la structure de la feuille pour tendre vers du générique, on peut utiliser une table de mappage en Excel ou un tableau de mappage en VBA (array). Il conviendrait alors de nommer les cellules du "formulaire" pour le transfert de données. Ici, la fonction SaveData devient générique en recevant le nom du tableau structuré et un array de mappage qui contient les noms des cellules nommées et les noms des colonnes du tableau structuré qui y sont associées. Si tu ajoutes des colonnes au tableau et des cellules nommées au formulaire, il suffit de modifier l'array de mappage, le reste du code étant générique.

    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 SaveData(TableName As String, map)
      Dim r As Long
      Dim i As Long
     
      r = Range(TableName).ListObject.ListRows.Add.Index
      For i = LBound(map) To UBound(map) Step 2
        Range(TableName & "[" & map(i + 1) & "]")(r).Value = Range(map(i)).Value
      Next i
    End Sub
     
    Sub Test()
      Dim map
     
      map = Array("f_Prénom", "Prénom", "f_Nom", "Nom", "f_DN", "Date naissance")
      SaveData "tableau1", map
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2019
    Messages : 53
    Points : 50
    Points
    50
    Par défaut copier des données d'une feuille dans un tableau
    Bonsoir Mr Fauconnier,

    code adapté à mon projet, j'ai choisi la 1ère option qui correspond le mieux à mes connaissances.
    Merci pour ces très bonnes explications.
    Bonne soirée
    Fredy

  4. #4
    Membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2019
    Messages : 53
    Points : 50
    Points
    50
    Par défaut sélectionner les cellules de la dernière ligne d'un tableau
    Mr Fauconnier,

    1er partie: je peine à sélectionner les cellules de la dernière ligne du tableau pour pouvoir mettre en caractère gras avec une police arial 10

    j'ai tenté plusieurs possibilités comme décrit dans le tuto...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Range("ListingTableau1").ListObject.ListRows.End(xlDown).Offset(-1, 0).Select
    With Selection.Font
       .Name = "Arial"
      .Size = 10 = True
       .Font.Bold = True
    End With


    2è partie: supprimer la dernière ligne entière du tableau (après un msgbox vbquestion)
    le range "A1" me semble incorrect et je préfèrerais utiliser Range("ListingTableau1") dans le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("A1").End(xlDown).EntireRow.Delete
    Merci pour l'aide

  5. #5
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Comme dit dans ma première réponse, pas besoin ni de sélectionner, ni de "chercher" avec des End(xlUp) ou end(XlDown).

    Le listobject expose la collection des lignes de données par sa propriété ListRows.
    La propriété ListRows expose à son tour des méthodes et propriétés dont la propriété Count qui renvoie le nombre de lignes du tableau structuré.
    On peut atteindre n'importe quelle ligne du tableau par son index, et on manipule alors un objet ListRow (sans s) qui expose à son tour des méthodes et propriétés, dont l'une renvoie la plage de la ligne grâce à la propriété Range, qui est une plage de cellules classique dont on peut également manipuler les propriétés dont la propriété Font.

    Voici le code pour manipuler la plage de la dernière ligne du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      With Range("tableau1").ListObject.ListRows(Range("tableau1").ListObject.ListRows.Count).Range
        .Font.Name = "Arial"
        .Font.Size = 10
        .Font.Bold = True
      End With
    L'objet ListRow expose des méthodes et propriétés dont Delete qui permet de supprimer la ligne du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("tableau1").ListObject.ListRows(Range("tableau1").ListObject.ListRows.Count).Delete

    Il conviendrait normalement de tester que le tableau n'est pas vide, par exemple avec If Range("tableau1").ListObject.ListRows.Count > 0 Then pour éviter de générer une erreur car l'index 0 n'existe pas dans la collection ListRows.

  6. #6
    Membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2019
    Messages : 53
    Points : 50
    Points
    50
    Par défaut format date jj-mm-aaaa
    Bj Mr,

    La remarque est pertinente et vous remercie du conseil.
    si bien compris j'effectue la vérification si tableau vide avant l'instruction Delete dernière ligne ?

    J'ai une colonne intitulée 'Date' et le format recopié obtenu est mm-jj-aaa au lieu de jj-mm-aaa (malgré après avoir formaté la colonne 'date' (voir pièce ci-joint)
    nb: la cellule d'origine est également formatée en jj-mm-aa

    Selection.NumberFormat = "d/mm/yyyy;@"
    est-ce le bon code ?

    encore merci pour votre aide précieuse!
    Images attachées Images attachées  

  7. #7
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Quel code as-tu utilisé? Peux-tu le mettre ici?

    Normalement, tu ne devrais pas rencontrer ce problème. Du premier code que tu as montré, tu travailles avec une plage comme "formulaire". est-ce exact ou bien travailles-tu avec un userform?

    Quelle est ta version linguistique d'Excel et quels sont tes paramètres régionaux?

  8. #8
    Membre du Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2019
    Messages : 53
    Points : 50
    Points
    50
    Par défaut copier des données d'une feuille dans un tableau
    Bonjour Monsieur Fauconnier,

    J'ai examiné avec attention les données source et la date ne provenait pas de la bonne cellule... erreur de ma part, sorry...
    C'est corrigé, je continue la construction du projet... (le formulaire est une feuille et non un userforme)
    Je me permettrai de revenir vers vous pour un conseil ou un problème rencontré.
    Merci infiniment.
    Fredy

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2013, 18h30
  2. Copier des données d'une feuille dans plusieurs autres
    Par Sylcoco dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/03/2011, 11h40
  3. Réponses: 0
    Dernier message: 24/02/2011, 17h24
  4. copier des cellules d'une feuille dans une autres sous condition
    Par olivertwist dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/05/2007, 10h42
  5. [VBA-E]transposer des données d'une feuille dans une autre
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 26/03/2007, 18h47

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