Mise en forme de texte brut vers un fichier Excel

GarnierFlorian

XLDnaute Nouveau
Bonjour à tous et peut-être à toutes !

En fait, je pense que ce que je souhaite faire n'est pas trop compliqué, mais j'ai plusieurs petites choses qui me posent problèmes.

Donc, pour poser un peu le contexte, je reçois un email sur ma boite outlook. Celui-ci comprend l'ensemble des logs (accès internet) pour une période donnée. Et donc, ces informations se présentent de la manière suivante :

Mon, 2009-10-26 09:08:54 - Access site - Source:10.120.128.2,WAN - Destination:liveupdate.symantecliveupdate.com,WAN - [Forward] Mon, 2009-10-26 09:10:46 - Access site - Source:10.120.128.2,WAN - Destination:mm.123cmail.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/picto/fr/90x90tth.gif,WAN Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:ads.leadium.com,WAN - [Forward] Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:wm.wizzms.com,WAN - [Forward] Mon, 2009-10-26 09:11:37 - Access site - Source:10.120.128.2,WAN - Destination:c.astrocenter.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/bigpicto/fr/300x250_fr2k2.jpg,WAN

Et donc, j'aimerais renvoyé ces données dans un fichier Excel, en les classant de la manière suivante : la date, l'heure, le type d'accès (autorisé / bloqué), la source, et enfin la destination !

Donc voila ! Déjà je ne sais pas trop comment séparer toutes ces lignes, et puis après les décomposer ! Mon problème c'est que en fonction de l'accès les lignes sont différentes !

Je m'explique : au départ je pensais utiliser "WAN" pour séparer mes lignes, mais c'est pas bon car si on a un accès autorisé ("Access Site"), la ligne à deux fois le mot WAN..
Donc j'ai pensé à WAN - [FORWARD], mais si c'est un site bloqué ("Attempt to access blocked sites") il n'ya que le WAN et le FORWARD n'est plus...

Donc je vois pas très bien comment m'en sortir, et à vrai dire, je ne vois pas trop non plus comment, une fois les données séparés, insérer celles-ci correctement dans mon fichier Excel (je le crée avec une procédure je peux la poster si besoin) !

En tout cas, j'ai récupéré le corsp du mail et j'ai insérer les informations dans ma variable, il me reste le traitement !

Merci d'avance à tous :)

Peace :D
 

job75

XLDnaute Barbatruc
Re : Mise en forme de texte brut vers un fichier Excel

Bonjour GarnierFlorian,

Apparemment les parties à isoler sont séparées par " - ".

En supposant que vous avez mis le texte en A1, essayez cette petite macro :

Code:
Sub EclateTexte()
Dim i As Integer
For i = 0 To UBound(Split([A1], " - "))
[A3].Offset(i) = Split([A1], " - ")(i)
Next
End Sub

Ensuite adaptez ce code comme vous le désirez et mettez-le dans votre macro de récupération.

A+
 
Dernière édition:

GarnierFlorian

XLDnaute Nouveau
Re : Mise en forme de texte brut vers un fichier Excel

Bonjour job75,

Deja je vous remerci de m'avoir répondu :)

Sinon je voulais avoir quelque précision par rapport à la macro : pour l'utiliser, il faut que au préalable j'ai inséré mes données dans la cellule A1, ou je peux directement utilisé une variable ?

Parce que le poblème c'est que je n'aurais pas qu'un seul mail, et que je souhaite que les données s'affichent à la suite de celle qui pourrait être déjà enregistrées ! Donc si on indique la cellule en dur, ça risque de poser problème ??

A moins que je ne laisse une cellule vide qui servira seulement à stocker les données le temps du traitement ?

Sinon, et pour finir^^, j'ai une petite instruction qui me permet de connaitre le numéro de la dernière ligne utilisée dans le fichier, est ce que je pourrais faire de la manière suivante :

Code:
'Donne la dernière ligne plus deux, pour laisser un espace entre les données déjà présentes et les nouvelles données.
derniereLigne = Cells.SpecialCells(xlCellTypeLastCell).Row + 2

Sub EclateTexte()
Dim i As Integer
For i = 0 To UBound(Split([A & derniereLigne], " - "))
[A & derniereLigne + 2].Offset(i) = Split([A & derniereLigne], " - ")(i)
Next
End Sub
 

