Problème sous Excel 2003 VBA francisé (non testé avec d'autres versions)
Bonjour à tous,
J'ai un problème de réactions non homogènes de certaines fonctions VBA quand je leur passe une plage de cellules rectangulaire ou non.
Il y a donc visiblement une différence que je ne comprends pas entre ces deux types de plages.
Voici la mise en évidence de mon problème :
Dans une feuille vide, je n'ai que 4 cellulles contenant des entiers :
L1C1=11, L1C2=12, L2C1=21 et L2C2=22
Ensuite, j'ai nommé deux plages :
titi=Feuil1!L2C1:L2C2
toto=Feuil1!L2C1;Feuil1!L1C2
Enfin je fais trois appels à ma macro Test() avec :
Test(-3;"-3")
Test(titi;"titi")
Test(toto;"toto")
Ma macro est :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Public Function Test(zon As Variant, str As String) As Long
Dim arg As Variant, var As Variant
Dim res As Long
res = 0
Debug.Print ">" & str
arg = zon
'For Each arg In zon
If IsNumeric(arg) Then
var = arg
Debug.Print "N" & var
res = res + var
ElseIf IsArray(arg) Then
For Each var In arg
Debug.Print "A" & var
res = res + var
Next
Else
Debug.Print "?" & arg
End If
'Next
Test = res
Debug.Print "<" & res
End Function 'Test |
Et j'obtiens ce résultat :>-3
N-3
<-3
>titi
A21
A22
<43
>toto
N21
<21
Les deux premières correspondent bien à ce que j'attendais mais pas la troisième. Visiblement, la plage "titi" - constituée de 2 cellules en ligne - est bien détectée comme non numérique par IsNumeric() puis comme un tableau par IsArray() alors que la plage "toto" - constituée de 2 cellulles jointes - n'est pas vue, par les mêmes fonctions, comme un tableau mais comme une valeur unique !
Y a-t-il une raison pour qu'une plage sélectionnée en maintenant la touche SHIFT enfoncée ne réagisse pas comme une plage sélectionnée en maintenant la touche CTRL enfoncée ?
Si oui (j'aimerais bien comprendre pourquoi), y a-t-il un moyen de les traiter de la même façon ou de les transformer toutes les deux dans un même type de tableau/collection qui réagisse de façon identique ?
Note: ma macro Test est simplifiée pour cet exposé. Je cherchais à faire une macro qui gère ses arguments comme le font les macros SUM() ou MAX() d'Excel... ce qui sera plus compliqué, je le sais, mais là n'est pas ma question. Pourtant, si quelqu'un peut me fournir une référence d'un code qui simule la gestion des arguments de la macro MAX() par exemple, je serai preneur. 
Ce qui me turlupine plus pour l'instant, c'est de comprendre pourquoi ces deux types de plages ne réagissent pas de la même façon... j'ai peur d'avoir écrit, par le passé, un bon nombre de lignes de code à revoir !
Merci à tous ceux qui ont déjà eu la patience de me lire
Partager