Bonjour à tous,

Débutant en VBA, je me suis mis à la recherche de solutions pour ce problème:

Je cherche à obtenir un fichier Excel regroupant les entrées et sorties repérées par des caméras IP, les caméras produisent un fichier XML quotidiennement, qui est envoyé par mail et également en FTP sur un répertoire, je cherche dans un premier temps à faire l'historique, en récupérant tout les fichiers obtenu par mail, le répertoire n'étant en place que depuis peu.

Jusqu'ici tout va bien, j'ai réussi à trouver et modifier légèrement un script pour extraire les fichiers des pièces jointes Outlook et les placer tous dans un répertoire.

J'ai ensuite essayer de lancer un script, trouvé sur ce même forum pour parcourir tout les fichiers XML et les insérer tous dans une seule feuille Excel, mais le résultat n'est pas satisfaisant du tout:

Nom : printxml.PNG
Affichages : 947
Taille : 32,1 Ko

Ce que je souhaiterai réaliser :

Je souhaiterai pouvoir créer pour chaque fichier dans le répertoire une ligne avec plusieurs colonnes ( dans un fichier Excel ) : la date, le nom de la porte, les entrées et les sorties.

Pour référence voici un des fichiers XML produits :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<Metrics SiteId="X" Sitename="X " DeviceId="Device ID" Devicename="Porte E" DivisionId="1">
 
[...]
 
<ReportData Interval="1440">
<Report Date="2018-04-16">
<Object Id="0" DeviceId="Device ID" Devicename="Porte E" ObjectType="0" Name="PORTE E" ExternalId="1">
<Count StartTime="00:00:00" EndTime="00:00:00" UnixStartTime="1523829600" Enters="5" Exits="4" Status="4"/>
</Object>
</Report>
</ReportData>
</Metrics>

Je n'ai cependant aucune expérience et aucune idée concernant la manipulation de ce genre de fichier via VBA...

Pour le moment mon script se contente de regrouper tout les fichiers dans la première colonne d'une feuille de calcul, puis de les scinder suivant un séparateur donné:

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
Sub on_y_va() 'ouvre une boite de dialogue qui permet de sélectionner le dossier où se trouvent les fichiers
    Range("A1:F65536").ClearContents 'supprime tout ce qui est sur la feuille active
    Dim Repertoire As FileDialog, monRepertoire As String
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Repertoire.Show
    If Repertoire.SelectedItems.Count > 0 Then
        monRepertoire = Repertoire.SelectedItems(1)
        aspirer monRepertoire
    Else
        MsgBox "Aucun Répertoire Sélectionné"
    End If
End Sub
 
Sub aspirer(ceRepertoire As String) 'importe tous les fichiers les uns à la suite des autres dans la première colonne
 
    Dim Fso, SourceFolder, SubFolder, fichier As Object
    Dim ws As Worksheet, wrecap As Worksheet
 
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(ceRepertoire)
 
    ' boucle sur tous les fichiers du répertoire
    For Each fichier In SourceFolder.Files
        If Right(fichier.Name, 4) = ".xml" Then
 
            N = FreeFile
            Open fichier For Input As #N
 
         i = 0
         k = Range("A65536").End(xlUp).Row
           Do While Not EOF(1)
                Line Input #N, contenu
                i = k
                Cells(i, 1).Value = contenu
                k = k + 1
            Loop
 
            Close #N
        End If
    Next fichier
bla
 
End Sub
 
Sub bla() ' scinde et réparti les données de la première colonne sur les colonnes suivantes à chaque espace
 
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), _
        TrailingMinusNumbers:=True
    Cells.Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 
End Sub
Pour référence, je n'ai pas produit ce code, il est directement issue d'une autre discussion sur ce forum, mais étant donné qu'il me permet de réaliser une partie des opérations désirées, je m'en suis servi comme base, pour le moment, j'ai juste changé le type de fichier à parcourir.

je souhaiterai pouvoir , à la place de copier l'intégralité de chaque fichier, parcourir les fichiers XML, et n'extraire que les données dont j'ai besoin( porte, date, entrées, sorties), pour venir ensuite les inscrire dans une feuille, mais je bloque, sur la stratégie à adopter et le type de fonctions à utiliser...

Si certains d'entre vous sont aptes à me guider , je vous en serait bien reconnaissant !

En vous remerciant d'avance pour toute aide apportée,

Je vous souhaite une bonne journée !

Jean