Merci Jérome pour ta patience.
Visiblement, j'ai du mal à me faire comprendre.
Envoyé par
jfontaine
Une zone rectangulaire contient une plage de cellules contiguë, son adresse est A1:C2 alors qu'une plage disparate contient une adresse du type A1:A2,C1:C2,E1:E2
Oui, je savais cela... sauf que, comme je suis francisé, le caractère virgule ',' est réservé pour les nombres décimaux et le caractère pour unir des plages non contiguës est le point-virgule (A1:A2;C1:C2;E1:E2)... mais là n'est pas le problème...
Envoyé par
jfontaine
Tu peux dans ce cas tester l'existence d'une virgule
1 2 3 4 5
| If InStr(Selection.Address, ",") > 0 Then
MsgBox "ensemble disparate"
Else
MsgBox "plage rectangulaire"
End If |
Ok pour ça aussi... mais je n'ai pas accès à quoique ce soit du genre "Selection", Range("machin") ou autre... je n'ai que le variant passé en argument.. qui peut être directement un nombre ou bien une plage... contiguë ou non.
Envoyé par
jfontaine
Sans fichier avec exemple concret de ton problème il est difficile de comprendre ce qui ne va pas
Mon premier post me semble pourtant tout expliquer avec tous les détails nécessaires !
Reprennons donc pas à pas :
D'abord, créer la macro Test (version simplifiée à l'extrème de ma précédente) :
1 2 3 4 5 6 7 8 9 10 11 12 13
| Public Function Test(arg As Variant) As Long
Dim var As Variant, res As Long
res = 0
If IsNumeric(arg) Then
res = res + arg
ElseIf IsArray(arg) Then
For Each var In arg
res = res + var
Next
End If
Test = res
End Function 'Test |
Ensuite, dans une feuille vide, entrer les 4 cellules :
L1C1=11
L1C2=12
L2C1=21
L2C2=22
Puis définir les 2 plages nommées :
titi=Feuil1!L2C1:L2C2
;c.a.d. Faire Insertion/Nom/Définir, entrer le nom "titi" et sélectionner la plage en cliquant sur la cellule L2C2 puis, en maintenant la touche SHIFT enfoncée, sur la cellule L2C1. Valider.
toto=Feuil1!L2C1;Feuil1!L1C2
;c.a.d. Faire Insertion/Nom/Définir, entrer le nom "toto" et sélectionner la plage en cliquant sur la cellule L1C2 puis, en maintenant la touche CTRL enfoncée, sur la cellule L2C1. Valider.
Finalement, entrer les 6 formules suivantes :
L3C1=Test(-3)
L3C2=SOMME(-3)
L4C1=Test(titi)
L4C2=SOMME(titi)
L5C1=Test(toto)
L5C2=SOMME(toto)
Vous devriez obtenir les résultats donnés dans les pièces jointes.
On y voit que Test() réagit bien comme SOMME() sauf pour la ligne L5 où SOMME(toto) retourne 33 alors que Test(toto) retourne 21.
Si vous reprennez le résultat des debug.print de mon premier post, vous comprendrez que cette différence est due au fait que IsArray (et IsNumeric) ne réagissent pas logiquement (dans ma logique, du moins) avec l'argument toto.
La table de vérité observée est :
1 2 3 4
| arg IsArray(arg) IsNumeric(arg)
-3 False True
titi True False
toto False True |
D'où ma question :
Pourquoi le fait d'utiliser des plages de cellules contiguës ou non provoque des réactions différentes de IsArray et IsNumeric ?
Alternativement, comment contourner ce problème ?
Merci à tous.
Partager