Para este tipo de validações, eu uso o VBA + um truque sujo:
Primeiro, digite o editor do VBA com Alt + F11 Então, eu coloquei meu "Código de Validação de Lista Dinâmica" (tm) :) na respectiva planilha.
Private Sub Worksheet_SelectionChange(ByVal rTarget As Excel.Range)
On Error GoTo noVal
With rTarget.Validation
.Modify xlValidateList, xlValidAlertStop, xlBetween, Excel.Evaluate(.ErrorTitle)
End With
noVal:
End Sub
Este código atualiza a lista de validação da célula com a lista gerada pela fórmula inserida em Dados- > Validação- > Mensagem de erro- > Título. Desta forma, cada célula com validação de lista pode ter sua própria fórmula.
Em seguida, adiciono um módulo (Insert- > Module) e, em seguida, insiro este código no novo módulo:
Function GenDynList(rRng As Range)
sRet = ""
For Each rCell In rRng
If Not IsEmpty(rCell.Value) And InStr(sRet, rCell.Value) = 0 Then
sRet = sRet & "," & rCell.Value
End If
Next
GenDynList = Mid(sRet, 2)
End Function
Esta função retorna todas as células no intervalo sem espaços em branco ou repetições. Então, em cada célula com validação de lista, eu adiciono GenDynList (range) na Título da mensagem de erro da validação de dados.