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 :

Importation plage tableau d'un fichier fermé


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable

    Informations forums :
    Inscription : Janvier 2022
    Messages : 156
    Par défaut Importation plage tableau d'un fichier fermé
    Bonjour le forum,
    Je voudrais importer:
    - la plage d'une table nommée clts de l'onglet "page1" d'un fichier nommé "fichier fermé".
    - dans le fichier test, page test surlequel je suis avec cette macro (test2).

    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
    Sub test2()
         'lecture fichier fermé : 
        Dim chem1$, chem2$, chem3$, fichier As String, wbs As Workbook, ws1 As Worksheet, tb1 As ListObject
        Set wbs = Workbooks("fichier ferme")
        Set ws1 = wbs.Sheets("Clients")
        Set tb1 = ws1.ListObjects(1)
        Application.ScreenUpdating = False
        Application.EnableEvents = False
                 chem1 = "E:\Users\....\entre FICHIERS\tests\"
                 fichier = "fichier ferme.xlsm" 'à adapter
                 chem2 = Dir(chem1 & "fichier ferme.xlsm", vbNormal)
                 chem3 = "='" & chem1 & "[" & fichier & "] & page1'" & ws1.ListObjects(1).DataBodyRange ' chemin cellule ok : page1'!A1" 'fichier source
            If Dir(chem1) <> "" Then 'dir sur le chemin
                With Worksheets("test").Range("B2") 'fichier destination
                  .Value = chem3
                  .Value = .Value
                End With
            Else
                MsgBox "pas de fichier"
            End If
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    Je tourne en rond, si quelqu'un pouvait m'aider.
    test.xlsm fichier ferme.xlsm
    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    978
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 978
    Par défaut
    Salut, pour lire le contenu d'un classeur, il faut l'ouvrir

    Set wbs = Workbooks("fichier ferme") devient donc Set wbs = Workbooks.Open(chem1 & fichier)


    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
    Sub test2()
        'lecture fichier fermé :
        Dim chem1$, chem2$, fichier As String, wbs As Workbook, ws1 As Worksheet, tb1 As ListObject
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        chem1 = "E:\Users\FRANCK\Documents\FRANCK\EXCEL\MACROS\entre FICHIERS\tests\"
        fichier = "fichier ferme.xlsm" 'à adapter
        chem2 = Dir(chem1 & fichier, vbNormal)
        If chem2 <> "" Then 'dir sur le chemin
            Set wbs = Workbooks.Open(chem1 & fichier)
            Set ws1 = wbs.Sheets("page1")
            Set tb1 = ws1.ListObjects("clts")
            tb1.Range.Copy Destination:=Workbooks("test").Worksheets("test").Range("B2")
            wbs.Close SaveChanges:=False
        Else
            MsgBox "pas de fichier"
        End If
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub

  3. #3
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable

    Informations forums :
    Inscription : Janvier 2022
    Messages : 156
    Par défaut
    Bonjour Franc,
    Merci pour ta réponse.
    pour lire le contenu d'un classeur, il faut l'ouvrir
    Pourtant ce code permet d'importer le contenu d'une cellule d'un classeur fermé dans le classeur actif.
    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
    Sub test2()
        'lecture fichier fermé : ecrit en B2 la cellule A1 du fichier fermé
        Dim chem1$, chem2$, chem3$, fichier As String
        Application.ScreenUpdating = False
        Application.EnableEvents = False
                 chem1 = "E:\Users\FRANCK\Documents\FRANCK\EXCEL\MACROS\entre FICHIERS\tests\"
                 fichier = "fichier ferme.xlsm" 'à adapter
                 chem2 = Dir(chem1 & "fichier ferme.xlsm", vbNormal)
                 chem3 = "='" & chem1 & "[" & fichier & "]page1'!A1" 'fichier source
            If Dir(chem1) <> "" Then 'dir sur le chemin
                With Worksheets("test").Range("B2") 'fichier destination
                  .Value = chem3
                  .Value = .Value
                End With
            Else
                MsgBox "pas de fichier"
            End If
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub
    J'ai aussi vu cette vidéo qui montre le code du gars qui parle d'un plage rg.


    Nom : 2.png
