Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ho riletto meglio i requisiti e, confortato dai risultati della formula di Paolo (che saluto), ho sistemato la routine. Decisamente più lenta, però, rispetto alla formula. Come prevedibile del resto. Ma ha un suo perché, non in questo caso, certo. Per cui per la curiosità dei pochi posto la versione attuale che dà i seguenti risultati:
Questa la routine:
Public Function GetMaxVal(ByVal Tabella As Excel.Range _
, ByVal CdR As Variant _
, ByVal DataInizio As Variant _
, ByVal DataFine As Variant _
) As Variant
On Error GoTo ErrH
Const adOpenStatic = 3
Const adLockReadOnly = 1
Dim cnn As Object 'ADODB.Connection
Dim rst As Object 'ADODB.Recordset
Dim sql As String
Application.Volatile True
Set cnn = CreateObject("ADODB.Connection")
With ThisWorkbook
'cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0" _
& ";Data Source=" & .Path & "" & .Name _
& ";Extended Properties=""Excel 8.0;HDR=YES""" _
& ";"
cnn.Open "Driver={Microsoft Excel Driver (*.xls)}" _
& ";DBQ=" & .Path & "" & .Name _
& ";"
End With
With Tabella
sql = "SELECT TOP 1 [CdR], [DE], [V]"
sql = sql & " FROM [" & .Worksheet.Name & "$]" _
& "[" & .Address(False, False) & "]"
sql = sql & " WHERE"
sql = sql & " [CdR]='" & CdR & "'"
sql = sql & " AND"
sql = sql & " [DE] BETWEEN" _
& " #" & Format$(DataInizio, "yyyy-mm-dd") & "#" _
& " AND" _
& " #" & Format$(DataFine, "yyyy-mm-dd") & "#"
sql = sql & " ORDER BY [DE] DESC"
sql = sql & ";"
End With
Set rst = CreateObject("ADODB.Recordset")
With rst
.Open sql, cnn, adOpenStatic, adLockReadOnly
If .BOF And .EOF Then
GetMaxVal = ""
Else
GetMaxVal = .Fields.Item("V").Value
End If
End With
ExtP:
On Error Resume Next
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
Exit Function
ErrH:
GetMaxVal = "#ERR!" & CStr(Err.Number)
Resume ExtP
End Function