GarnierFlorian

XLDnaute Nouveau
Re : Mise en forme de texte brut vers un fichier Excel

Bonjour à tous !

Bon j'ai déjà pas mal avancé ! Avec le code suivant, la procédure colle les informations correctement dans le fichier excel que j'ouvre pour tester :

Code:
Sub ExtractInfo()
 
Dim MyArray() As String, MyArrayB() As String, _
MyArrayC() As String, MyArrayD() As String, _
MyArrayE() As String, MyArrayF() As String, _
strChaine As String
 
Dim i As Integer, j As Integer, k As Integer, _
p As Integer, q As Integer, t As Integer, _
n As Integer
 
Dim x As Byte, y As Byte
 
Dim Cel As Range, LaPlage As Range
 
'/*****  Initialisation des variables *****/'
j = 0
p = 0
q = 0
 
 
strChaine = "Mon, 2009-10-26 09:08:54 - Access site - Source:10.120.128.2,WAN - Destination:liveupdate.symantecliveupdate.com,WAN - [Forward] Mon, 2009-10-26 09:10:46 - Access site - Source:10.120.128.2,WAN - Destination:mm.123cmail.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/picto/fr/90x90tth.gif,WAN Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:ads.leadium.com,WAN - [Forward] Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:wm.wizzms.com,WAN - [Forward] Mon, 2009-10-26 09:11:37 - Access site - Source:10.120.128.2,WAN - Destination:c.astrocenter.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/bigpicto/fr/300x250_fr2k2.jpg,WAN"
 
'/******** Split de strChaine avec comme paramètre "WAN" et
'/ stockage dans une var. Tableau *******/'
 
MyArray = Split(strChaine, "WAN")
 
For i = 0 To UBound(MyArray())
    
    If MyArray(i) Like "*blocked*" Then
            ReDim Preserve MyArrayB(0 To j)
            MyArrayB(j) = ReplaceStr(MyArray(i))
            j = j + 1
        
    ElseIf MyArray(i) Like "*Access site*" Then
            ReDim Preserve MyArrayD(0 To p)
            MyArrayD(p) = ReplaceStr(MyArray(i))
            p = p + 1
        
    ElseIf MyArray(i) Like " - Destination*" Then
            ReDim Preserve MyArrayE(0 To q)
            MyArrayE(q) = ReplaceStr(MyArray(i))
            q = q + 1
        
    End If
 
Next i
 
 
With Worksheets("Feuil1")   ' A adapter en fontion du nom de la feuille Cible
 
'/******** Split de chaque ligne de MyArrayB avec comme
'/ paramètre " - " et stockage dans une var. Tableau *******/'
 
