Microsoft 365 Ouvrir un fichier Excel rapidement en VBA

iliess

XLDnaute Occasionnel
Je suis actuellement chargé de la gestion comptable sur un logiciel de comptabilité qui me donne la capacité de générer des états financiers sous forme de fichiers Excel. Cependant, un inconvénient notable est la lenteur d'ouverture de ces rapports.
Est-il possible de réduire le temps d’ouverture du classeur en VBA en important, par exemple, l’intégralité de la feuille 1 sans ouvrir le fichier source pour un traitement personnalisé ?
Cordialement.

1712352797545.png


Est-il possible de joindre mon fichier de démonstration qui fait 12 Mo en taille ?
 
Dernière édition:
Solution
Voici un code ("Power Query") avec un temps de 6,48 secondes.
VB:
sub Macro1()
Dim t
t = Timer
    ActiveWorkbook.Queries.Add Name:="JournalAuxExcel", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Excel.Workbook(File.Contents(""C:\Users\ilies\Desktop\JournalAux.xlsx""), null, true)," & Chr(13) & "" & Chr(10) & "    JournalAuxExcel_Sheet = Source{[Item=""JournalAuxExcel"",Kind=""Sheet""]}[Data]," & Chr(13) & "" & Chr(10) & "    #""Type modifié"" = Table.TransformColumnTypes(JournalAuxExcel_Sheet,{{""Column1"", type any}, {""Column2"", type any}, {""Column3"", type text}, {""Column4"", type" & _
        " text}, {""Column5"", type text}, {""Column6"", type text}, {""Column7"", type text}, {""Column8"", type text}, {""Column9"", type any}, {""Column10""...

job75

XLDnaute Barbatruc
Bonjour iliess, wDog66,

Dans le fichier Source.xlsx nommez Tableau la plage que vous voulez récupérer.

Dans le fichier Pilote.xlsm exécutez la macro :
VB:
Sub Copier()
Dim fichier As Variant, form$, nlig&, ncol%
fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If fichier = False Then Exit Sub
form = "'" & fichier & "'!Tableau"
nlig = ExecuteExcel4Macro("ROWS(" & form & ")")
ncol = ExecuteExcel4Macro("COLUMNS(" & form & ")")
Application.ScreenUpdating = False
Cells.Delete 'RAZ
With [A1].Resize(nlig, ncol)
    .FormulaArray = "=" & form 'formule matricielle
    .Value = .Value 'supprime la formule
    .Replace 0, "", xlWhole 'efface les valeurs zéro
End With
End Sub
Le fichier Source est copié sans qu'on l'ouvre.

A+
 

Pièces jointes

  • Pilote.xlsm
    16.8 KB · Affichages: 4
  • Source.xlsx
    9 KB · Affichages: 3

job75

XLDnaute Barbatruc
Si vous ne voulez pas créer le nom Tableau il faut un minimum d'informations :

- le nom de la feuille à copier => "Feuil1"

- le numéro de la ligne des en-têtes => 1

- la nature des valeurs en colonne A ou B (textes ou nombres).

La nouvelle macro :
VB:
Sub Copier()
Dim fichier As Variant, chemin$, feuille$, form$, nlig&, ncol%
fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If fichier = False Then Exit Sub
chemin = Left(fichier, InStrRev(fichier, "\"))
fichier = Mid(fichier, InStrRev(fichier, "\") + 1)
feuille = "Feuil1" 'nom de la feuille à copier
form = "'" & chemin & "[" & fichier & "]" & feuille & "'!"
'nlig = ExecuteExcel4Macro("MATCH(""zzz""," & form & "C1)") 'textes en colonne A
nlig = ExecuteExcel4Macro("MATCH(9^9," & form & "C2)") 'ou nombres en colonne B
ncol = ExecuteExcel4Macro("MATCH(""zzz""," & form & "R1)") 'ligne des en-têtes
Application.ScreenUpdating = False
Cells.Delete 'RAZ
With [A1].Resize(nlig, ncol)
    .FormulaArray = "=" & form & "R1C1:R" & nlig & "C" & ncol 'formule matricielle
    .Value = .Value 'supprime la formule
    .Replace 0, "", xlWhole 'efface les valeurs zéro
End With
End Sub
 

Pièces jointes

  • Pilote.xlsm
    17.6 KB · Affichages: 3
  • Source.xlsx
    9 KB · Affichages: 2

job75

XLDnaute Barbatruc
A partir du lien du post #19 j'ai téléchargé le fichier puis exécuté cette macro :
VB:
Sub Copier()
Dim fichier As Variant, t, chemin$, feuille$, form$, nlig&, ncol%
fichier = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If fichier = False Then Exit Sub
t = Timer
chemin = Left(fichier, InStrRev(fichier, "\"))
fichier = Mid(fichier, InStrRev(fichier, "\") + 1)
feuille = "JournalAuxExcel" 'nom de la feuille à copier
form = "'" & chemin & "[" & fichier & "]" & feuille & "'!"
nlig = ExecuteExcel4Macro("MATCH(""zzz""," & form & "C3)") 'textes en colonne C
ncol = ExecuteExcel4Macro("MATCH(""zzz""," & form & "R5)") 'ligne des en-têtes
Application.ScreenUpdating = False
Cells.Delete 'RAZ
With [A1].Resize(nlig, ncol)
    .FormulaArray = "=" & form & "R1C1:R" & nlig & "C" & ncol 'formule matricielle
    .Value = .Value 'supprime la formule
    .Replace 0, "", xlWhole 'efface les valeurs zéro
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \sec")
End Sub
Elle s'exécute en 34 secondes chez moi, 207 791 lignes sont copiées.
 

Pièces jointes

  • Pilote.xlsm
    17.5 KB · Affichages: 9

Cousinhub

XLDnaute Barbatruc
Bonjour,
En modifiant le début du code ainsi :
VB:
....
Dim Fichier As String
Fichier = Application.GetOpenFilename("XL* Files (*.xls;*.xlsm;*.xlsx), *.xls;*.xlsm;*.xlsx", 1, "ouvrir un fichier")
If Fichier = "" Then Exit Sub
ActiveWorkbook.Queries.Add Name:="JournalAuxExcel", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Excel.Workbook(File.Contents(""" & Fichier & """), null, true)," & Chr(13) & "" & Chr(10) & "    JournalAuxExcel_Sheet = Source{[Item=""JournalAuxExcel"",Kind=""Sheet""]}[Data]" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    JournalAuxExcel_Sheet"
ActiveWorkbook.Worksheets.Add
....
....
Si le nom de l'onglet peut être différent, et qu'il n'y a qu'un seul onglet, tu peux supprimer la partie Item=""JournalAuxExcel"", le code deviendrait alors :
VB:
....
Dim Fichier As String
Fichier = Application.GetOpenFilename("XL* Files (*.xls;*.xlsm;*.xlsx), *.xls;*.xlsm;*.xlsx", 1, "ouvrir un fichier")
If Fichier = "" Then Exit Sub
ActiveWorkbook.Queries.Add Name:="JournalAuxExcel", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Excel.Workbook(File.Contents(""" & Fichier & """), null, true)," & Chr(13) & "" & Chr(10) & "    Import = Source{[Kind=""Sheet""]}[Data]" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    Import"
ActiveWorkbook.Worksheets.Add
....
....
 

Discussions similaires

Réponses
3
Affichages
278

Statistiques des forums

Discussions
312 463
Messages
2 088 626
Membres
103 894
dernier inscrit
tanyroc