Bonjour à tous,
je me permets d'ouvrir une discussion car je ne trouve pas de solution à mon problème.
Je souhaite importer un fichier xml dans un tableau variable pour y travailler les données (fichier que je serai amenée à importer régulièrement pour des contrôles). Le fichier en question fait (aujourd'hui) 25 mo, et la macro important ces données met 20 minutes... J'essaie donc de trouver des solutions à ce problème :
- Puis-je optimiser le code ci-dessous pour diminuer le temps d'exécution?
- Par ailleurs, puis-je n'importer qu'une partie du fichier xml, c'est-à-dire prendre toutes les balises, mais seulement les "lignes" répondant à des conditions? Je n'ai pas réussi à le faire.
Merci d'avance pour vos conseils !
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 Option Explicit Option Base 1 Function InverseTab(T, Optional Base As Byte = 1) 'Permet de transposer les dimensions d'un tableau Dim Temp() Dim i As Long Dim j As Long ReDim Temp(Base To UBound(T, 2), Base To UBound(T)) For i = LBound(T, 2) To UBound(T, 2) For j = LBound(T) To UBound(T) Temp(i, j) = T(j, i) Next j Next i InverseTab = Temp End Function Sub lecture_contrat() ActiveWorkbook.PrecisionAsDisplayed = False Application.DisplayAlerts = False 'Désactive/Active les fenêtres Windows (pour éviter d'avoir une fenêtre de confirmation àla suppression de feuilles par exemple) Application.ScreenUpdating = False 'Désactive la mise à jour de l'écran Application.DisplayStatusBar = False 'Désactive la barre d'état Application.Calculation = xlCalculationManual 'Calcul manuel Application.EnableEvents = False 'Désactive les évènements ActiveSheet.DisplayPageBreaks = False 'Désactive les sauts de page Application.Cursor = xlWait 'sablier Dim recolte As String recolte = Worksheets("Paramètres").Range("A6") Dim sDossier As String Dim sFichier As String Dim sDossierFichier As String Dim colonne As Long Dim ligne As Long Dim i As Long Dim j As Long Dim tabDonnees() As Variant Dim oXML As MSXML2.DOMDocument Dim oNode As MSXML2.IXMLDOMNode Dim childNode As MSXML2.IXMLDOMNode Dim oSubNode As MSXML2.IXMLDOMNode Dim xmlRecolte '1. Ouverture du fichier xml et lecture du contenu 'Nom fichier à lire Worksheets("Paramètres").Activate sDossier = Range("B9") & "/" sFichier = "Contrat.xml" sDossierFichier = sDossier & sFichier 'Chargement du fichier Set oXML = New MSXML2.DOMDocument oXML.async = False oXML.Load sDossierFichier 'Lecture du contenu ligne = 0 For Each oNode In oXML.DocumentElement.ChildNodes ligne = ligne + 1 ReDim Preserve tabDonnees(55, ligne) colonne = 0 If ligne = 1 Then For Each oSubNode In oNode.ChildNodes colonne = colonne + 1 tabDonnees(colonne, ligne) = oSubNode.BaseName Next Else For Each oSubNode In oNode.ChildNodes colonne = colonne + 1 tabDonnees(colonne, ligne) = oSubNode.Text Next End If Next '2. Affichage des données dans Excel Worksheets("Contrat").Activate 'Nettoyage des données précédentes Range("A2:BC" & Range("A2").End(xlDown).Row).Clear 'Affichage des nouvelles données Range("A1:BC" & UBound(tabDonnees, 2)) = InverseTab(tabDonnees) ActiveWorkbook.PrecisionAsDisplayed = True Application.DisplayAlerts = True 'Désactive/Active les fenêtres Windows (pour éviter d'avoir une fenêtre de confirmation à la suppression de feuilles par exemple) Application.ScreenUpdating = True 'Désactive la mise à jour de l'écran Application.DisplayStatusBar = True 'Désactive la barre d'état Application.Calculation = xlCalculationAutomatic 'Calcul manuel Application.EnableEvents = True 'Désactive les évènements ActiveSheet.DisplayPageBreaks = True 'Désactive les sauts de page Application.Cursor = xlDefault 'sablier End Sub
Partager