Affichages : 152
Taille : 189,6 Ko

    mais je comprends pas le code de la fonction X1cImportDataXlsx (17eme fonction du module md99_function_X1c) de son support de cours (voir les ?). Data-Managment_10.xlsm

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Function X1cImportDataXlsx(P$, ff$, wsf$, wst$, r&, c&, Optional mfold$, Optional sfold$, Optional CreateTable As Boolean)
     'X1c_046-Importe une feuille de données d'un fichier xlx and une feuille du classeur courant (XlOneClick: G.Charrault)
     'Arg 1 = P$ : Parent Path
     'Arg 2 = ff$ : Fichier Source
     'Arg 3 = wsf$ : Feuille source
     'Arg 4 = wst$ : Feuille de destination
     'Arg 5 = r&  :Ligne de destination
     'Arg 6 = c&  :Colonne de destination
     'Arg 7 = [mfold$] Optional : Répertoire du Parent Path' ? répertoire source ?
     'Arg 8 = [sfold$] Optional : Sous répertoire du Parent Path ' ?
     'Arg 9 = [CreateTable] Optional : As Boolean Créer une table ListObject
     
        Dim i As Integer
        Dim wb As Workbook
        Dim ws As Worksheet
        Dim Cn As ADODB.Connection
        Dim SQLText As String
        Dim Rst As ADODB.Recordset ' ?
        Dim XlsXfileFrom As String
        Dim rgt As Range
        X1cTestOrCreateWorksheet ThisWorkbook, wst ' ?
        Set wb = ThisWorkbook
        Set ws = wb.Worksheets(wst)
         '----------Tester les répertoires et sous-répertoires----------------------------------------
        If Not mfold = "" Then
            If Not sfold = "" Then X1cTestOrCreateSubFolder P, mfold, sfold Else X1cTestOrCreateFolder P, mfold
        End If
     
        '------------Batir le chemin complet du fichier-----------------------------------------------
        If Not Right(P, 1) = "\" Then P = P & "\"
        If Not mfold = "" And Not Right(mfold, 1) = "\" Then mfold = mfold & "\" 'if not mfold = "" ? si le répertoire n'est pas vide ? = if mfold <> ""  ?
        If Not sfold = "" And Not Right(sfold, 1) = "\" Then sfold = sfold & "\"
        If Not UCase(Right(ff, 5)) = ".XLSX" Then ff = ff & ".xlsx" 'si l'extension n'est pas en majuscule, on la met en minuscule, çà veut dire quoi ?
        XlsXfileFrom = P & mfold & sfold & ff
     
        '------------Tester si le fichier existe-------------------------------------------------
        If X1cFileExists(XlsXfileFrom) = False Then
            MsgBox ("Le fichier n'existe pas : " & vbCrLf & XlsXfileFrom)
            ErrorExit = True
            Exit Function
        End If
        '------------Afficher le paramètres d'importation en mode de déverminage----------------------------  'debugg ?
        If Not Debugg = False Then MsgBox ("Import xlsx File From: " & XlsXfileFrom & vbCrLf _
                                                        & "SheetFrom: " & wsf & vbCrLf _
                                                        & "SheetTo: " & wst & vbCrLf)
     
        '------------Connexion Methode ADO----------------------------------------------
        Set Cn = New ADODB.Connection '?
     
        ' Utiliser toujours IMEX = 1 est un moyen plus sûr de récupérer des données pour des colonnes de données mélangées.
        'çà veut dire quoi IMEX ?
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & XlsXfileFrom & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"""
            .Open
        End With
     
        SQLText = "SELECT * FROM [" & wsf & "$]"
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(SQLText) '?
        For i = 0 To Rst.Fields.Count - 1 '?
            ws.Cells(r, c + i) = Rst.Fields(i).Name '?
        Next i
        ws.Cells(r + 1, c).CopyFromRecordset Rst '?
        Cn.Close '?
        '-----Attribuer la collection range du tableau de données à la variable objet rg-----------
        Set ws = Worksheets(SheetTo) ' c'est quoi la différence avec Set ws = wb.Worksheets(wst) ?
        Set rgt = X1cRangeObject(ws, r, c, True) '?
     
        If IsMissing(CreateTable) = True Then CreateTable = False 'IsMissing(CreateTable)?
        If Not CreateTable = False Then '= if createtable = true ?
        '------------Renommer le champ de données " SheetTo "-----------------------------------------------
            If ws.ListObjects.Count = 0 Then 'Si la table n'existe pas alors creer la table au nom de la feuille
                ws.ListObjects.Add(xlSrcRange, rgt, , xlYes).Name = "Tbl_" & SheetTo
            ElseIf ws.ListObjects.Count > 1 Then 'Si la table existe ajouter les données à la table et supprimer la ligne de titre de la nouvelle Importation
                ws.Rows(r).Delete
            End If
        Else                                    'il est ou le code pour l'ajout de données ?
            rgt.Name = wst
        End If
     
        rgt.Columns.AutoFit
        Set rgt = Nothing
        Set Rst = Nothing
        Set wb = Nothing
        Set Cn = Nothing
        Set ws = Nothing
     End Function
    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 259
    Par défaut
    Citation Envoyé par frunch Voir le message
    Bonjour le forum,
    Je voudrais importer:
    - la plage d'une table nommée clts de l'onglet "page1" d'un fichier nommé "fichier fermé".
    - dans le fichier test, page test ...
    En quelques secondes avec Power Query : menu Données/importer des données/ A partir d'un fichier / A partir d'un classeur Excel

    Stéphane

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Salut,
    If Not mfold = "" And Not Right(mfold, 1) = "\" Then mfold = mfold & "\" 'if not mfold = "" ? si le répertoire n'est pas vide ? = if mfold <> "" ?
    mfold est optionnel il peut donc être égal à vbNullString. On teste donc s'il est vide, si pas vide et que le dernier caractère n'est pas un BackSlash on le rajoute.

    If Not UCase(Right(FileName, 5)) = ".XLSX" Then FileName = FileName & ".xlsx" 'si l'extension n'est pas en majuscule, on la met en minuscule, çà veut dire quoi ?
    Ici on teste l'existence de l'extension pour éviter toute erreur de comparaison (.Xlsx est <> de .xlsx) il met les cinq derniers caractères en majuscule. Il est possible d'utiliser La fonction StrComp en lieux et place.

    ' Utiliser toujours IMEX = 1 est un moyen plus sûr de récupérer des données pour des colonnes de données mélangées. 'çà veut dire quoi IMEX ?
    Un peu de lecture : https://learn.microsoft.com/en-us/do...-string-syntax

    If IsMissing(CreateTable) = True Then CreateTable = False 'IsMissing(CreateTable)?
    Là encore un peu de lecture : https://learn.microsoft.com/fr-fr/of...ssing-function

    'il est ou le code pour l'ajout de données ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For i = 0 To Rst.Fields.Count - 1 '?
        ws.Cells(destinationRow, destinationColumn + i) = Rst.Fields(i).Name '?
        Next i
    Je suis quand même d'accord avec le fait que Power Query est plus adapter pour ce travail.

  6. #6
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable

    Informations forums :
    Inscription : Janvier 2022
    Messages : 156
    Par défaut
    salut,
    Merci pour tes réponses, mais le sujet étant d'avantage de partager un fichier, j'ai réussit à appliquer la technique de cloner le fichier partagé avant de travailler dessus, puis de fusionner les 2 fichiers à la fermeture, selon le fichier téléchargé avec cette vidéo

    Il n'y a qu'à attendre les opérations de fusion sur les tables (8 au total) plutôt que de demander à l'utilisateur de se servir de powerquery.
    Cà fonctionne sur une table, je verrai sur 8 tables pleines si j'ai besoin d'une barre de défilement.
    forum.xlsm
    Cdt

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 133
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il n'y a qu'à attendre les opérations de fusion sur les tables (8 au total) plutôt que de demander à l'utilisateur de se servir de powerquery.
    Si l'on automatise des tâches répétitives, on ne demandera évidemment pas à l'utilisateur de se servir de Power Query, une seule ligne d'instruction en VBA permet d'effectuer l'actualisation de la requête ou en utilisant la propriété pour effectuer l'actualisation à l'ouverture du classeur. Tout dépend du contexte.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable

    Informations forums :
    Inscription : Janvier 2022
    Messages : 156
    Par défaut
    Salut,
    Si l'on automatise des tâches répétitives, on ne demandera évidemment pas à l'utilisateur de se servir de Power Query,
    "Evidemment" ce sont pas des certitudes qui me feront avancer mais des solutions, et tu n'en proposes aucune. Exemple, mais j'ai pas trouvé de code :


    une seule ligne d'instruction en VBA permet d'effectuer l'actualisation de la requête ou en utilisant la propriété pour effectuer l'actualisation à l'ouverture du classeur.
    Tu m'aides pas non plus. Le code va-t-il faire des conditions pour par exemple supprimer une ligne dont un opérateur ne voudra plus ?

    Tout dépend du contexte.
    Le contexte tu l'as dans le fichier joint dans le précédent post. Le formulaire s'appelle réparation gestion de piéces, donc il y a de la gestion des commandes, et des réparations pour différents utilisateurs.

    Merci

Discussions similaires

  1. [XL-2007] Récupérer un tableau d'un fichier fermé
    Par mouftie dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/03/2015, 17h23
  2. [Débutant] Problème pour importer un tableau d'un fichier texte
    Par cedji dans le forum MATLAB
    Réponses: 16
    Dernier message: 29/05/2013, 14h22
  3. [XL-2003] importation de date d'un fichier fermé
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 09/01/2012, 11h42
  4. [XL-2007] Importation des données sur plusieurs fichiers fermés
    Par starid dans le forum Excel
    Réponses: 8
    Dernier message: 18/07/2009, 17h54
  5. Importation de données venant de fichier fermé ( *.xls)
    Par stormless dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 08/11/2005, 21h21

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