creer un objet Range deplus de 64 cellule

M

mowbray

Guest
J'ai un gros problème: je n'arrive pas à créer un objet range comportant plus de 64 cellules.

Je souhaite en fait créer un objet range renvoyant à une plage de cellule qui elle-même est le résultat d'une recherche de type

set c = ce.find (test, lookin:= xlvalue)
if not c is nothing then ... ( c est intégré dans la plage de cellule)

pour cela je créais une variable string qui s'incrémentait de l'adresse de la cellule:
list = C1,C2,C8,C9,...,c.address (false,false)

que je mettais en argument d'un objet range:

for each ce in range(list)...

Or cette méthode trouve ces limites lorsque le nombre de cellules dépasse 64 cellules (j'ai testé toutes les configurations possibles et il semble que seul le nombre de cellules cause l'échec de la méthode range)

Y a t'il une autre façon définir une plage range de plus de 64 cellules.

Pour l'instant je n'en trouve pas dans l'aide Excel ni dans mes bouquins de VBA ce qui me surprend assez, évidemment je pourrais créer une collection et lui ajouter les cellules qui m'intéressent comme de nouveaux Item mais j'ai besoin que qu'Excel les reconnaisse comme objet range pour y appliquer la fonction Find. Donc... je ne sais pas quoi faire

Si quelqu'un avait la formule secrète pour me sortir de là je lui serais infiniment reconnaissant
 
O

omicron

Guest
Bonsoir mowbray,

Voici un petit exemple qui doit répondre très simplement au problème posé.

'Initialisation des paramètres (pour tester)
Dim ce, rng As Range
Set ce = Range(Selection.Address)
test = "ABC"

'Constitution du range groupant les cellules dont le contenu vérifie le test
Set C = ce.Find(test, LookIn:=xlValues)
If Not C Is Nothing Then
FirstAddress = C.Address
Set rng = Range(C.Address)
Do
Set rng = Union(rng, Range(C.Address))
Set C = ce.FindNext(C)
Loop While Not C Is Nothing And C.Address <> FirstAddress
End If

'Coloriage des cellules contenant la valeur recherchée (pour vérifier)
If Not rng Is Nothing Then rng.Interior.ColorIndex = 5

J'ai testé avec plusieurs centaines de cellules, celà marche.

Bon courage pour la suite.

Cordialement ...
 
M

Moa

Guest
Salut Omicron !

Il y a un petit hic avec ta macro

Tant que tu sélectionnes des cellules avec des caractères pas de problème.

Mais si tu veux rechercher des chiffres cela pose un problème.

En effet, si tu recherches le chiffre 2, ta sélection va garder les cellules contenant, 2 , 22, a22 etc....

J'ai cherché le hic...mais pas moyen...!

Si tu as une idée.

Merci à toi

@ +

Moa
 
O

omicron

Guest
Bonsoir Moa

Comportement normal de la macro.

La méthode find de l'objet range ne cherche pas les cellules dont la valeur = xxx mais les cellules dont le contenu contient la chaine de caractères xxx.

Il est normal si tu cherches un 2 que les cellules contenant 22, A22, 2 soient sélectionnées puisqu'elles contiennent toutes un 2

Si tu veux sélectionner les cellules contenant non pas 2 en sous-chaîne mais 2 en mot entier tu peux modifier l'instruction demandant la recherche de la chaîne contenue dans test de la façon qui suit :
Set C = ce.Find(test, LookIn:=xlValues, LookAt:=xlWhole)

Mais attention si ta cellule contient "2 2" elle sera sélectionnée

Si tu veux sélectionner que les cellules contenant exclusivement la valeur testée, programmer la séquence suivante qui chaque fois qu'elle trouve la chaîne contenue dans test, vérifie si cette chaîne correspond au contenu complet de la cellule avant de chaîner le range

'Initialisation des paramètres (pour tester)
Dim ce, rng As Range
Set ce = Range(Selection.Address)
test = 2

'Constitution du range groupant les cellules dont le contenu vérifie le test
Set c = ce.Find(test, LookIn:=xlValues, LookAt:=xlWhole)


If Not c Is Nothing Then
FirstAddress = c.Address
Set rng = Range(c.Address)
Do
If c.Value = test Then
Set rng = Union(rng, Range(c.Address))
End If
Set c = ce.FindNext(c)
Loop While Not c Is Nothing And c.Address <> FirstAddress
End If

'Coloriage des cellules contenant la valeur recherchée (pour vérifier)
If Not rng Is Nothing Then rng.Interior.ColorIndex = 5

'
End Sub

En espérant avoir répondu à ta question


Cordialement.
 

Discussions similaires

Réponses
1
Affichages
194

Statistiques des forums

Discussions
312 443
Messages
2 088 474
Membres
103 863
dernier inscrit
OUIDDIR