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
Ho inserito la macro “Test_SenzaColonneGialle” nel caso volesse eliminare le colonne in giallo da entrambi i fogli.
Riccardo Vincenti
Riccardo Vincenti
Ultimi post di Riccardo Vincenti (vedi tutti)
- 073. Duplicare righe excel modificando il contenuto - 6 Ottobre 2017
- 072. Estrazione numeri casuali - 6 Ottobre 2017
- 071. Estrazione casuale valori da un elenco - 5 Ottobre 2017
- 070. Contare dati univoci senza Pivot - 21 Settembre 2017
- 069. Aggiungere intervalli ad una data: Date Add in Excel - 21 Settembre 2017