XL 2016 importer un tableau situé dans un fichier externe ayant un nom variable selon la date

palto

XLDnaute Nouveau
Bonjour,

comment pourrais je importer un tableau (a1:f8) situé dans un fichier externe dont le nom varie en fonction de la date du jour (ex fichier-20220613.xlsx, fichiers-20220612.xlsx) dans mon classeur excel actuel ?

en gros j'aimerais avoir dans mon classeur actuel, le tableau du fichier de la veille sans avoir à l'ouvrir

Merci par avance pour votre aide
 

Dudu2

XLDnaute Barbatruc
Bonjour,

Perso je sais le faire mais cellule par cellule. Et seulement les valeurs, pas les formules.
Quel est l'intérêt de ne pas l'ouvrir ?
Si on l'ouvre en Read mode, sous Application.ScreenUpdating = False le temps de lire le tableau, il ne se passera rien à l'écran et ce sera très rapide.

A moins que quelqu'un sache lire plus d'une cellule sans l'ouvrir avec ADODB.
 

Deadpool_CC

XLDnaute Impliqué
bonjour,
@Dudu2 : quand il disait sans l'ouvrir je pense qu'il disait qu'il ne voualis pas l'ouvrir manuellement ... donc automatiser l'ouverture la copie des données et sa fermeture (avec un msg d'erreur si non present me semble être la solution recherchée.
mais @palto nous confirmera certainement le fonctionnement attendu :)
 

Dudu2

XLDnaute Barbatruc
Bonjour @Deadpool_CC,
En effet, c'est pour ça que j'ai posé la question car je ne vois pas l'intérêt de la lecture sans ouvrir sauf cas particulier.

Edit: code modifié 15h37 pour ajouter des codes retour pour diagnostic éventuel
Sinon ici une fonction pour copier un Range d'un classeur vers un Range d'un [autre] classeur.
J'ai fait un code assez long mais complet.
VB:
'------------------------------------------------------------------
'Copie d'un Range d'un classeur dans un Range d'un [autre] classeur
'
'Si le Range source est dans un classeur fermé, celui-ci sera
'ouvert sans affichage puis refermé après la copie.
'
'La fonction retourne:
'- 0 si OK
'- 1 si fichier source n'existe pas
'- 2 si le Range destination est incorrect
'- 3 le nom du fichier source est le même que celui d'un fichier
'    ouvert qui n'est pas le fichier source
'- 4 erreur à l'ouverture du fichier source
'- 5 erreur sur le nom de la feuille du fichier source
'- 6 erreur en copie du Range source sur le Range destination
'------------------------------------------------------------------
Function CopyRangeFromWorkbook(RngDestination As Range, _
                               wbPathSource As String, _
                               wbNameSource As String, _
                               wsNameSource As String, _
                               RngRefSource As String) As Integer
    Dim wsObj As Worksheet
    Dim wbObj As Workbook
    Dim wbAlreadyOpen As Boolean
    Dim ScreenUpdatingAtCallTime As Boolean
    Dim EnableEventsAtCallTime As Boolean
    Dim CalculationAtCallTime As Integer
    Dim Retour As Integer
   
    'Save settings
    ScreenUpdatingAtCallTime = Application.ScreenUpdating
    EnableEventsAtCallTime = Application.EnableEvents
    CalculationAtCallTime = Application.Calculation
   
    'Inhibe affichage, macro Workbook_Open() et fonctions personnalisées
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
   
    'Check file
    If Right(wbPathSource, 1) <> "\" Then wbPathSource = wbPathSource & "\"
    If Len(Dir(wbPathSource & wbNameSource)) = 0 Then
        Retour = 1
        GoTo ExitFunction2
    End If
   
    'Check Range destination
    If Not TypeOf RngDestination Is Range Then
        Retour = 2
        GoTo ExitFunction2
    End If
   
    'Check open Workbooks full names
    For Each wbObj In Application.Workbooks
        If wbObj.FullName = wbPathSource & wbNameSource Then Exit For
    Next wbObj
   
    'The source Workbook is already open
    If Not wbObj Is Nothing Then wbAlreadyOpen = True
   
    'Error handling
    On Error Resume Next
   
    'The source Workbook has to be open
    If Not wbAlreadyOpen Then
   
        'Check open Workbooks names
        For Each wbObj In Application.Workbooks
            If wbObj.Name = wbNameSource Then Exit For
        Next wbObj
       
        'A Workbook is already open that has the same name as the source Workbook
        If Not wbObj Is Nothing Then
            Retour = 3
            GoTo ExitFunction2
        End If
       
        'Open the source Workbook
        Application.Workbooks.Open wbPathSource & wbNameSource, UpdateLinks:=False, ReadOnly:=True
        If Err.Number Then
            Retour = 4
            GoTo ExitFunction2
        End If
       
        Set wbObj = ActiveWorkbook
    End If
   
    'Find source Worksheet
    Set wsObj = wbObj.Worksheets(wsNameSource)
    If Err.Number Then
        Retour = 5
        GoTo ExitFunction1
    End If

    'Copy source to destination
    wsObj.Range(RngRefSource).Copy RngDestination
    If Err.Number Then
        Retour = 6
        GoTo ExitFunction1
    End If
   
