Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

ciclo "for" contro "match", non funziona il secondo :(

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

ciclo "for" contro "match", non funziona il secondo :(

Postdi marcus69 » 01/03/20 12:06

ciclo "for" contro "match", non funziona il secondo :(

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
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Sponsor
 

Re: ciclo "for" contro "match", non funziona il secondo :(

Postdi marcus69 » 01/03/20 14:07

ho appena provato variazione, leggo l'altro foglio ma non scala la riga porca miseria

Codice: Seleziona tutto
Sub matrice()
'qui ora proviamo con matrice
myTim = Timer
Sheets("giacenza").Range("a2:a300").Clear
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("a2:a300")   '<<< 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(Cells(I, 4), Sheets("giacenza").Range("a2:a300"), False)
    If IsError(myMatch) Then
Cells(I, 9) = "perche non va?"
Cells(I, 11) = myMatch
J = J + 1

    End If
Next I
Cells(1, 13) = Cells(1, 13) + 1
Debug.Print Format(Timer - myTim, "0.00")   'Tempo necessario

End Sub
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Re: ciclo "for" contro "match", non funziona il secondo :(

Postdi marcus69 » 01/03/20 17:04

dunque, sono arrivato a questo, con vlookup qualcosa ho risolto, ma secondo me può essere ottimizzato.

non ho qui il file che uso in ufficio ( non posso collegarmi alla vlan )

ma ho escluso almeno un ciclo for.

ecco il file: http://www.filedropper.com/ortaggitestx1ciclo

i due fogli di riferimento sono giacenze e ordine2

questo il codice da cui vorrei levare anche il primo ciclo for, qui l'esempio è con 3 righe di giacenza ( ne ho in verita 1500) e con 8 righe di ordine ( sono variabili fra le 800 e le 1200 )

Codice: Seleziona tutto
Sub cercavert()
'qui ora proviamo con cercavert
myTim = Timer
Sheets("giacenza").Range("e2:e11").Clear
Sheets("ordine2").Range("j2:j11").Clear

b = 2
c = 2

For b = 2 To 4

For c = 2 To 7
 If Sheets("giacenza").Cells(b, 1) = Sheets("ordine2").Cells(c, 4) Then

Sheets("giacenza").Cells(b, 5) = Sheets("giacenza").Cells(b, 5) + Sheets("ordine2").Cells(c, 8)
End If

Next c

Next b


' da qui funziona il cerca vert degli ordine2 verso la giacenza
Sheets("ordine2").Select
Sheets("ordine2").Range("j2:j11").Clear
a = 2
For a = 2 To 7
Cells(a, 9) = (Application.VLookup(Cells(a, 4), Sheets("giacenza").Range("a2:e5"), 4)) - (Application.VLookup(Cells(a, 4), Sheets("giacenza").Range("a2:e5"), 5))

Cells(a, 10) = Application.VLookup(Cells(a, 4), Sheets("giacenza").Range("a2:d5"), 4, False)
Next a
Cells(1, 13) = Cells(1, 13) + 1 ' colonna J
Debug.Print Format(Timer - myTim, "0.00")   'Tempo necessario

End Sub
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39

Re: ciclo "for" contro "match", non funziona il secondo :(

Postdi Anthony47 » 01/03/20 22:45

Se pero' ci dici quali calcoli devono essere fatti allora potra' essere piu' facile proporti non solo le modifiche a quanto stai facendo da solo ma (forse) anche qualcosa di piu'...
Avatar utente
Anthony47
Moderatore
 
Post: 17054
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: ciclo "for" contro "match", non funziona il secondo :(

Postdi marcus69 » 26/04/20 14:58

'aspetta, mi han cambiato la base dati, devo rivedere tutta la logica.
adesso ho un'importazione dal database che impiega circa 20 secondi, e poi due minuti per dei calcoli.

base dati magazzino, circa 1400 righe 8 campi
base dati ordini, circa 800 righe 14 campi

due minuti sono un'eternità

appena mi ci raccapezzo posto una richiesta comprensibile
marcus69
Utente Junior
 
Post: 91
Iscritto il: 19/10/17 14:39


Torna a Applicazioni Office Windows


Topic correlati a "ciclo "for" contro "match", non funziona il secondo :(":


Chi c’è in linea

Visitano il forum: Nessuno e 49 ospiti