For k = 0 To UBound(MyArrayB())
            
        MyArrayC = Split(MyArrayB(k), " - ")
        ReDim Preserve MyArrayC(0 To UBound(MyArrayC()))
        Range("A" & k + .Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(, UBound(MyArrayC()) + 1) = MyArrayC
         
Next k
 
For t = 0 To UBound(MyArrayD())
        MyArrayF = Split(MyArrayD(t) & MyArrayE(t), " - ")
        ReDim Preserve MyArrayF(0 To UBound(MyArrayF()))
        Range("A" & .Cells(Rows.Count, 2).End(xlUp).Row + 1).Resize(, UBound(MyArrayF()) + 1) = MyArrayF
Next t
 
 '/************ Supp. Cells Vides & Mise en forme ******
 '/*****************************************************
 
 For n = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
    With .Cells(n, 2)
        If .Offset(0, -1).Text = "" Then .Offset(0, -1).Delete xlToLeft
    End With
Next
 
Set LaPlage = .Range("A2:A" & .Cells(Rows.Count, 2).End(xlUp).Row)
 For Each Cel In LaPlage
    For x = 1 To Len(Cel)
        If IsNumeric(Mid(Cel, x, 1)) Then
        y = x
        Exit For
        End If
    Next x
    Cel.Value = Mid(Cel.Text, y, Len(Cel) - y + 1)
 Next Cel
 
End With
 
Erase MyArray
Erase MyArrayB
Erase MyArrayC
Erase MyArrayD
Erase MyArrayE
Erase MyArrayF
 
End Sub
 
Function ReplaceStr(strCh As String) As String
    
    Dim ReplaceStr1 As String, ReplaceStr2 As String, _
        ReplaceStr3 As String, ReplaceStr4 As String
    
        ReplaceStr1 = Replace(strCh, "[Forward]", "")
        ReplaceStr2 = Replace(ReplaceStr1, "Source:", "")
        ReplaceStr3 = Replace(ReplaceStr2, "LAN", "")
        ReplaceStr4 = Replace(ReplaceStr3, ",", " ")
        ReplaceStr = Replace(ReplaceStr4, "Destination:", "")
 
End Function


Et en fait, moi je souhaite que ces infos s'ajoutent dans un fichier déjà existant, et donc j'ai modifié ma procédure (j'utilise une variable message que je passe en paramètre et qui correspond exactement a strChaine) :



Code:
Sub Essai()

Dim strChaine As String

strChaine = "Mon, 2009-10-26 09:08:54 - Access site - Source:10.120.128.2,WAN - Destination:liveupdate.symantecliveupdate.com,WAN - [Forward] Mon, 2009-10-26 09:10:46 - Access site - Source:10.120.128.2,WAN - Destination:mm.123cmail.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/picto/fr/90x90tth.gif,WAN Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:ads.leadium.com,WAN - [Forward] Mon, 2009-10-26 09:10:47 - Access site - Source:10.120.128.2,WAN - Destination:wm.wizzms.com,WAN - [Forward] Mon, 2009-10-26 09:11:37 - Access site - Source:10.120.128.2,WAN - Destination:c.astrocenter.fr,WAN - [Forward] Mon, 2009-10-26 09:11:38 - Attempt to access blocked sites - Source:10.120.128.2,LAN - Destination:yahoo.astrocenter.fr/imgmails/bigpicto/fr/300x250_fr2k2.jpg,WAN"

InsertIntoExcel (strChaine)

End Sub




Sub InsertIntoExcel(ByVal message As String)
 
Dim myArray() As String, myArrayB() As String, _
myArrayC() As String, myArrayD() As String, _
myArrayE() As String, myArrayF() As String


Dim xlApp As Excel.Application
Dim xl_Book As Excel.Workbook
Dim xl_Sheet As Excel.Worksheet
Dim xlApp_Cree As Boolean
Dim xl_Book_Cree As Boolean
Dim cheminFic As String

'strChaine As String
 
Dim i As Integer, _
m As Integer, n As Integer, o As Integer

Dim j As Integer, k As Integer, l As Integer
 
Dim x As Byte, y As Byte
 
Dim cel As Range, laPlage As Range
 
'Initialisation des variables
cheminFic = ""
m = 0
n = 0
o = 0
 
'Evite le message d'erreur lors du test de l'existence de l'instance Excel
On Error Resume Next

    'Test l'existence d'une instance Excel
    Set xlApp = GetObject(, "Excel.Application")
    
        'Si il n'y en a pas on la crée
        If xlApp Is Nothing Then
    
            Set xlApp = CreateObject("Excel.Application")
                xlApp_Cree = True
            
        Else
                    
            xl_Book_Cree = True
                    
    End If
    
On Error GoTo 0

'On ouvre le fichier Excel
cheminFic = "R:\GARNIER\Rapport\Rapport.xls"
Set xl_Book = xlApp.Workbooks.Open(cheminFic)

'On désactive la mise à jour de l'écran pour accélérer l'exécution du code
Application.ScreenUpdating = False


'Split de message avec comme paramètre "WAN" et stockage dans le tableau myArray

myArray = Split(message, "WAN")

'Pour chaque ligne récupérée dans le tableau pendant le traitement du message
For i = 0 To UBound(myArray())
    
    'Si il s'agit d'un site à accès bloqué, on insère la ligne dans le tableau myArrayB,
    If myArray(i) Like "*blocked*" Then
            
            ReDim Preserve myArrayB(0 To m)
            myArrayB(m) = ReplaceStr(myArray(i))
            m = m + 1
            
    'Sinon, si il s'agit d'un accès autorisé, on récupère le début de la chaine dans le tableau myArrayD
    ElseIf myArray(i) Like "*Access site*" Then
    
            ReDim Preserve myArrayD(0 To n)
            myArrayD(n) = ReplaceStr(myArray(i))
            n = n + 1
            
    'et on récupère la fin de cette chaine dans le tableau myArrayE  (à cause de la précense des 2 "WAN"
    'dans les chaines représentant un accès autorisé)
    ElseIf myArray(i) Like " - Destination*" Then
    
            ReDim Preserve myArrayE(0 To o)
            myArrayE(o) = ReplaceStr(myArray(i))
            o = o + 1
        
    End If
 
Next i

With xl_Book.Worksheets(1)

 
    'Split de chaque ligne de myArrayB avec comme paramètre " - " et stockage dans le tableau myArrayC
    For j = 0 To UBound(myArrayB())
                
            myArrayC = Split(myArrayB(j), " - ")
            ReDim Preserve myArrayC(0 To UBound(myArrayC()))
            Range("A" & j + .Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(, UBound(myArrayC()) + 1) = myArrayC
             
    Next j
    
    'Split de chaque ligne de myArrayD associé à myArrayE avec comme paramètre " - " et stockage dans le tableau myArrayF
    For k = 0 To UBound(myArrayD())
    
            myArrayF = Split(myArrayD(k) & myArrayE(k), " - ")
            ReDim Preserve myArrayF(0 To UBound(myArrayF()))
            Range("A" & .Cells(Rows.Count, 2).End(xlUp).Row + 1).Resize(, UBound(myArrayF()) + 1) = myArrayF
            
    Next k
    
    
    'Suppression Cellules Vides & Mise en forme
    For l = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
     
        With .Cells(l, 2)
        
            If .Offset(0, -1).Text = "" Then
                
                .Offset(0, -1).Delete xlToLeft
            
            End If
            
        End With
        
    Next
    
    'Permet la suppresion du jour (ex : "Mon") pour n'avoir que la date
    Set laPlage = .Range("A2:A" & .Cells(Rows.Count, 2).End(xlUp).Row)
        
        For Each cel In laPlage
            
            For x = 1 To Len(cel)
                
                If IsNumeric(Mid(cel, x, 1)) Then

                    y = x
                    Exit For

                End If
            Next x
'Pb depuis l'ajout de l'ouverure du fichier
            cel.Value = CDate(Mid(cel.Text, y, Len(cel) - y + 1))

        Next cel

End With

'Destruction des tableaux dynamiques
Erase myArray
Erase myArrayB
Erase myArrayC
Erase myArrayD
Erase myArrayE
Erase myArrayF

'Si on avai lancé une instance Excel on la ferme
If xlApp_Cree Then
    xlApp.Quit
ElseIf xl_Book_Cree Then
    xl_Book.Close
End If

'On réactive la mise à jour de l'écran
Application.ScreenUpdating = True

'On décharge les objets en mémoire
Set xlApp = Nothing
Set xl_Book = Nothing
Set xl_Sheet = Nothing
 
End Sub
 
'Fonction permettant de supprimer les informations inutiles
Function ReplaceStr(strCh As String) As String
    
    Dim replaceStr1 As String, replaceStr2 As String, replaceStr3 As String, replaceStr4 As String
        
        replaceStr1 = Replace(strCh, "[Forward]", "")
        
        replaceStr2 = Replace(replaceStr1, "Source:", "")
        
        replaceStr3 = Replace(replaceStr2, "LAN", "")
        
        replaceStr4 = Replace(replaceStr3, ",", " ")
        
        ReplaceStr = Replace(replaceStr4, "Destination:", "")
 
End Function

Et donc, j'ai deux problèmes :

- soit les infos ne sont pas insérées dans le fichier excel, soit elles sont insérées dans le fichier excel déjà ouvert (celui qui lance la macro)​

- j'ai un message d'erreur qui me dit : Argument ou Appel de procédures incorrect.​

Ce message d'erreur est entrainé par cette ligne :

Code:
cel.Value = CDate(Mid(cel.Text, y, Len(cel) - y + 1))

Bon, et bien merci par avance :)

Dans l'attente de vous lire,

Peace :D
 

Discussions similaires

M
Réponses
9
Affichages
477
Maikales
M

Statistiques des forums

Discussions
312 307
Messages
2 087 097
Membres
103 468
dernier inscrit
TRINITY