Excel - sélection de plages multiples avec Range()

Fermé
David - 7 oct. 2015 à 17:26
 David - 8 oct. 2015 à 19:16
Bonjour,

J'ai besoin de sélectionner de nombreuses zones d'une feuille pour changer la couleur de fond.

Pour cela, j'ai créé une macro où je sélectionne des plages nommées :
Range("zone1, zone2, ... zoneX").Select


Mais si la chaîne "zone1, ...zoneX" dépasse 255 caractères, Excel affiche une erreur à l'exécution de la macro :
erreur 1004 : la méthode 'range' de l'objet '_global' a échouée


Ma question : y'a-t-il un moyen pour que Range traite une chaîne de plus de 255 caractères de manière à ne faire qu'une seule sélection ? ou suis-je obligé de procéder en plusieurs fois et donc de boucler sur plusieurs sélections ?

A voir également:

2 réponses

Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
7 oct. 2015 à 20:06
Bonjour,

Je ne comprend pas trop, une sélection sur excel est illimitée.

Pourriez-vous nous donner le code exact?

Cordialement.
1
Le code est assez simple.

ça, ça marche (la string cellules fait 250 caractères de long) :
Dim cellules as String
cellules = "zone_1, zone_2, zone_3, zone_4, zone_5, zone_6, zone_7, zone_8, zone_9, zone_10, zone_11, zone_12, zone_13, zone_14, zone_15, zone_16, zone_17, zone_18, zone_19, zone_20, zone_21, zone_22, zone_23, zone_24, zone_25, zone_26, zone_27, zone_28, zone_29"
Range(cellules).Select


ça, ça ne marche pas (la string cellules fait 259 caractères de long) :
Dim cellules as String
cellules = "zone_1, zone_2, zone_3, zone_4, zone_5, zone_6, zone_7, zone_8, zone_9, zone_10, zone_11, zone_12, zone_13, zone_14, zone_15, zone_16, zone_17, zone_18, zone_19, zone_20, zone_21, zone_22, zone_23, zone_24, zone_25, zone_26, zone_27, zone_28, zone_29, zone_30"
Range(cellules).Select


J'aurai pu changé le nom des zones en z_1, ... , z_30 mais c'est long
J'ai contourné le problème en faisant 2 sélections au lieu d'une (et donc en lançant 2 traitements au lieu d'un)
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
8 oct. 2015 à 08:57
Une chaîne de caractère d'une variable de type String peut contenir environ 2^31 (c'est de la théorie) caractères. Donc un peu plus de 2 milliards. Je doute que ça vienne de là. Il doit y avoir un autre problème dans votre code.

Où avez-vous défini les zones?
0
Les zones sont définies dans une feuille classique, à la main, et il n'y a aucune erreur de nommage (j'ai vérifié, plusieurs fois).

La définition d'une string de plus de 255 c ne pose aucun problème (voir le second exemple). c'est uniquement le fait d'utiliser range(cellules) avec cellules > 255 c qui plante que ce soit en passant par une string ou en direct (range("zone1 ... zone30")).

(PS : j'ai aussi essayé de couper la chaine en la concaténant avec des &)
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 8/10/2015 à 18:14
Bonjour,

J'ai fait une petite recherche sur google pour voir si on peut fusionner des zone.
On ne trouve rien la dessus, mais après j'ai chercher si on pouvait fusionner des objets range. et voila
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa213609(v=office.11)?redirectedfrom=MSDN

J'ai trouvé la méthode Union.


Donc
Dim Cellules as range

Set Cellules = Application.Union(Range("zone_1"), Range("zone_2"),Range("zone_3"))

Cellules.select
0
David > PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019
Modifié par David le 8/10/2015 à 19:16
Merci, ça confirme ma recherche
0
Bonjour,

Je pense avoir trouvé : il semble bien qu'il y ait une limite de 255 caractères pour les strings utilisées en tant que paramètre d'une méthode (mais pas des sub ...) : pour des exemples, faire une recherche sur "excel vba 255 character limit parameter"

Le contournement est d'utiliser Union(Range("zone1")[, Range("zone2"...]) pour construire un Range comme dans mon cas.

Merci à Kuartz :)
1