ciao prendendo spunto dai modi per velocizzare le operazioni, ho provato a sostituire il mio ciclo for con un match, prendendo spunto dalle discussioni degli ultimi giorni. ovviamente sono bloccato.
è da stamattina che cerco di capire dove è il problema ma non lo trovo.
il ciclo for funziona e impiega circa 5,3 secondi a finire
il mymtach non funziona ( e impiega meno di un secondo a finire )
i due fogli sono i soliti : giacenza e ordine.
ho più ordini di uno stesso articolo, con numero di righe variabile nell'arco della giornata.
con il ciclo for, faccio giacenza meno ordine e so quanto mi rimane ad ordine evaso, ( in verita faccio la somma di tutti gli articoli prima di confrontare con la giacenza, ma per provare ad implementare il match ho semplificato le azioni )
ora : con il ciclo for, arrivo alla fine, e ok, con il my match semplicemente copia la giacenza nel foglio ordini "ignorando" il match con l'articolo. Per cortesia che errore sto facendo? non ci arrivo proprio da solo...
allego file e codici ciclo for e match
http://www.filedropper.com/ortaggitestxmatrice
codice ciclo for
- Codice: Seleziona tutto
Sub matrice()
'Range("a2").Select
'Sheets("giacenza").Select
Dim numriga1 As Long
numriga1 = Sheets("ordine1").Range("D" & Rows.Count).End(xlUp).Row + 1 'prima riga libera
Sheets("ordine1").Select
a = 2
b = 2
myTim = Timer
For a = 2 To numriga1
For b = 2 To 301
If Cells(a, 4) = Sheets("giacenza").Cells(b, 1) Then
Cells(a, 10) = Sheets("giacenza").Cells(b, 4)
End If
Next b
Next a
' Cells(3, 10) = Cells(2, 8) - Sheets("giacenza").Cells(2, 4)
Cells(1, 9) = Cells(1, 9) + 1
Debug.Print Format(Timer - myTim, "0.00") 'Tempo necessario
End Sub
codice match
- Codice: Seleziona tutto
Sub matrice()
'qui ora proviamo con matrice
myTim = Timer
Dim taNew As Range, taOld As Range, LastN As Long, LastO As Long, myMatch
Dim I As Long, J As Long, taWidth, Mess As String
'
Set taNew = Sheets("ordine1").Range("A4") '<<< La tabella Nuova (Foglio e Range)
Set taOld = Sheets("giacenza").Range("a1") '<<< La tabella Precedente (Foglio e Range)
taWidth = 12 '<<< N° di colonne in tabella
'
LastN = taNew.Offset(Rows.Count - 100, 0).End(xlUp).Row 'Ultima riga Nuovo elenco
LastO = taOld.Offset(Rows.Count - 100, 0).End(xlUp).Row 'Ultima riga Vecchio elenco
For I = 1 To LastN
'For I = taNew.Row To LastN 'Confronta ogni riga del nuovo elenco col vecchio
myMatch = Application.Match(taNew.Cells(I, 1), taOld.Resize(LastO + J, 1), False)
If IsError(myMatch) Then
'Cells(I, 9) = "perche non va?"
Cells(I, 11) = taOld.Offset(J - 0, 3)
End If
Next I
Cells(1, 13) = Cells(1, 13) + 1
Debug.Print Format(Timer - myTim, "0.00") 'Tempo necessario
End Sub
considerate che il file reale, che sto usando con il ciclo for, conta circa 1400-1500 articoli di magazzino, contro circa 800 righe di ordine, e ogni volta che lancio il ciclo, impiega anche 45-50 secondi a completarsi