J'ai besoin de comparer plusieurs fichier Excel pour voir si les mêmes postes reviennent régulièrement.
Toutes les informations sont entrer en dur dans le fichier excel, dans la colonne A
Ex pour la cellule A2:
W1184032,11/03/13 14:54:29,"Type du SE:Windows XP,Plate-forme de SE:Professional,Version du SE:5.1,Version de Service Pack du SE:Service Pack 3",4.6.0.1694,8.8.0.849.Wrk,5400.1158,10.148.4.18,6968.0000
Toutes les autres ligne sont du meme genre.
Il faudrait que je puisse obtenir le nombre de poste identique déterminer par une @IP
Et ensuite suivant leurs @IP determiné la date la plus ancienne du poste et la date la plus recente ou ils apparaissent
Pouvez vous m'aidez ?
A voir également:
Comparer plusieurs fichiers excel et déterminer les lignes identique
Désoler pour délai mais j'ai pas mal de choses à faire de mon coté.
Néanmoins voila un exemple (en faite j'ai presque tout est fait ;) ) :
La fonction "principale" est "Traitement"
Option Explicit
'Le format dans le quel sera afficher tes date heures au bout du compte
Private Const CoSt_FormatDateAttendu = "YYYY-MM-DD HH:mm:SS"
'Extrais la date de tes lignes (si le format est exactement celui que tu à posté)
Private Function ExtraiDate(ByVal Texte As String) As Date
On Error GoTo ErreurExtraiDate
ExtraiDate = Split(Texte, ",")(1)
Exit Function
ErreurExtraiDate:
ExtraiDate = 0
End Function
'Idem pour l'IP
Private Function ExtraiIP(ByVal Texte As String) As String
On Error GoTo ErreurExtraiIP
ExtraiIP = Mid(Texte, InStrRev(Texte, ",", InStrRev(Texte, ",") - 1) + 1, Len(Texte) - InStrRev(Texte, ",") + 1)
Exit Function
ErreurExtraiIP:
ExtraiIP = vbNullString
End Function
'Ajoute a une collection les info envoyé
Private Sub AjouteCollection(ByRef MaCollection As Collection, Valeur As String, Clef As String)
On Error GoTo ItemExiste
MaCollection.Add Clef & "|" & Valeur, Clef
Exit Sub
ItemExiste:
Dim NouvelleValeur As String
NouvelleValeur = MaCollection.Item(Clef) & "|" & Valeur
MaCollection.Remove Clef
MaCollection.Add NouvelleValeur, Clef
End Sub
Public Sub Traitement()
Dim CompteurLigne As Long
Dim DateLigne As Date
Dim IPLigne As String
Dim MaCollection As New Collection
Dim TableauTexte() As String
Dim CompteurTableau As Long
'"With ActiveSheet" veux dire que tu vas travailé sur la feuille active
With ActiveSheet
'Une ligne de titre est présente si non met 1 (pour 1ere ligne ^^)
CompteurLigne = 2
Do While .Cells(CompteurLigne, 1).Text <> ""
'Extraction la date
DateLigne = ExtraiDate(.Cells(CompteurLigne, 1).Text)
'Extraction de l'IP
IPLigne = ExtraiIP(.Cells(CompteurLigne, 1).Text)
'Si pas d'erreur durant l'extraction
If DateLigne <> 0 And IPLigne <> vbNullString Then
AjouteCollection MaCollection, Format(DateLigne, CoSt_FormatDateAttendu), IPLigne
Else
'Ici ajoute le code a exécuter si une de tes extraction ne c'est pas fait correctement
End If
CompteurLigne = CompteurLigne + 1
Loop
End With
'Arriver ici ta collection est remplie avec toutes tes informations
Do While MaCollection.Count > 0
'Chargement et découpage des données de ta collection
TableauTexte = Split(MaCollection.Item(1), "|")
'Suppression des données de ta collection
MaCollection.Remove 1
'Affiche les données dans la fenêtre de débug
Debug.Print "Voila l'IP : " & TableauTexte(0)
Debug.Print "Voila toutes les date heures de cette IP : "
For CompteurTableau = 1 To UBound(TableauTexte)
Debug.Print TableauTexte(CompteurTableau)
Next
Loop
End Sub
Habituellement je ne fait pas tout comme ça mais bref je n'ai pas le temps de polémiquer
Amicalement
PS :
Je n'en ferais pas plus, j'ai déjà fait presque tout ton code là
Pense à valider la réponse si tout vas bien
Recherches sur Google = émission de CO²
Recherches sur Forestle = 0,1 m² de forêt tropicale préservé.
Surfez écolo
Pour faire ce que tu veux tu doit :
Être capable d'extraire une IP de tes lignes
InStrRev pourras te renvoyé la position de certains caractère à partir d'un certain caractère et en partant de la fin.
Mid te permet de découper une chaine
Vue la structure de test ligne, logiquement ça devrais te retourné l'IP :
mid(texte,InStrRev(texte,",",InStrRev(texte,",")-1)+1,len(texte)-InStrRev(texte,",")+1)
Concernant la date heure en début de ligne utilise plutôt InStr mais le principe reste le même.
Ensuite il faut que tu sache si un IP à déjà été trouvé ou non.
Une Fonction du reçois l'IP et la date sous forme de texte, et l'ajoute dans une collection doit pouvoir te faire ça.
Attention il vas falloir gérer les erreurs car si tu tente d'ajouter un élément avec un clef déjà existante une erreur survient (mais cela te permet de savoir que l'IP existe déjà dans ta collection, donc ce n'est pas forcément négatif
Dans ce cas tu ajoute la date heure dans ta collection :
Private Sub AjouteCollection(ByRef MaCollection As Collection, DateHeure As String, IP As String)
On Error GoTo ItemExiste
MaCollection.Add DateHeure, IP
Exit Sub
ItemExiste:
MaCollection.Item(IP) = MaCollection.Item(IP) & "|" & DateHeure
End Sub
Une fois que tu auras envoyé toutes ces infos dans ta collection il faut que tu parcours tout les éléments de ta collection. Pour chacun de tes élément (IP) tu cherche la plus petite et la plus grande date (La fonction AjouteCollection à séparé toute tes date-heures par des |, la fonction Split te permet de redécouper facilement ces chaines : Split(ElementDeLaCollection,"|")
Reste à déterminer quel date est la plus petite et la quel est la plus grande (et le nombre de date) pour que tu ai toutes les infos en main
Bon courage
Amicalement
Recherches sur Google = émission de CO²
Recherches sur Forestle = 0,1 m² de forêt tropicale préservé.
Surfez écolo