Ciao,
Come ho accennato in precedenza, tutto dipende dai vari scenari e contesti.
Pertanto caso per caso si deve sceglere la tecnica più adatta allo scopo specifico e sempre se sussistono le condizioni.
Nel caso specifico che hai esposto:
- premesso che le celle di un certo range contengono delle date e una formattazione particolare
- premesso che il numero di celle da leggere da un certo range è abbastanza contenuto
- premesso che la ricerca deve essere di tipo "Esatto" ,deve restituire un valore esattamente uguale a quello ricercato
:
- il tipo di ricerca range.find non è consigliato :
- non consente di controllare le singole celle del range per verificare se il dato è coerente con il tipo Date posto in ricerca.
- potrebbe andare bene solo se si è al100% sicuri che le celle sono popolate tutte in modo corretto, con lo stesso formato, etc...
- il tipo di ricerca consigliabile potrebbe essere :
- un ciclo for each sul range di celle
- valutare se le celle in lettura contengono un valore di tipo Date
- convertire il valore delle celle in lettura e della data da ricercare, nello stesso tipo per effettuare un confronto coerente.
- questo consente di lavorare anche con formattazioni date di qualsiasi tipo, anche diverse tra di loro
- per esempio: se un giorno si decide di formattare le date in modo diverso, non ci si deve preoccupare di modficare la function con il codice di ricerca.
:
In considerazione delle premesse sopra riportate, personalmente agirei in questo modo:
' DEMO FIND DATE
Public Sub MyFindDate()
Dim valueFind As Variant
Dim cellRange As Range
Dim cell As Range
Dim cellFind As Range
' Set find value
valueFind = Range("B2").Value
' Set cells range
Set cellRange = Range("B4:J4")
' Reset interior color
cellRange.Interior.ColorIndex = xlNone
' Check is not valid date
If Not IsDate(valueFind) Then
MsgBox "Value to search is not a valid date", vbExclamation
Exit Sub
End If
' Search value
For Each cell In cellRange
If IsDate(cell.Value) Then
If CDate(cell.Value) = CDate(valueFind) Then
Set cellFind = cell
Exit For
End If
End If
Next cell
' Display result
If Not cellFind Is Nothing Then
' Set interior color
cellFind.Interior.Color = vbYellow
' Message show
MsgBox cellFind.Address & " - " & cellFind.Value, vbInformation
Else
MsgBox "No Match", vbCritical
End If
End Sub
E' un semplicissimo esempio in Demo dove si evidenzia alcuni controlli di validazione prima di eseguire la ricerca e all'interno della ricerca stessa:
- si effettua la ricerca solo se il valore da ricercare corrisponde a un tipo Date : If Not IsDate(valueFind)
- si effettua il controllo nel ciclo for each se la cella in fase di lettura è di tipo Date : If IsDate(cell.Value) Then
- si effettua il confronto convertendo la data da ricercare e il valore della cella in fase di lettura, nello stesso tipo : If CDate(cell.Value) = CDate(valueFind) Then
- alla fine della ricerca :
- se cellFind, oggetto range, risulta popolato vuol dire che la ricerca è andata a buon fine : restituisce l'oggetto range dove poter prelevare il Valore, l'Indirizzo, etc...
- se cellFind, oggetto range, NON risulta popolato vuol dire che la ricerca è fallita : l'oggetto range restituisce Nothing
:
N.B.
La Sub di esempio può essere trasformata in una Function parametrizzata che restituisce un oggetto range per valutare l'esito della ricerca
Esempio:
Function di ricerca (viene riportata nel moduloo di codice vba MyModSearch dell'excel Demo)
' SEARCH DATE CELLS
Public Function MySearchDate(ByVal cellRange As Range, ByVal valueFind As Variant) As Range
Dim cell As Range
' Check is not valid date
If Not IsDate(valueFind) Then
MsgBox "Value to search is not a valid date", vbExclamation
Exit Function
End If
' Search
For Each cell In cellRange
If IsDate(cell.Value) Then
If CDate(cell.Value) = CDate(valueFind) Then
' Function return value
Set MySearchDate = cell
Exit Function
End If
End If
Next cell
End Function
Come richiamare la Function di ricerca... esempio:
' Search execute
Dim resultSearch As Range
Set resultSearch = MySearchDate(Me.Range("B2:J2"), Me.Range("B10"))
' Retrieve return value
If Not resultSearch Is Nothing Then
Me.Range("B12").Value = resultSearch.Value
Me.Range("B13").Value = "Cell Range: " & resultSearch.Address
Else
Me.Range("B12").Value = "No Match"
Me.Range("B13").Value = ""
End If
Questo esempio si trova nel Foglio3 dell'excel Demo e nel Modulo di Codice Vba MyModSearch ...
inserendo una data da ricercare, viene ritornato il range dove si trova la corrispondenza (la data in valore e l'indirizzo della relativa cella:

Qui si può scaricare l'excel con i tre metodi di ricerca, quest'ultimo e quelle illustrate in precedenza :
https://www.transfernow.net/dl/20250527QoxBRah8
Note:
Fare attenzione, sono solo degli esempi, le stesse cose possono essere realizzate con metodi e tecniche diverse, per il proprio utilizzo verificare e implementare eventuali controlli.