Condividi:        

Cerca Ultima posizione

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

Cerca Ultima posizione

Postdi miko » 01/09/21 14:04

buongiorno, un saluto a tutti gli utenti.
ho bisogno del vostro aiuto per risolvere il seguente problema.
in una colonna, H, ho dei numeri e devo trovare l'ultima occorrenza di un numero generico
la funzione Match mi risulta trova la prima occorrenza.
allora ho pensato di invertire il range o la matrice che contiene la colonna,
cosi Match trova la posizione del numero e poi con un semplice calcolo deduco
la sua posizione effettiva nel range o matrice originaria.
in rete ho trovato questa piccola macro che risolve parzialmente il quesito

Codice: Seleziona tutto
Sub test()

Range("B3:B20").Value = WorksheetFunction.Transpose(Split(StrReverse(Join(Evaluate("transpose(H3:H20)"),"^;")),";^"))

End Sub


il codice inverte la colonna ma cambia i numeri
se inizialmente
range effettivo > applicando la macro > range invertito
1 .... 51
2 .... 21
10 .... 7
7 .... 1
12 .... 2
15 .... 1

il numero 15 e' diventato 51
il 12 diventa 21
il 10 diventa 1
in pratica tutti i numeri con 2 cifre vengono invertiti.
anche se intuisco che dipenda StrReverse, non riesco a modificare il codice per ottenere gli stessi numeri.
e' possibile modificare la macro oppure esiste una diversa soluzione, a parte un ciclo che inverte la successione dei numeri?
grazie saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: Reverse Range oppure Array

Postdi Anthony47 » 01/09/21 15:31

Cambiando approccio:

Codice: Seleziona tutto
Dim CercaIn As String, CercaCosa, LastXX

CercaIn = "K1:K100"     '<<< L'intervallo in cui cercare
CercaCosa = 3           '<<< Che cosa cercare
'
LastXX = Evaluate("=Max(If(" & CercaIn & "=" & CercaCosa & ",Row(" & CercaIn & "),""""))")

LastXX conterra' quale riga della colonna in cui cerchi contiene quel valore

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Reverse Range oppure Array

Postdi miko » 01/09/21 18:40

buonasera,
ho fatto un piccolo test e confermo che il tuo codice funziona.
grazie

ho provato con un range variabile del tipo:

Codice: Seleziona tutto
CercaIn = "B" & FirstRow & ":B" & LastRow
....
...

e funziona anche in questo modo.
fino ad ora abbiamo considerato 1 sola colonna; viene spontaneo chiedersi:

1) cosa cambia se consideriamo un range più esteso con più colonne del tipo:

Codice: Seleziona tutto
CercaIn = "B" & FirstRow & ":N" & LastRow
....
...

2) come si modifica nel caso di una matrice colonna scrivendo:

Codice: Seleziona tutto
Dim MyArray

 MyArray = Range ("B" & FirstRow & ":B" & LastRow).value
....
...

3) caso di una matrice con R righe e C colonne

Codice: Seleziona tutto
Dim MyArray

 MyArray = Range ("B" & FirstRow & ":N" & LastRow).value
....
...


ho provato con le matrici ma ho sempre errore, anche cambiando la Dim CercaIn
grazie

p.s. poiche' l'argomento non ha più nulla a che vedere con il reverse ho pensato che se vuoi e/o puoi cambiare il titolo del post
forse in "ultima occorrenza in range o array" sarebbe più appropriato per una futura ricerca
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi Anthony47 » 01/09/21 19:20

Esempio:
Codice: Seleziona tutto
CercaIn = "K1:N100"     '<<< L'intervallo in cui cercare

Ti restituira' sempre la riga piu' avanzata che contiene "CercaCosa", ma non ti dice la colonna

L'approccio non e' utilizzabile con array in memoria; potresti quindi fare:
Codice: Seleziona tutto
CercaIn = "B" & FirstRow & ":B" & lastRow     '<<< L'intervallo in cui cercare
CercaCosa = 4           '<<< Che cosa cercare
'
MyArray = Range(CercaIn).Value
LastXX = Evaluate("=Max(If(" & CercaIn & "=" & CercaCosa & ",Row(" & CercaIn & "),""""))")


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Cerca Ultima posizione

Postdi miko » 01/09/21 19:43

