QUANTITA DATI DA ELABORARE




  • di scossa (utente non iscritto) data: 15/01/2014 09:20:02

    Purtroppo è un limite di Transpose, come puoi verificare dal codice sottoriportato.

    L'unica soluzione è dividere in due o più step. Al momento non ho tempo per darti un maggiore aiuto.
     
    Public Sub prova()
      Dim j As Long
      Dim sRow As String
      Dim aRow As Variant
      Dim vRow
      
      For j = 1 To 65536
        sRow = sRow & j & " "
      Next
      aRow = Split(Trim(sRow))
      With Application
        vRow = .Transpose(aRow)  <---- no problem
        Debug.Print UBound(vRow)
        ReDim Preserve aRow(0 To 65537)
        vRow = .Transpose(aRow) '<--- ERRORE
        Debug.Print UBound(vRow)
      End With
      
    End Sub
    



  • di leonardocarrani data: 16/01/2014 09:41:12

    @Scossa:
    Grazie mille, appena potrai, puoi darmi una mano?

    Grazie!
    Leonardo


    Se qualcun'altro è in grado di aiutarmi anche con altre soluzioni ve ne sarei grato.

    Grazie



  • di isy data: 16/01/2014 15:21:35

    Ciao

    Cit: Se qualcun'altro è in grado di aiutarmi anche con altre soluzioni...

    Per una migliore comprensione.
    Allega un esempio tratto dal foglio che utilizzi con poche righe senza dati sensibili con il risultato finale richiesto.



  • di leonardocarrani data: 17/01/2014 10:58:00

    Ho allegato un file di esempio, dove è già esistente la Macro1.
    La Macro1 copia le celle da A ad E presenti nel foglio1 dove nella cella F è presente "OK", e le copia nel foglio2.
    Funziona fino a che il numero degli "OK" non diventa importante.
    Dovendo elaborare file con circa 600000righe, di cui almeno 250000 con "OK" mi trovo in difficoltà perchè mi da errore.
    Ovviamente ci vorrebbe una soluzione anche veloce (mi sa che sto chiedendo un pochino troppo!!!)...

    Spero di essere stato sufficientemente esaustivo...!

    grazie
    Leonardo
     
    Sub MACRO1()
    '
    '
    '
    
    Application.ScreenUpdating = False
    
    Dim nStart As Single
    nStart = Timer
    
        
        Sheets("Foglio1").Columns("A:E").Select
        Application.CutCopyMode = False
        ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Columns("B:B") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("Foglio1").Sort.SortFields.Add Key:=Columns("A:A") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Foglio1").Sort
            .SetRange Columns("A:E")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        
        
        
        
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng1 As Range, cella As Range
      Dim vArr As Variant, sRow As String, nLR As Long
      
      
      Set ws1 = Sheets("Foglio1")
      Set ws2 = Sheets("Foglio2")
      nLR = ws1.Cells(Rows.Count, 6).End(xlUp).Row
      Set rng1 = ws1.Range("F1:F" & nLR)
      
      For Each cella In rng1
        If cella.Value = "OK" Then sRow = sRow & " " & cella.Row
      Next
      sRow = Trim(sRow)
      
      With Application
          vArr = .Index(ws1.Columns("A:E"), .Transpose(Split(sRow)), Array(1, 2, 3, 4, 5))
      End With
      nLR = ws2.Cells(Rows.Count, 1).End(xlUp).Row
      ws2.Range("A" & nLR + 1 & ":E" & UBound(vArr) + nLR) = vArr
      
      Set rng1 = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
        
    
    
    
    Application.ScreenUpdating = True
    
    MsgBox "Elaborazione eseguita in " & Timer - nStart
    
    
    End Sub
    
    



  • di scossa (utente non iscritto) data: 17/01/2014 14:57:49

    Sostituisci col codice sotto.
    Ho provato su oltre 266.000 righe con circa 76.000 OK e, sul mio pc ha impiegato quasi 50 secondi.

    Gestire 600.000 righe con Excel richiede un pc molto potente.
     
    Sub MACRO1()
    '
    '
    '
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng1 As Range, cella As Range
      Dim vArr As Variant, sRow As String, nLR As Long
      Dim nStart As Single
      Dim nOK As Long
      Dim aOK(1 To 100) As String
      Dim j As Integer
      
      Application.ScreenUpdating = False
    
    
      nStart = Timer
      Set ws1 = Sheets("Foglio1")
      Set ws2 = Sheets("Foglio2")
    
        With ws1.Sort
          .SortFields.Clear
          .SortFields.Add Key:=Columns("B:B") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
          .SortFields.Add Key:=Columns("A:A") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
          .SetRange Columns("A:E")
          .Header = xlGuess
          .MatchCase = False
          .Orientation = xlTopToBottom
          .SortMethod = xlPinYin
          .Apply
        End With
        
        
        
        
      
      nLR = ws1.Cells(Rows.Count, 6).End(xlUp).Row
      Set rng1 = ws1.Range("F1:F" & nLR)
      nOK = 0
      j = 1
      For Each cella In rng1
        If cella.Value = "OK" Then
          nOK = nOK + 1
          j = (nOK  65000) + 1
          aOK(j) = aOK(j) & " " & cella.Row
        End If
      Next cella
      
      For j = 1 To 100
        sRow = Trim(aOK(j))
        If sRow = "" Then Exit For
        With Application
            vArr = .Index(ws1.Columns("A:E"), .Transpose(Split(sRow)), Array(1, 2, 3, 4, 5))
        End With
        nLR = ws2.Cells(Rows.Count, 1).End(xlUp).Row
        ws2.Range("A" & nLR + 1 & ":E" & UBound(vArr) + nLR) = vArr
      Next j
      Set rng1 = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
        
    
    
    
    Application.ScreenUpdating = True
    
    MsgBox "Elaborazione eseguita in " & Timer - nStart
    
    
    End Sub
    
    



  • di leonardocarrani data: 17/01/2014 17:25:45

    Grazie Scossa, l'ho provato in un file nel computer di casa e sembra andare bene anche con grosse quantità di dati. Lunedì lo metterò nel file a lavoro dove ho anche un computer un pochino più performante e quindi dovrebbe essere anche più veloce.
    Appena hai tempo potresti spiegarmi il codice che hai fatto?
    Mi dispiace ma io non ci capisco proprio niente...!!!

    Grazie
    ancora
    Leonardo



  • di patel data: 17/01/2014 18:51:43

    ha fatto come ti aveva consigliato, creare un array di 100 stringhe di lunghezza non superiore a 65000. Ogni volta che nOK supera 65000 o i suoi multipli l'indice si incrementa di 1 e la funzione transpose/split viene applicata su ciascuna stringa





  • di patel data: 17/01/2014 19:02:18

    se lo usi sull'esempio allegato con 5 invece che 65000 nella riga
    j = (nOK 65000) + 1
    lanciando la macro con F8 step by step ti rendi conto del funzionamento





  • di scossa data: 17/01/2014 19:25:27

    cit.: "ha fatto come ti aveva consigliato, creare un array di 100 stringhe ..."

    A voler essere pignoli, con l'attuale numero di righe di Excel (1.048.576) sarebbe bastato un array da 17 elementi (1048576/65000), ma visto che gli altri elementi restano vuoti non credo cambi molto nell'efficienza della routine.



  • di isy data: 17/01/2014 23:04:42

    Ciao

    Scossa ha scritto: Gestire 600.000 righe con Excel richiede un pc molto potente.

    Concordo effettivamente ho provato con 600.366 righe e le formule presenti in colonna F di Foglio1 assorbono molte risorse io ho provato con 4 Gb ram su un portatile e si sono attivati tutti e 4 i processori...
    Il file che avevo provato era di 159 MB (167.768.064 byte)

    Se si rimedia a questa formula posso poi allegare un codice che termina la ricerca in soli 10 secondi...per riportare sul Foglio2 n° 61345 righe.




  • di leonardocarrani data: 17/01/2014 23:36:00

    la formula che mette gli "OK" in cella F si potrebbe anche eliminare, ma si dovrebbe fare un controllo in cella C direttamente sui codici della cella che poi sono quelli riportati in foglio3 e copiarli nel foglio2.
    Forse però impiega più tempo...



  • di scossa (utente non iscritto) data: 17/01/2014 23:38:39

    cit. isy: "Se si rimedia a questa formula posso poi allegare un codice che termina la ricerca in soli 10 secondi...per riportare sul Foglio2 n° 61345 righe."

    Filtro avanzato?



  • di isy data: 17/01/2014 23:43:29

    Ciao

    Vi allego il codice, mi raccomando verificate sempre che i dati estratti siano corretti.
    Questo il codice che ho utilizzato
     
    Sub Ricerca()
        Dim Via As Variant, Tot As Variant
        Dim Msec As Variant
        Via = GetTickCount
        Tot = Via
        
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
        Application.StatusBar = False
        Application.EnableCancelKey = xlDisabled
        ActiveWindow.View = xlNormalView
        ActiveSheet.PageSetup.PrintArea = ""
        ActiveSheet.DisplayPageBreaks = False
        Dim a         As String
        Dim b         As String
        Dim c         As String
        Dim d         As String
        Dim e         As String
        Dim x         As String
        Dim LastRow   As Long
        
        Sheets("Foglio2").Cells.ClearContents     'cancello tutti i dati di questo foglio
        
        With Range("F1:F" & Range("F" & Rows.Count).End(xlUp).Row)
        a = .Offset(, -5).Address
        b = .Offset(, -4).Address
        c = .Offset(, -3).Address
        d = .Offset(, -2).Address
        e = .Offset(, -1).Address
            x = .Address
            With Worksheets("Foglio2").Range("F1:F" & Range("F" & Rows.Count).End(xlUp).Row)
              .Offset(1, -5) = Evaluate("if(EXACT(" & x & ",""OK"")," & a & ","""")")
              .Offset(1, -4) = Evaluate("if(EXACT(" & x & ",""OK"")," & b & ","""")")
              .Offset(1, -3) = Evaluate("if(EXACT(" & x & ",""OK"")," & c & ","""")")
              .Offset(1, -2) = Evaluate("if(EXACT(" & x & ",""OK"")," & d & ","""")")
              .Offset(1, -1) = Evaluate("if(EXACT(" & x & ",""OK"")," & e & ","""")")
            End With
        End With
        Sheets("Foglio2").Select
        LastRow = Cells(Rows.Count, "A").End(xlUp).Row
        ActiveWorkbook.Worksheets("Foglio2").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Foglio2").Sort.SortFields.Add Key:=Range("A2:A" & LastRow) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Foglio2").Sort
            .SetRange Range("A2:E" & LastRow)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
          
        Application.EnableEvents = True
        Application.Calculation = xlCalculationAutomatic
        Application.StatusBar = True
        Application.ScreenUpdating = True
        
        Msec = GetTickCount - Via
        MsgBox Format$(Msec  3600000, "00") & ":" & Format$(((Msec - (Msec  3600000) * 3600000))  60000, "00") & ":" & Format$((Msec - (Msec  60000) * 60000) / 1000, "00.000")
      
    End Sub
    



  • di leonardocarrani data: 18/01/2014 11:51:25

    @isy

    Ciao, ho provato il tuo codice, ma cancella solamente i dati nel foglio2.
    Forse manca qualcosa?

    Grazie
    Leonardo



  • di isy data: 18/01/2014 12:02:26

    Ciao

    Ho dimenticato di inserire 2 righe di codice all'inizio del modulo..

    Ho aggiunto nel tuo file la macro vedi allegato
     
    Option Explicit
    
    Private Declare Function GetTickCount Lib "kernel32" () As Long



  • di scossa (utente non iscritto) data: 18/01/2014 13:22:26

    cit. scossa: "Filtro avanzato?"

    Intendevo filtro automatico, mi sembra la scelta più efficacie.

    La seguente macro mi pare la più veloce, provata sullo stesso file dell'altra (oltre 266.000 righe con circa 76.000 OK) e, sul mio pc ha impiegato meno di 5 (cinque) secondi.

    L'ho impostata sulla base del file di esempio, in cui i dati del foglio1 partono dalla riga 1 (senza intestazioni), ma sarà semplice adattarla a propria misura .
     
    Sub MACRO1()
    
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng1 As Range
      Dim nStart As Single
      Dim bCalc As XlCalculation
      
      With Application
        bCalc = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
      End With
      
      nStart = Timer
      Set ws1 = Sheets("Foglio1")
      Set ws2 = Sheets("Foglio2")
    
      With ws1.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Columns("B:B") _
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Columns("A:A") _
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Columns("A:E")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
        
      nLR = ws1.Cells(Rows.Count, 6).End(xlUp).Row
      Set rng1 = ws1.Range("A1:F" & nLR)
         
      rng1.AutoFilter
      rng1.AutoFilter Field:=6, Criteria1:="=OK", _
          Operator:=xlAnd
      rng1.SpecialCells(xlCellTypeVisible).Copy
      With ws2
        .Activate
        .Range("A2").PasteSpecial xlPasteValues
        .Range("A2").PasteSpecial xlPasteFormats
        If .Range("F2").Value <> "OK" Then .Range("A2:F2").Delete xlShiftUp
        .Columns(6).Clear
      End With
      ws1.Activate
      rng1.AutoFilter
    
      Set rng1 = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
    
      With Application
        .Calculation = bCalc
        .ScreenUpdating = True
      End With
    
      MsgBox "Elaborazione eseguita in " & Timer - nStart
    
    End Sub
    



  • di leonardocarrani data: 18/01/2014 14:06:59

    @isy e @scossa
    Grazie infinite...siete veramente forti...

    Ho provato entrambe le soluzioni...
    l'ultima di scossa mi elabora 255.000 righe con 132.000 "OK" in 27sec
    quella di isy in 13sec
    ho aggiunto nel codice di isy, 2 righe per ordinare i dati in foglio2 per data e ora.

    Comunque bravissimi e grazie perché sono veramente veloci...
    prima mi ci volevano circa 170sec...

    Quando avrete tempo e voglia potete spiegarmi passo passo i due codici visto che non conosco proprio niente di questo linguaggio e tutto quello che ho provato è nato dal registratore di Macro?

    Grazie ancora...
    Leonardo



  • di scossa data: 18/01/2014 14:50:31

    cit.: "l'ultima di scossa mi elabora 255.000 righe con 132.000 "OK" in 27sec
    quella di isy in 13sec "

    C'è qualcosa che non torna: ho provato su 266.940 con 132.697 OK e la mia ha impiegato 3,7 secondi contro i 5,4 di quella di Isy.
    Prova ad inserire anche nel mio codice le righe sotto (copia anche le righe di ripristino alla fine) e rifai il test.

     
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
        Application.StatusBar = False
        Application.EnableCancelKey = xlDisabled
        ActiveWindow.View = xlNormalView
        ActiveSheet.PageSetup.PrintArea = ""
        ActiveSheet.DisplayPageBreaks = False
    



  • di scossa data: 18/01/2014 14:51:29

    P.S.: ovviamente parlo del codice che sfrutta l'Autofilter.



  • di patel data: 18/01/2014 15:51:41

    il codice di isy è veramente complesso e lascio a lui la spiegazione, l'ultimo di scossa è semplicissimo, strano che non l'abbia pensato subito
    1) ordina il foglio 1 in base alle colonne B e A, inutile includere la colonna F con le formule
    2) applica il filtro alle righe che contengono OK
    3) copia le righe filtrate nel foglio2
    4) ordina il foglio2 per eliminare le righe vuote
    5) elimina la prima riga senza OK





  • di scossa (utente non iscritto) data: 18/01/2014 16:09:24

    cit. patel: "
    4) ordina il foglio2 per eliminare le righe vuote
    5) elimina la prima riga senza OK
    "
    Ciao patel,
    due precisazioni:
    punto 4) non ci sono istruzioni al riguardo nel mio codice, in quanto già ordinate sul foglio di origine, e vengono copiate solo le righe con OK, quindi niente righe vuote;

    punto 5) questo si rende necessario perché la prima riga, su Foglio1 è quella su cui si attiva il filtro automatico e, pertanto, viene comunque copiata sul Foglio2, indipendentemente che contengOK o no.



  • di scossa (utente non iscritto) data: 18/01/2014 16:15:57

    Ulteriore precisazione: il mio codice copia solo le righe interessate (le 132.697 con OK su 266.940), il codice proposto da isy copia tutte le 266.940. Questo comporta che ctrl+fine porta alla riga 266.941 e non all'ultima cella piena. Niente di grave, di massima, però la cosa potrebbe creare fastidi (non ho voglia di verificare di quanto aumentano le dimensioni del file).



  • di patel data: 18/01/2014 18:44:39

    Hai ragione Scossa, ho fatto confusione con la Macro di isy, il punto 4 non è presente nel tuo codice





  • di leonardocarrani data: 18/01/2014 21:01:29

    Aggiunto le righe suggerite da SCOSSA e fatte le prove...
    Con il mio PC lumaca di casa ecco i risultati (righe 255.784 e 132.217 "OK"):
    isy 13,02
    scossa 11,42

    favoloso...!!!

    Attacco il codice di Scossa con le righe che ha detto di aggiungere...
     
    Sub MACRO1BIS()
    
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng1 As Range
      Dim nStart As Single
      Dim bCalc As XlCalculation
      
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
        Application.StatusBar = False
        Application.EnableCancelKey = xlDisabled
        ActiveWindow.View = xlNormalView
        ActiveSheet.PageSetup.PrintArea = ""
        ActiveSheet.DisplayPageBreaks = False
    
      
      With Application
        bCalc = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
      End With
      
      nStart = Timer
      Set ws1 = Sheets("Foglio1")
      Set ws2 = Sheets("Foglio2")
    
      With ws1.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Columns("B:B") _
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Columns("A:A") _
          , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Columns("A:E")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
      End With
        
      nLR = ws1.Cells(Rows.Count, 6).End(xlUp).Row
      Set rng1 = ws1.Range("A1:F" & nLR)
         
      rng1.AutoFilter
      rng1.AutoFilter Field:=6, Criteria1:="=OK", _
          Operator:=xlAnd
      rng1.SpecialCells(xlCellTypeVisible).Copy
      With ws2
        .Activate
        .Range("A2").PasteSpecial xlPasteValues
        .Range("A2").PasteSpecial xlPasteFormats
        If .Range("F2").Value <> "OK" Then .Range("A2:F2").Delete xlShiftUp
        .Columns(6).Clear
      End With
      ws1.Activate
      rng1.AutoFilter
    
      Set rng1 = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
    
      With Application
        .Calculation = bCalc
        .ScreenUpdating = True
      End With
      
      
        Application.EnableEvents = True
        Application.Calculation = xlCalculationAutomatic
        Application.StatusBar = True
        Application.ScreenUpdating = True
    
    
      MsgBox "Elaborazione eseguita in " & Timer - nStart
    
    End Sub
    



  • di leonardocarrani data: 18/01/2014 21:06:06

    @scossa

    In un precedente post, dove chiedevo praticamente la stessa cosa, avevi avuto la intuizione di questo codice che era veramente una bomba...(come l'attuale, del resto:::!!!)
    Ma non ho mai potuto utilizzarlo perché cambiando il nome dei fogli e le colonne di riferimento, mi ha sempre dato errore sulla riga
    Intersect(rng.SpecialCells(xlCellTypeConstants, 2).EntireRow, ws1.Range("A:D")).Copy Destination:=ws2.Range("A" & nLR)
    anche se le righe con "OK" erano molte meno rispetto alle circa 65.000 con cui si bloccava l'altro codice...
     
    Sub Test2()
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng As Range, cella As Range
      Dim vArr As Variant, sRow As String, nLR As Long
      Dim nStart As Single
      
      nStart = Timer
      
      Set ws1 = Foglio1
      Set ws2 = Foglio2
      nLR = ws1.Cells(Rows.Count, 5).End(xlUp).Row
      Set rng = ws1.Range("E2:E" & nLR)
      nLR = ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1
     
      Intersect(rng.SpecialCells(xlCellTypeConstants, 2).EntireRow, ws1.Range("A:D")).Copy Destination:=ws2.Range("A" & nLR)
      
      Set rng = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
    
      MsgBox "Tabella copiata in " & Timer - nStart
    End Sub



  • di scossa (utente non iscritto) data: 18/01/2014 23:58:28

    cit.: "mi ha sempre dato errore sulla riga
    Intersect(rng.SpecialCells(xlCellTypeConstants, 2).EntireRow, ws1.Range("A:D")).Copy Destination:=ws2.Range("A" & nLR)
    anche se le righe con "OK" erano molte meno rispetto alle circa 65.000 con cui si bloccava l'altro codice..."

    Se non sbaglio ne avevamo già parlato.
    Devi dirci esattamente le celle/righe/colonne interessate.

    Allega il file.



  • di leonardocarrani data: 19/01/2014 10:09:36

    Visto che il controllo da fare era lo stesso, controllare celle con "OK" e copiarle in altro foglio, volevo capire come mai non funzionava...
    Il file da utilizzare è lo stesso, e il codice sotto è quello che ho modificato solo nei riferimenti delle celle, ma non funziona.
    Nessun problema, perché quello che mi hai fornito ora è perfetto.
    Volevo solo cercare di capire...sempre che ci riesca )

    Grazie
    Leonardo
     
    Sub Test2()
      Dim ws1 As Worksheet, ws2 As Worksheet
      Dim rng As Range, cella As Range
      Dim vArr As Variant, sRow As String, nLR As Long
      Dim nStart As Single
      
      nStart = Timer
      
      Set ws1 = Foglio1
      Set ws2 = Foglio2
      nLR = ws1.Cells(Rows.Count, 6).End(xlUp).Row
      Set rng = ws1.Range("F2:F" & nLR)
      nLR = ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1
     
      Intersect(rng.SpecialCells(xlCellTypeConstants, 2).EntireRow, ws1.Range("A:E")).Copy Destination:=ws2.Range("A" & nLR)
      
      Set rng = Nothing
      Set ws1 = Nothing
      Set ws2 = Nothing
    
      MsgBox "Tabella copiata in " & Timer - nStart
    End Sub



  • di scossa (utente non iscritto) data: 19/01/2014 11:16:17

    cit.: ".. controllare celle con "OK" e copiarle in altro foglio, volevo capire come mai non funzionava... "

    Perché le celle della colonna F contengono una formula e non un valore costante, quindi la il metodo rng.SpecialCells(xlCellTypeConstants, .... non trova alcuna cella.
    Come avevo spiegato a suo tempo, questa soluzione, nel tuo caso, è utilizzabile SOLO se le celle della colonna F contengono esclusivamente il valore "OK" o sono vuote.



  • di leonardocarrani data: 19/01/2014 14:13:08

    Perfetto capito...!



  • di patel data: 19/01/2014 14:16:53

    potresti prima mettere gli OK con una macro e poi utilizzare quella con SpecialCells