019. Ciclare in un range

Download PDF

Domanda:

ho un problema con la funzione CERCA.VERT che utilizzo tantissimo per i miei scopi.
Quesito:


ho delle tabelle tipo la seguente
prestazione     punti
7,30    20
7,23    19
….       ….
6,20    3
6,13    2
6,07    1

nelle quali vado a ricercare il punteggio al verificarsi di una prestazione.
Ora, nel caso in cui la prestazione è contemplata in tabella, ovviamente il problema non si pone, ma nel caso contrario, il problema c’è, eccome!
Tenga presente che per le prestazioni non contemplate in tabella, il punteggio da assegnare è quello della prestazione immediatamente inferiore. Ad esempio per le prestazioni 6,60 – 6,61 – 6,62 – 6,63 e 6,64 il punteggio da assegnare è 9.
In alcuni casi ho risolto artigianalmente inserendo tutte le prestazioni mancanti ed associando il relativo punteggio, ma le tabelle sono tante e soprattutto contengono migliaia di prestazioni.

Risposta:

per risolvere il suo caso ho utilizzato un paio di cicli For-Next e di If-Then

Il codice è il seguente:

Inibisco l’aggiornamento del folgio durante l’esecuzione della macro
> Application.ScreenUpdating = False

Identifico le ultime righe vuote di entrambi i fogli

> Last_Row1 = Sheet1.Cells.Find(“*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
> Last_Row2 = Sheet2.Cells.Find(“*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

Prendo in considerzione una per una le righe del foglio 1 (apro ciclo 1)
> For i = 2 To Last_Row1

Prendo in considerzione una per una le righe del foglio 2 (apro ciclo 2)
> For y = 2 To Last_Row2

Verifico che il valore nel foglio 1, colonna 2 sia uguale a quello del foglio 2 colonna 2

> If Sheet1.Cells(i, 2) = Sheet2.Cells(y, 2) Then

Verifico che il valore nel foglio 1, colonna 3 sia uguale a quello del foglio 2 colonna 1

> If Sheet1.Cells(i, 3) = Sheet2.Cells(y, 1) Then

se il valore arrotondato alla ottava cifra della colonna 4 del foglio 1
è uguale a quello del foglio 2 colonna 3

> If Round(Sheet1.Cells(i, 4), 8) = Sheet2.Cells(y, 3) Then

allora nel foglio 1 colonna 8 scrivo il valore del foglio 2 colonna 5

> Sheet1.Cells(i, 8) = Sheet2.Cells(y, 5)

se invece il valore arrotondato alla ottava cifra della colonna 4 del foglio 1
è maggiore a quello del foglio 2 colonna 3 ma minore o uguale a quello del foglio 2 colonna 3 della riga successiva

> ElseIf Round(Sheet1.Cells(i, 4), 8) > Sheet2.Cells(y, 3) And
Round(Sheet1.Cells(i, 4), 8) Next y

Chiudo ciclo 1

> Next i

Riabilito l’aggiornamento del folgio durante l’esecuzione della macro
> Application.ScreenUpdating = True

Ecco il file

Esempio_1

Ho inserito la macro “Test_SenzaColonneGialle” nel caso volesse eliminare le colonne in giallo da entrambi i fogli.

Riccardo Vincenti

The following two tabs change content below.