Nell'ultimo periodo mi è giunta più di una richiesta per ottenere il valore massimo all'interno degli elementi di un array o, più semplicemente, tra due valori posti a confronto.
Ecco qui una semplicissima quanto rozza funzione che può tornare utile.
La funzione ha un unico parametro obbligatorio denominato Value1 di tipo variant che potrà rappresentare il nostro insieme di array o semplicemente il primo valore di confronto.
Se si passa un array di elementi, verrà attuato un contronto in funzione del tipo di dato.
In caso di valori testuali è anche possibile indicare il tipo di confronto (vbTextCompare, vbBinaryCompare, vbDatabaseCompare)
Prendendo spunto da questa funzione sarà possibile implemetarla per ottenere il valore minimo, medie ecc. ecc. ed accetatre come value1 anche oggetti quali dictionary ecc.
Vediamo alcuni esempi:
'
' Recuperare il valore massimo in un array di integer
'
Dim myArray(0 To 100) As Integer
Dim x As Integer
For x = LBound(myArray) To UBound(myArray)
myArray(x) = Int(1000) * Rnd() + 1
Next x
Debug.Print(getMax(myArray))
'
' Recuperare il valore massimo in un array di stringhe
'
Dim strArray() As String
strArray = Split("pippo,Pluto,Paperino,Minne", ",")
Debug.Print(getMax(strArray))
' Output: Pluto
'
' Recuperare il valore massimo in un array di stringhe (confronto binario)
'
Debug.Print(getMax(strArray, vbBinaryCompare))
' Output: pippo
'
' Recuperare l'indice dell'elemento maggiore nello stesso array di integer
'
Debug.Print(getMax(strArray, vbTextCompare, getIndex:=True))
' Output: 1
'
' Recuperare il valore massimo tra due elementi (stringhe)
'
Debug.Print(getMax("pippo", value2:="Pluto"))
' Output: Pluto
'
' Recuperare il valore massimo tra due elementi (numeri)
'
Debug.Print(getMax(21, value2:=3))
' Output: 21
Ed ecco la funzione getMax.
Per agevolarne la lettura ho collegato anche la funzione theMax richiamata da getMax per effettuare i confronti verificando la natura dei parametri.
Public Function getMax(ByRef value1 As Variant, Optional ByVal myCompare As VbCompareMethod = vbTextCompare, Optional ByVal value2 As Variant, Optional getIndex As Boolean = False) As Variant
'***********************************************************************************
'Func.: getMax (Creazione SB-11/06/2007; Mod.: )
'Desc.: Ottiene il valore massimo all'interno di un array
'DLL. :
'Par. : Value1 Array contenente gli elementi da confrontare.
' Se Value1 non è un array verrà confrontato con Value2
' [myCompare] Metodo di confronto (Default = vbTextCompare)
' [Value2] Secondo elemento di confronto
' [getIndex] Boolean indicante se voglio ottenere l'indice dell'elemento maggiore
'Ret. : Variant Valore massimo o indice nell'array dell'elemento maggiore
'***********************************************************************************
Dim x As Long
Dim MaxValue As Object
Dim MaxIndex As Long
'
' Verifico se sto trattando degli array
'
If IsArray(value1) Then
For x = LBound(value1) To UBound(value1)
MaxValue = theMax(value1(x), MaxValue, myCompare)
If value1(x) = MaxValue Then MaxIndex = x
Next x
Else
If IsMissing(value2) Then value2 = ""
MaxValue = theMax(value1, value2, myCompare)
MaxIndex = -1
End If
'
' Restituisco il valore ottenuto
'
If getIndex Then
getMax = MaxIndex
Else
getMax = MaxValue
End If
End Function
Private Function theMax(ByVal value1 As Object, ByVal value2 As Object, Optional ByVal myCompare As VbCompareMethod = vbTextCompare) As Object
'***********************************************************************************
'Func.: theMax (Creazione SB-11/06/2007; Mod.: )
'Desc.: Effettua il confronto fisico tra due elementi tenendo in considerazione la loro natura
'DLL. :
'Par. : Value1 Primo elemento di confronto
' Value2 Secondo elemento di confronto
' [myCompare] Metodo di confronto (Default = vbTextCompare)
'Ret. : Variant Valore massimo recuperato
'***********************************************************************************
If TypeName(value1) <> TypeName(value2) Or TypeName(value1) = "String" Then ' Considero come testo
theMax = IIf(StrComp(value1, value2, myCompare) = 1, value1, value2)
Else
theMax = IIf(value1 > value2, value1, value2)
End If
End Function
Per finire alcune note sull'utilizzo della sintassi:
Sintassi
getMax(value1, [myCompare, [value2, [getIndex]]])
La sintassi della funzione GetMax comprende questi elementi:
value1 Richiesto. Qualsiasi oggetto sia array che stringa o numero valido.
myCompare Opzionale. Specifica il tipo di comfronto per le stringhe.
value2 Opzionale. Stringa o numero di confronto in caso di comparazione a due elementi.
getIndex Opzionale. Boolean indicante se la funzione restituirà l'indice dell'elemnto e non il suo valore
Gli argomenti per per myCompare sono:
vbBinaryCompare 0 Confronto binario.
vbTextCompare 1 Confronto testuale.
vbDatabaseCompare 2 Non Supportato.
La funzione getMax restituirà un valore variant indicante il valore massimo riscontrato. Qualora fosse stato valorizzato a true il parametro getIndex, restituirà l'indice dell'array contenente l'elemento maggiore.