Changer la propriété range.worksheet

haleakala

XLDnaute Nouveau
Bonjour,

J'ai constaté par hasard aujourd'hui que l'objet Range était lié à un objet Worksheet, et que cela ne pouvait pas être changé facilement.
Je m'explique au moyen d'un exemple:
Code:
dim rg1, rg2 as Range
dim ws1, ws2 as Worksheet

set ws1 = worksheets(1) 'dans notre exemple, feuille active
ws1.activate
set ws2 = Worksheets(2)

        With ws2
            .AutoFilterMode = False
            .Rows(1).AutoFilter
            .Rows(1).AutoFilter Field:=1,_
                Criteria1:="<>"
        End With

'par exemple, le résultat d'un filtre automatique sur la feuille 2
Set rg2= ws2.Cells.SpecialCells(xlCellTypeVisible) 
set rg1= Range("A:A")

'Et là l'erreur arrive
set rg1 = application.intersect(rg1, rg2)

L'objet rg1 est lié à la feuille 1 (car il semble qu'un set rg1 = range lie l'objet rg1 à la feuille active), rg2 à la feuille 2. Du coup, la fonction intersect me retourne une erreur.

J'avais pensé à un truc du genre
Code:
set rg2=rg2.address(rg2)
, mais il semble que la propriété address ne couvre pas forcément tout l'objet range... Notamment si on récupère les cellules visibles après un filtre automatique.

Une solution serait évidemment d'activer la feuille 2 avant d'utiliser la fonction intersect, mais je voudrais éviter de passer visuellement d'une feuille à l'autre.

Je me demandais donc comment je pourrais résoudre mon problème. Je pensais aux pistes suivantes, dont je n'ai pas encore trouvé de solution:
-activer une feuille en tâche de fond
-changer la propriété range.worksheet, ou trouver une solution qui remplace
Code:
set rg1= ws2.Range("A:A")
(ne marche pas, retourne un code d'erreur 1004)
-arriver à récupérer l'adresse d'un objet range qui soit complète.

Si vous avez des idées, je suis preneur!

Merci par avance,

Haleakala
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Changer la propriété range.worksheet

Bonjour Haleakala, bonjour le forum,

Je t'avoue que je n'ai même pas lu jusqu'à la fin car dès les premières lignes il y a une anomalie :

dim rg1, rg2 as Range
dim ws1, ws2 as Worksheet


cela signifie :

Dim rg1 as Variant
Dim rg2 as Range
Dim ws1 as variant
Dim ws2 as Worksheet

tu peux déclarer plusieurs variable dans la même ligne mais tu dois spécifier le type chaque fois sinon c'est le type Variant qui s'applique (par défaut) :

Dim rg1 as Range, rg2 as Range
Dim ws1 as Worksheet, ws2 as Worksheet

Ton problème ne viendrait-il pas de ça tout simplement ?
 

haleakala

XLDnaute Nouveau
Re : Changer la propriété range.worksheet

Bon en fait j'ai trouvé une parade pour forcer un objet Range à "passer" dans une autre feuille:
Code:
worksheets(2).activate
set rg2=range(rows(1))

'rg2 est lié avec la feuille 2

worksheets(1).activate

set rg1=range(cells(a,b),cells(c,d))
'rg1 est lié avec la feuille 1 rg2 avec la feuille 2, donc l'opération set rg1 = application.intersect(rg1, rg2) ne marche pas


'on veut maintenant que rg1 et rg2 soient liés avec la même feuille. On passe rg1 sur la feuille 2

stAdresse = rg1.address
set rg1=worksheet(2).range(stAdresse)

set rg1 = application.intersect(rg1, rg2)
'maintenant ca marche!

Attention cependant aux limitations: la propriété address a une taille limitée, si bien que parfois toutes les cellules d'un objet range donné ne rentrent pas dans le texte .address. C'était mon cas après avoir récupéré des cellules filtrées par un filtre automatique (cf 1er message de la chaîne).

Haleakala
 

Discussions similaires

Réponses
1
Affichages
195

Statistiques des forums

Discussions
312 480
Messages
2 088 757
Membres
103 948
dernier inscrit
atmosfaire