XL 2013 Importation tableau excel

Appo1985

XLDnaute Occasionnel
Bonsoir.
J'ai deux fichiers avec deux tableaux dont certaines colonnes ont le même nom.
Je voudrais savoir est ce possible par VBA importer les données d'un tableau vers un autres tableau. Je n'ai pas beaucoup de connaissances sur Excel et quand j'essaie de faire manuellement je n'arrive pas a trouver le résultat voulu (les entêtes sont aussi importés).
Merci d'avance pour votre aide
Ci joint les deux fichiers
 

Pièces jointes

  • ficher BDD.xlsm
    9.1 KB · Affichages: 5
  • tableau a importer.xlsx
    9 KB · Affichages: 6
Solution
Salut,

Bon y aurait quelques trucs à améliorer notamment la mise en forme du tableau structuré aprés le code. l'ouverture du fichier tableau a importer...


J'ai pas trouvé mieux que de destructurer le tabelau de BDD (unlist) pour avoir le bon numéro de ligne au moment d'écrire les données. Si un autre contributeur XLD lit mon post (par exemple , @chris ) . => Le tableau structuré ne gére pas l'adressage de la dernière cellule par colonne comme une plage de cellules. ex: Si j'écris des données en colonne 2 de mon tableau par exemple en B5;B7, ma colonne 3 (j'ai essayé tout un tas de combinaisons) VBA me retourne C7 comme dernière ligne alors qu'il y a rien dedans, Je me voyais pas boucler sur toutes les colonnes non plus pour...

Zon

XLDnaute Impliqué
Salut,

Bon y aurait quelques trucs à améliorer notamment la mise en forme du tableau structuré aprés le code. l'ouverture du fichier tableau a importer...


J'ai pas trouvé mieux que de destructurer le tabelau de BDD (unlist) pour avoir le bon numéro de ligne au moment d'écrire les données. Si un autre contributeur XLD lit mon post (par exemple , @chris ) . => Le tableau structuré ne gére pas l'adressage de la dernière cellule par colonne comme une plage de cellules. ex: Si j'écris des données en colonne 2 de mon tableau par exemple en B5;B7, ma colonne 3 (j'ai essayé tout un tas de combinaisons) VBA me retourne C7 comme dernière ligne alors qu'il y a rien dedans, Je me voyais pas boucler sur toutes les colonnes non plus pour tester ....


Dans cette version ,Il faut que le fichier tableau a importer soit ouvert.

Pour le test j'ai un peu changé l'ordre des colonnes dans BDD.

Merci pour le retour de tes tests.

PS: LOL il date pas d'aujourd'hui le fichier, 2008, mon pseudo est un dminutif du nom de l'auteur qui plus est.
 

Pièces jointes

  • ficher BDDZonV1.0.xlsm
    23 KB · Affichages: 6

Appo1985

XLDnaute Occasionnel
Salut,

Bon y aurait quelques trucs à améliorer notamment la mise en forme du tableau structuré aprés le code. l'ouverture du fichier tableau a importer...


J'ai pas trouvé mieux que de destructurer le tabelau de BDD (unlist) pour avoir le bon numéro de ligne au moment d'écrire les données. Si un autre contributeur XLD lit mon post (par exemple , @chris ) . => Le tableau structuré ne gére pas l'adressage de la dernière cellule par colonne comme une plage de cellules. ex: Si j'écris des données en colonne 2 de mon tableau par exemple en B5;B7, ma colonne 3 (j'ai essayé tout un tas de combinaisons) VBA me retourne C7 comme dernière ligne alors qu'il y a rien dedans, Je me voyais pas boucler sur toutes les colonnes non plus pour tester ....


Dans cette version ,Il faut que le fichier tableau a importer soit ouvert.

Pour le test j'ai un peu changé l'ordre des colonnes dans BDD.

Merci pour le retour de tes tests.

PS: LOL il date pas d'aujourd'hui le fichier, 2008, mon pseudo est un dminutif du nom de l'auteur qui plus est.
Bonjour @Zon
Merci d'avoir consacrer votre temps a mon post.
J'ai gardé le même fichier "tableau à importer" et j'ai transformé le tableau du fichier BDD en tableau structuré.
Je ne sais pas comment faire exécuter la procédure ProcpourLestests(Optional Toto)
Quand j'ai essayé le MsgBox "Erreur à l'initialisation..." s'affiche.
Merci d'avance pour m'éclairer si je doit faire des adaptations.
 

Zon

XLDnaute Impliqué
Salut,

Déjà procpourlestests n'est pas accessible depuis le lanceur de Macro elle n'est pas vraiment utile, je l'ai laissée pour certains lecteurs du forum qui voudrait un truc simple qui ne gère pas si Tableau1 existe déjà dans le classeur.

Comme tu as erreur d'initialisation, cela veut dire que tu as lancé la bonne procédure Importation mais il faut regarder l'affectation des constantes en haut du module, j'ai rajouté les commentaires pour aider l'utilisateur.

Code:
'***************************PARTIE à ADAPTER LES NOMS*********************************
Const TBDD$ = "Tableau1" 'Nom du tableau structuré dans le fichier BDD
Const TImport$ = "Tableau1" ' Nom  du tableau structuré dans le fichier à importer
Const NBlig& = 65536 ' à adpater si le tableau fait plus de 65536 lignes
Const NomClasseurImport$ = "tableau a importer.xlsx" 'Nom du fichier à importer
Const NomFbDD$ = "Feuil1" 'Nom de la feuille où se trouve le tableau structuré du fichier BDD
Const NomFImport = "Feuil1" 'Nom de la feuille où se trouve le tableau structuré du fichier à imorter
'************************************************************************************



A+++
 

chris

XLDnaute Barbatruc
Bonjour à tous

Les dates de naissance des 2 tableaux sont pour certaines du texte et non des dates

Dans tableau structuré on raisonne en ligne utilisée (d'où l'importante de respecter la règle, pas de ligne entièrement vide)

Une solution après avoir renommé le tableau cible BDD (autre règle : on ne garde pas les noms automatiques de type Tableau1 mais on donne des noms signifiants...)
Adapter le chemin d'accès
VB:
Option Explicit
Sub import()
    Dim T As Range, Cible As ListObject, Nc As Byte, NbS As Long, NbC As Long, Col As ListColumn, Col0 As Range, i As Long

    Set Cible = [BDD].ListObject
    Set T = Cible.HeaderRowRange
    NbC = Cible.ListRows.Count + 1
    Workbooks.Open ("T:\TEMP\tableau a importer.xlsx")
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        Nc = 0
        NbS = .ListRows.Count
        For Each Col In .ListColumns
            Set Col0 = T.Find(Col.Name)
            If Not Col0 Is Nothing Then
                If Nc = 0 Then
                    Nc = 1
                    For i = 1 To NbS
                        Cible.ListRows.Add
                    Next i
                End If
                Col.DataBodyRange.Copy Destination:=Cible.ListColumns(Col.Name).DataBodyRange.Cells(NbC, 1)
            End If
        Next
        ActiveWorkbook.Close
    End With
End Sub

EDIT : la définition de Col0 était érronée.
On peut ajouter une ligne
Application.ScreenUpdating = False
 
Dernière édition:

Appo1985

XLDnaute Occasionnel
Salut,

Déjà procpourlestests n'est pas accessible depuis le lanceur de Macro elle n'est pas vraiment utile, je l'ai laissée pour certains lecteurs du forum qui voudrait un truc simple qui ne gère pas si Tableau1 existe déjà dans le classeur.

Comme tu as erreur d'initialisation, cela veut dire que tu as lancé la bonne procédure Importation mais il faut regarder l'affectation des constantes en haut du module, j'ai rajouté les commentaires pour aider l'utilisateur.

Code:
'***************************PARTIE à ADAPTER LES NOMS*********************************
Const TBDD$ = "Tableau1" 'Nom du tableau structuré dans le fichier BDD
Const TImport$ = "Tableau1" ' Nom  du tableau structuré dans le fichier à importer
Const NBlig& = 65536 ' à adpater si le tableau fait plus de 65536 lignes
Const NomClasseurImport$ = "tableau a importer.xlsx" 'Nom du fichier à importer
Const NomFbDD$ = "Feuil1" 'Nom de la feuille où se trouve le tableau structuré du fichier BDD
Const NomFImport = "Feuil1" 'Nom de la feuille où se trouve le tableau structuré du fichier à imorter
'************************************************************************************



A+++
 

Appo1985

XLDnaute Occasionnel
Grandement Merci.
Ça a donner que je voulais.
Bonjour à tous

Les dates de naissance des 2 tableaux sont pour certaines du texte et non des dates

Dans tableau structuré on raisonne en ligne utilisée (d'où l'importante de respecter la règle, pas de ligne entièrement vide)

Une solution après avoir renommé le tableau cible BDD (autre règle : on ne garde pas les noms automatiques de type Tableau1 mais on donne des noms signifiants...)
Adapter le chemin d'accès
VB:
Option Explicit
Sub import()
    Dim T As Range, Cible As ListObject, Nc As Byte, NbS As Long, NbC As Long, Col As ListColumn, Col0 As Range, i As Long

    Set Cible = [BDD].ListObject
    Set T = Cible.HeaderRowRange
    NbC = Cible.ListRows.Count + 1
    Workbooks.Open ("T:\TEMP\tableau a importer.xlsx")
    With ActiveWorkbook.Worksheets("Feuil1").ListObjects(1)
        Nc = 0
        NbS = .ListRows.Count
        For Each Col In .ListColumns
            Set Col0 = T.Find(Col.Name)
            If Not Col0 Is Nothing Then
                If Nc = 0 Then
                    Nc = 1
                    For i = 1 To NbS
                        Cible.ListRows.Add
                    Next i
                End If
                Col.DataBodyRange.Copy Destination:=Cible.ListColumns(Col.Name).DataBodyRange.Cells(NbC, 1)
            End If
        Next
        ActiveWorkbook.Close
    End With
End Sub

EDIT : la définition de Col0 était érronée.
On peut ajouter une ligne
Application.ScreenUpdating = False
Bonjour. Merci beaucoup pour le soutien.

J'ai renommé mon classeur "BDD" et et crée un tableau mais il ya toujours un message d'erreur qui s'affiche.
Je suis toujours à vous pour une correction.
Ci joint le fichier
 

Pièces jointes

  • importation reussi.JPG
    importation reussi.JPG
    49.2 KB · Affichages: 7
  • BDD.xlsm
    18.1 KB · Affichages: 1

Zon

XLDnaute Impliqué
Bonjour à tous

Les dates de naissance des 2 tableaux sont pour certaines du texte et non des dates

Dans tableau structuré on raisonne en ligne utilisée (d'où l'importante de respecter la règle, pas de ligne entièrement vide)
Re


Merci @chris , tu utilises d'autres propriétés utiles à ce projet . J'ai testé cela fonctionne nickel.

J'ai même enlevé le listrows.add (qui à partir de 150 000 lignes fait planter Excel chez moi),

Cible.ListColumns(Col.Name).DataBodyRange.Cells(NbC, 1) nous donne bien la 1ere ligne en dessous du tableau, mais comme le tableau struturé s'allonge tout seul quand on met des données sur cette ligne, pas besoin de lui ajouter des lignes...

Microsoft devrait ajouter plus de méthode et/ou de propriété à listobject.. Car Si on doit ajouter 200 000 lignes , listrows.add , moi ça fait planter Excel.

La méthode FInd je n'ai jamais aimé (elle donnait jadis pas toujours les résultats escomptés)elle a dû être améliorée depuis 15 ans. Le copier coller de cellules aussi quand on abusait ça pouvait faire planter(il est rare d'avoir plus de 5000 colonnes dans ce type tableau) ...En 2023 on a des machines bien plus puissante
..

@Appo1985 , merci pour ton retour pour ma partie.

ton copier coller du code de Chris s'est pas bien passé Il, faut déjà que ton tableau1 du fichier BDD s'appelle BDD ou que tu le changes dans le code

Ensuite il faut écrire For Each Col In .ListColumns et non listcolums
=> Si tu n'as pas de majuscules qui apparaissent sur les objets ou propriétés VBA c'est que c'est mal orthographié.

Application.screenupdating=false s'écrit en début de procédure et non à la fin..

Voici le fichier avec le code de Chris avec le rapatriement des constantes que j'avais faite mais sans gestion d'erreur du code ( mais où on utilise Tableau1 et non BDD)


A+++
 

Pièces jointes

  • BDDVzonChris1.0.xlsm
    16.5 KB · Affichages: 4

Discussions similaires

Réponses
35
Affichages
883

Statistiques des forums

Discussions
312 207
Messages
2 086 252
Membres
103 166
dernier inscrit
ZAHRAA