Confronto Colonne



  • Confronto Colonne
    di NDakota (utente non iscritto) data: 08/09/2017 14:59:47

    Salve a tutti!

    Sto lavorando ad un file che deve fare essenzialmente il confronto tra un csv e la precedente versione dello stesso csv e verificare se sono stati aggiunti record.

    praticamente lavoro su 3 fogli, 2 sono per uso del file, il terzo foglio viene usato dall'utente per lanciare il confronto e visualizzare i risultati. Il codice (anche se non prefetto) funziona. L'unico problema é il tempo. Naturalmente per il test ho usato un file csv a righe limitate (meno di 30,000), e il metodo risolve la Marco in circa 2 minuti. Se peró metto il file che dovró confrontare (circa 400,000 righe), naturalmente, si prende tutta la notte. Il metodo che ho usato é un confronto cella per cella con la funzione MATCH. C'é qualche metodo piú veloce per effettuare il check?

    Allego il codice di questa funzione solamente.

    Grazie,
    Toti.
     
    Private Sub CompareColumns()
    
    Dim rngA As Range
    Dim rngB As Range
    Dim StrEv As String
    Dim StrSty, StrFab, StrDep, StrSubd, StrClas, StrSubCl As String
    Dim NewEvent() As String 
    Dim NewStyle() As String 
    Dim NewFabric() As String
    Dim NewDept() As String
    Dim NewSubDept() As String
    Dim NewClass() As String
    Dim NewSubCls() As String
    Dim m As Integer 
    
    i = 0
    
    Sheets("Old").Select
    Columns("H").Copy
    Sheets("New").Select
    Range("I1").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    Set rngA = Sheets("New").Range(Cells(1, "H"), Cells(Rows.Count, "H").End(xlUp))
    Set rngB = Sheets("New").Range(Cells(1, "I"), Cells(Rows.Count, "I").End(xlUp))
    
    
    For Each cell In rngA
    If IsError(Application.Match(cell.Value, rngB, 0)) Then
        StrEv = StrEv & Cells(cell.Row, "A").Value & ";"
        StrSty = StrSty & Cells(cell.Row, "F").Value & ";"
        StrFab = StrFab & Cells(cell.Row, "G").Value & ";"
        StrDep = StrDep & Cells(cell.Row, "B").Value & ";"
        StrSubd = StrSubd & Cells(cell.Row, "C").Value & ";"
        StrClas = StrClas & Cells(cell.Row, "D").Value & ";"
        StrSubCl = StrSubCl & Cells(cell.Row, "E").Value & ";"
    
    End If
    Next
    
    NewEvent = Split(StrEv, ";")
    NewStyle = Split(StrSty, ";")
    NewFabric = Split(StrFab, ";")
    NewDept = Split(StrDep, ";")
    NewSubDept = Split(StrSubd, ";")
    NewClass = Split(StrClas, ";")
    NewSubCls = Split(StrSubCl, ";")
    
    Sheets("Check").Select
    Range("A1000").End(xlUp).Offset(1, 0).Select
    m = UBound(NewEvent) ' Calcolo la lunghezza delle Matrici
    
    For i = 0 To m
        Selection.Value = NewEvent(i)
        ActiveCell.Offset(0, 1).Value = NewStyle(i)
        ActiveCell.Offset(0, 2).Value = NewFabric(i)
        ActiveCell.Offset(0, 3).Value = NewDept(i)
        ActiveCell.Offset(0, 4).Value = NewSubDept(i)
        ActiveCell.Offset(0, 5).Value = NewClass(i)
        ActiveCell.Offset(0, 6).Value = NewSubCls(i)
        ActiveCell.Offset(1, 0).Select
    Next i
    
    End Sub
    



  • di patel data: 09/09/2017 05:48:09

    hai detto "Sto lavorando ad un file che deve fare essenzialmente il confronto tra un csv e la precedente versione dello stesso csv e verificare se sono stati aggiunti record"
    I record sono righe, perché parli di colonne ?
    Per risolvere il problema probabilmente occorre cambiare approccio, allega un file di esempio con max 100 righe con dati e risultato desiderato