ExitFunction1:
    'Close opened source Workbook
    If Not wbAlreadyOpen Then wbObj.Close savechanges:=False
   
ExitFunction2:
    'Restore settings
    Application.ScreenUpdating = ScreenUpdatingAtCallTime
    Application.EnableEvents = EnableEventsAtCallTime
    Application.Calculation = CalculationAtCallTime
   
    'Set Return value
    CopyRangeFromWorkbook = Retour
End Function

Et un exemple de mise en œuvre.
VB:
Sub Test()
    Dim Retour As Integer
 
    ThisWorkbook.Worksheets(1).[A1:C5].ClearContents
    Retour = CopyRangeFromWorkbook(ThisWorkbook.Worksheets(1).[A1], "F:\Téléchargements\", "Classeur2.xlsx", "Feuil1", "C5:E9")
 
    If Retour <> 0 Then
        MsgBox "Une erreur " & Retour & " s'est produite"
        Exit Sub
    End If
End Sub
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Bonjour,

Et le lendemain que fait-on des tableaux importés les jours précédents ? Les supprimer ?

Sinon pour un fichier nommé suivant le masque "fichier yyyymmdd.xlsx" où yyyymmdd est la date de la veille,
la requête powerquery suivante :
let
Source = Excel.Workbook(File.Contents("Z:\CheminVersLeDossier\fichier " & Date.ToText(Date.AddDays(DateTime.Date(DateTime.LocalNow()),-1),[Format="yyyyMMdd",Culture="fr-FR"]) & ".xlsx"), null, true),
Feuil1_Sheet = Source{[Item="Feuil1",Kind="Sheet"]}[Data],
#"Conserver les premières lignes" = Table.FirstN(Feuil1_Sheet,8),
#"Conserver les premières colonnes" = Table.SelectColumns(#"Conserver les premières lignes",{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"}),
#"En-têtes promus" = Table.PromoteHeaders(#"Conserver les premières colonnes", [PromoteAllScalars=true]),
#"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"Colonne 1", Int64.Type}, {"Colonne 2", Int64.Type}, {"Colonne 3", Int64.Type}, {"Colonne 4", Int64.Type}, {"Colonne 5", Int64.Type}, {"Colonne 6", Int64.Type}})
in
#"Type modifié"
Ramènera les 8 premières lignes des 6 premières colonnes de la feuille nommée "Feuil1".

Adapter le chemin vers le dossier (Z:\CheminVersLeDossier).

Cordialement
 

palto

XLDnaute Nouveau
Bonjour et merci beaucoup pour vos réponses,

j'ai des fichiers qui arrivent automatiquement dans un dossier dont le nom est "suivi dossiers traites 20220612.xlsx
à l'interieur desquels il y a un tableau qui va de e2 à h6.

Mon besoin, si possible, serait de récupérer dans un autre fichier, ce tableau (e2:h6) automatiquement à l'ouverture du fichier. genre si je l'ouvre aujourd'hui, il m'afficherait le fichier du 1406 (en remplacant les données de la veille.

j'ai essayé la macro de @Dudu2 mais ça me parait trop complexe à faire fonctionner pour mon faible niveau.

L'idee de @Hasco me semble intéressante vu que j'utilise un peu powerquery mais j'ai un message d'erreur :(
1655291861192.png


1655291467066.png
 

Discussions similaires

Réponses
5
Affichages
262

Statistiques des forums

Discussions
299 703
Messages
1 978 596
Membres
206 300
dernier inscrit
gauthier75011