ciao ho provato l'ultimo codice
ma se in
LastXX = Evaluate(...
sostituisco CercaIn con MyArray ho errore " tipo non corrispondente "
quindi la linea MyArray = Range(CercaIn).Value sarebbe inutile
oppure sbaglio qualcosa
grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi miko » 01/09/21 20:14

buonasera,
sto testando le varie possibilità
se uso la notazione

Codice: Seleziona tutto
CelFirst = "B" & (NRowIni + 1)
Range(Range(CelFirst), _
                   Range(CelFirst).Resize(NRowFin - NRowIni, 1)).Select


dove NRowIni è la prima riga del range ed NRowFin l'ultima riga
come devo modificare la stringa CercaIn ?
oppure non e' possibile ?
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi Anthony47 » 01/09/21 20:37

ma se in
LastXX = Evaluate(...
sostituisco CercaIn con MyArray ho errore " tipo non corrispondente "
Te l'ho detto, quell'approccio non e' utilizzabile con Array in memoria.

quindi la linea MyArray = Range(CercaIn).Value sarebbe inutile
Io non so se myArray ti serve per altro; non mi serve (non con questo approccio) per cercare l'ultima presenza di qualcosa; quindi se non ti serve per altro lo puoi eliminare

se uso la notazione
Codice: Seleziona tutto
    CelFirst = "B" & (NRowIni + 1)
    Range(Range(CelFirst), _
                       Range(CelFirst).Resize(NRowFin - NRowIni, 1)).Select

dove NRowIni è la prima riga del range ed NRowFin l'ultima riga
come devo modificare la stringa CercaIn ?
Senza sconvolgere quello che hai fatto, puoi usare
Codice: Seleziona tutto
CercaIn = Selection.Address


Oppure direttamente, eliminando le tue due istruzioni (se il .Select non ti serve per altro):
Codice: Seleziona tutto
CercaIn = "B" & (NRowIni + 1) & ":B" & NRowFin


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Cerca Ultima posizione

Postdi miko » 02/09/21 06:40

buongiorno,
tutto molto chiaro,
la linea select serviva solo per evidenziare come individuare il range di ricerca,
la matrice serviva come "approfondimento" del codice che hai sviluppato.
va benissimo la soluzione che hai trovato.
grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi miko » 25/10/21 20:39

ciao,
una piccola modifica-richiesta
come si modifica, se è possibile, la linea di codice
LastXX = Evaluate(......)
se invece di cercare l'ultima occorrenza, si cerca la prima riga in cui compare il valore cercato
indipendentemente dalla colonna in cui esso è posto?
grazie buonasera
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi Anthony47 » 25/10/21 23:26

Invece di Max userai Min.
Ad esempio:
Codice: Seleziona tutto
CercaIn = "K1:N100"     '<<< L'intervallo in cui cercare
CercaCosa = 3           '<<< Che cosa cercare
'
LastXX = Evaluate("=Min(If(" & CercaIn & "=" & CercaCosa & ",Row(" & CercaIn & "),""""))")


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Cerca Ultima posizione

Postdi miko » 29/11/21 15:21

Salve,
dopo un lungo periodo di assenza non ho avuto modo di rispondere a questo ed agli altri ultimi miei post.
confermo che le soluzioni da te proposte funzionano, grazie.
quali sarebbero le equivalenti delle linee di codice precedenti se si vuole invece trovare la prima
oppure l'ultima colonna in cui si trova il valore cercato, sia nel caso di una sola riga che in un range di più righe
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: Cerca Ultima posizione

Postdi Anthony47 » 29/11/21 19:24

Sempre con lo stesso approccio:
Codice: Seleziona tutto
Dim CercaIn As String, LastXX, FirstYY, CercaCosa
'
CercaIn = "B3:B16"      '<<< Le righe in cui cercare
CercaCosa = 3           '<<< Che cosa cercare
'
CercaIn = Range(CercaIn).Resize(, 1000).Address
LastYY = Evaluate("=Max(If(" & CercaIn & "=" & CercaCosa & ",Column(" & CercaIn & "),""""))")
FirstYY = Evaluate("=Min(If(" & CercaIn & "=" & CercaCosa & ",Column(" & CercaIn & "),""""))")


LastYY calcola l'ultima colonna contenente il valore Cercato
FirstYY calcola la prima colonna contenente il valore Cercato

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Cerca Ultima posizione":


Chi c’è in linea

Visitano il forum: Nessuno e 51 ospiti