'Détermine si la chaine AdressePlage passée en paramètre est une adresse valide pour une plage de cellules de style A1 et R1C1
'Par défaut si la formule est de style R1C1, les adresses relatives comme R[1]C1 ne sont pas considérées comme valides
'Un nom de plage nommées n'est pas une adresse valide de plage
Function AdressePlageValide(AdressePlage As String, Optional RelatifAutorise As Boolean = False) As Boolean
Dim Classeur As Workbook
Dim Feuille As Worksheet
Dim AdrPourTest As String 'Chaine contenant l'adresse qui sera testée
'Détorunement de la gestion des erreurs car il est plus simple et plus rapide de prouver qu'une adresse est valide en testant l'existence d'une cellule à l'adresse testée (sinon il faut utiliser les regexp)
'Range a besoion d'une feuille de calcul (Worksheet) pour fonctionner, il doit y avoir au moins une feuille de calcul (Worksheet) disponible, si ce n'est pas le cas AdressePlageValide retourne faux
'Range ne fonctionne qu'avec le style A1, L'utilisation de Application.ConvertFormula permet de tester les références avec le style R1C1
'Application.ConvertFormula n'a pas besoin d'une feuille de calcul (Worksheet) pour fonctionner
'Application.ConvertFormula ne génère pas d'erreur et ne convertit pas quand il se sait pas convertir
'Application.ConvertFormula avec le paramètre xlR1C1 vers xlA1 retourne une adresse de style A1 sous la forme 'A1'
'Application.ConvertFormula avec le paramètre xlR1C1 vers xlA1 interprète Rn (R1, R2...) et Cn comme étant de la notation R1C1 valide et les convertit, cela ne pose pas de problèmes car il ne converti pas si c'est hors intervalle autorisé.
AdressePlageValide = False
On Error Resume Next
If AdressePlage = "" Then Exit Function 'Une adresse vide n'est pas valide
If Not RelatifAutorise And InStr(AdressePlage, "[") Then Exit Function 'Les adresses relatives ne sont pas autorisées, le caractère '[' est le marqueur d'une adresse relative
AdrPourTest = Replace(Application.ConvertFormula(AdressePlage, xlR1C1, xlA1), "'", "") 'On testera l'adresse convertie
If ActiveSheet.Type = xlWorksheet Then
If NomExiste(ActiveWorkbook, AdrPourTest) Then Exit Function 'Une plage nommée n'est pas une adresse valide de plage
AdressePlageValide = Not (Range(AdrPourTest) Is Nothing)
Else
For Each Classeur In Workbooks
For Each Feuille In Classeur.Worksheets
If NomExiste(Classeur, AdrPourTest) Then Exit Function 'Une plage nommée n'est pas une adresse valide de plage
AdressePlageValide = Not (Feuille.Range(AdrPourTest) Is Nothing)
Exit Function
Next Feuille
Next Classeur
'Si on arrive ici, on ne sait toujours pas si l'adresse est valide
End If
End Function
'Teste l'existence d'un nom dans l'objet passé en paramètre
'Inspiré par ça http://www.developpez.net/forums/archive/index.php/t-935375.html
'Préférer un workbook comme objet passé en paramètre
Function NomExiste(ObjetATester As Object, NomDePlage As String) As Boolean
Dim PlageNommee As Name
NomExiste = False
For Each PlageNommee In ObjetATester.Names
If PlageNommee.Name = NomDePlage Then
NomExiste = True
Exit Function
End If
Next PlageNommee
End Function