Ciao Pico,
Post by Pico1965Fornisco due soluzioni al problema, spero corrette.
https://www.dropbox.com/s/906tteyzxahwjtg/Trovare%20il%20nominativo%20pi%C3%B9%20vecchio.xlsx?dl=0
Non vorrei sembrarti petulante ma..
Non preoccuparti, mi pare una domanda del tutto legittima!
Post by Pico1965La formula con = "Operaio" quando arriva alla riga 6 trova la cella vuota ma fornisce l'esito corretto.
La stessa formula con <> "Operaio" quando arriva alla riga 6 e trova la cella vuota restituisce errore.
C'è una spiegazione a ciò?
Certo!
Difatti *tutte* le formule utilizzate restiscono l'errore #N/D nel caso
in cui la data in una riga di interesse sia vuota.
Nel caso del tuo esempio specifico, la riga 6 è vuota e, pertanto, per
una formula utilizzando la condizione > = "Operaio"
la formula ignorà quella riga e non restituirà un'errore.
All'opposto, quando una formula utilizzando la condizione
Post by Pico1965<> "Operaio"incontra la riga 6, che è vuota, interpreteterà la cella nella sua
colonna C come in accordo con la condizione perchè, ovviamente, una
cella vuota non può essere uguale al testo Operaio. Pertanto, come, hai
scoperto, in tal caso la formula restituirà un errore.
Più in generale, la funzione CONFRONTA, la quale viene sfruttata in
ognuna delle tue formule, restitiuirà sempre l'errore #N/D nel caso di
una cella di interesse vuota.
Per evitare eventuali problemi, forese potrsti prendere in
condiderazione l'uso della seguente funzione utente (UDF):
• Alt+F11 per aprire l'editor di VBA
• Alt+IM per inserire un nuovo modulo di codice
• Nel nuovo modulo vuoto, incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Public Function PiùAnziano(r As Range, _
sOperator, _
sCategoria As String) As Variant
Dim ArrIn As Variant
Dim i As Long
Dim dDate As Double
Dim sNome As String
Dim vVal As Variant
Dim bFlag As Boolean
ArrIn = r.Value2
dDate = Date
For i = 1 To UBound(ArrIn)
Select Case sOperator
Case "="
bFlag = ArrIn(i, 3) = sCategoria
Case "<>"
bFlag = ArrIn(i, 3) <> sCategoria
End Select
If bFlag Then
vVal = ArrIn(i, 2)
If vVal < dDate And Not IsEmpty(vVal) Then
dDate = ArrIn(i, 2)
sNome = ArrIn(i, 1)
End If
End If
Next i
If Not sNome = vbNullString Then
PiùAnziano = sNome
Else
PiùAnziano = CVErr(xlErrNA)
End If
End Function
'<<=========
• Alt+Q per chiudere l'editor di VBA e tornare a Excel
• Salva il file con l’estensione xlsm
Questa funzione, che non è matriciasle e quindi viene immessa con un
semplice invio, viene utilizzata come una funzione nativa di Excel; ad
esemmpio:
=PiùAnziano(Tabella1;"="; "Operaio")
Oppure:
=PiùAnziano(Tabella1;"<>"; "Operaio")
Potresti scaricare il mio file di prova
https://www.dropbox.com/s/jqgi4txd2tn8sye/Pico20180206.xlsm?dl=0
===
Regards,
Norman