Tests sur toutes les lignes d'un CSV

nikkss

XLDnaute Nouveau
Bonjour le forum,

Faisant suite à mon précédent post, je dois réaliser des tests sur chaque ligne de plusieurs CSV.

Voici le test:
La première cellule de chaque ligne du fichier est un compteur qui ne doit jamais être inférieur à celui de la ligne de dessous. Il peut être égal ou supérieur. Je fais donc une comparaison entre la cellule du dessus et celle du dessous, et ça jusqu'à la fin du fichier. Et je réitère la manip pour tous les fichiers du répertoire sélectionné par l'utilisateur.

J'ai déjà un code qui fonctionne, mais cela me prend un temps monstre sachant que je charge chacun des fichiers csv sur ma feuille excel avant de faire les tests. Et j'ai des fichiers CSV de presque 1 millions de lignes..
Mon objectif est donc de réaliser les tests sans ouvrir les fichiers, mais est ce possible?

J'ai ouvert une autre discussion sur un sujet équivalent. Je devais connaître le nombre de lignes de ces mêmes fichiers. Je faisais la même manip, à savoir les ouvrir. Cela me prenait bcp trop de temps. Plusieurs méthodes m'ont été données par des membres du forum et cela fonctionne comme il faut malgré un temps de traitement anormalement long.

Est ce que quelqu'un a une idée sur cette manip?

Merci d'avance.
 

nikkss

XLDnaute Nouveau
Re : Tests sur toutes les lignes d'un CSV

Bien sûr:

Code:
Option Explicit
'
Public wbkRapport As Excel.Workbook
Public wbRapportErreur As Excel.Workbook
Public wbConformite As Excel.Workbook
Public wbFicCSV As Workbook
Public NbreOccurrences, Avancement As Integer

Public Sub Main()
Dim derlig, derligne As Integer
Dim i, j As Long
Dim cell, cellule, cheminCSV, ficCSV As Variant
Dim erreurDeltaX As Boolean

Application.ScreenUpdating = False
Set wbConformite = ActiveWorkbook

Set wbRapportErreur = Application.Workbooks.Open("Y:\Suivi Prod\UFM160\Data TIMON\Rapport pb DeltaX.xlsx")
With wbRapportErreur.Sheets(1)
    derligne = .Range("A" & Rows.Count).End(xlUp).Row
End With

Call Lister_Fichiers

With wbkRapport.Worksheets(1)
    Set cheminCSV = .Range("C2:C" & derligRapport)
End With

'- Nombre de fichiers
NbreOccurrences = 1 'Compteur correspondant aux occurrences de la boucle suivante

Set frmProgress = New frmStatus
Load frmProgress
frmProgress.Show

For Each cell In cheminCSV
    erreurDeltaX = False
    ficCSV = cell.Offset(0, -2).Value
    
    Load frmProgress
    frmProgress.Show
    Avancement = Int((NbreOccurrences * 100) / (derligRapport - 1))
    frmProgress.ProgressBar1.Value = (Avancement / 100) * (frmProgress.ProgressBar1.Max)
    frmProgress.Label1.Caption = "Tests sur le fichier: " & ficCSV
    frmProgress.Repaint
    
    wbConformite.Activate
    wbConformite.Sheets(1).Cells.Delete shift:=xlUp
    ' On charge sur la feuille principale les données du fichier CSV
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & cell _
        , Destination:=Range("$A$1"))
        '.CommandType = 0
        .Name = "CSV"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    With wbConformite.ActiveSheet
        derlig = .Range("A" & Rows.Count).End(xlUp).Row
        i = 2
        For j = 3 To derlig ' Première ligne à la dernière du fichier CSV
            ' Si le DeltaX est identique ou inférieur à celui de la ligne du dessous
            If (wbConformite.Sheets(1).Range("A" & i).Value < wbConformite.Sheets(1).Range("A" & j).Value) Or (wbConformite.Sheets(1).Range("A" & i).Value = wbConformite.Sheets(1).Range("A" & j).Value) Then
                i = i + 1
                GoTo suivant
                Else: wbRapportErreur.Sheets(1).Range("B" & derligne + 1) = i
                    wbRapportErreur.Sheets(1).Range("A" & derligne + 1) = ficCSV
                    derligne = derligne + 1
                    erreurDeltaX = True
                    GoTo suivant
            End If
                    
suivant: '-- mise à jour formulaire de progression
        Load frmProgress
        frmProgress.Show
        frmProgress.LblStatus.Caption = "Traitement de la ligne : " & i & " sur " & derlig
        frmProgress.Repaint
        Next j
        If erreurDeltaX = False Then
            wbRapportErreur.Sheets(1).Range("A" & derligne + 1) = ficCSV
            wbRapportErreur.Sheets(1).Range("D" & derligne + 1) = "Fic OK !"
            derligne = derligne + 1
        End If
    End With
    
    NbreOccurrences = NbreOccurrences + 1 'On incrémente le compteur

Next

Load frmProgress
frmProgress.Show
frmProgress.ProgressBar1.Value = (Avancement / 100) * (frmProgress.ProgressBar1.Max)
frmProgress.Label1.Caption = "!! TESTS TERMINES !!"
frmProgress.LblStatus.Caption = "Fin"
frmProgress.Repaint

'On fait une pause dans le code pour montrer la complétion de la waitingBarre à 100%
Application.Wait Time + TimeSerial(0, 0, 5)

frmProgress.Hide
Unload frmProgress
wbConformite.Sheets(1).Cells.Delete shift:=xlUp

End Sub

Le wbkRapport est un wb que j'initialise pour lister tous les fichiers du répertoire choisis par l'utilisateur.

Merci pour votre aide.
 

MJ13

XLDnaute Barbatruc
Re : Tests sur toutes les lignes d'un CSV

Re

Mais là, c'est plus complexe. Sur XLD en général, on répond à une partie du problème avec en général le fichier qui va avec.

Dans ton cas, on ne sait même pas les tenants et les aboutissants :confused:.

Pour moi, le plus rapide est en général de traiter le fichier ligne par ligne et exporter ce qui m'intéresse dans un autre fichier. Mais on ne sais pas si c'est possible dans ton cas, vu qu'on navigue à vue :confused:.
 

nikkss

XLDnaute Nouveau
Re : Tests sur toutes les lignes d'un CSV

Ok, alors je me permets de m'expliquer un peu plus dans ce cas.
J'ai n fichiers csv dans un répertoire choisis par l'utilisateur. Chacun de ces csv possède en première colonne, un compteur numérique. Ce compteur doit être égal ou inférieur au compteur de la ligne du dessous.

Mon objectif:
Pour chaque fichier CSV du répertoire,
Tester la conformité de l'évolution de ce compteur (est ce que la valeur de la cellule ("A" & i) est bien égale ou inférieure à la valeur de la cellule ("A" & i+1), jusqu'à la fin du fichier csv?).
Si non, noter la ligne et le nom du csv de la non conformité dans un fichier (ici "wbRapportErreur").
Si oui, noter "Fic OK!" et le nom du csv dans le fichier "wbRapportErreur".

L'idéal serait de pouvoir faire ceci sans avoir à ouvrir les csv. Cela me prend bien trop de temps.

Merci pour ton aide.
 

Statistiques des forums

Discussions
312 416
Messages
2 088 245
Membres
103 784
dernier inscrit
Métro-logue