Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Range Selection

6 réponses
Avatar
GL
Bonjour,

Existe-t-il une commande qui à partir d'un objet Range R, me renvoie
l'équivalent de la sélection R.Select mais sans modifier la sélection ?

Ceci pour le cas où il y a des cellules fusionnées (sinon ça n'a
clairement pas d'intérêt...)

Merci d'avance.

6 réponses

Avatar
DanielCo
Bonjour,
Explique ppourquoi tu ne peux pas te servir de la méthode Select (qui
est à éviter autant que possible).
Daniel


Bonjour,

Existe-t-il une commande qui à partir d'un objet Range R, me renvoie
l'équivalent de la sélection R.Select mais sans modifier la sélection ?

Ceci pour le cas où il y a des cellules fusionnées (sinon ça n'a
clairement pas d'intérêt...)

Merci d'avance.
Avatar
GL
Le 01/06/2014 13:10, DanielCo a écrit :
Bonjour,
Explique ppourquoi tu ne peux pas te servir de la méthode Select (qui
est à éviter autant que possible).
Daniel



Je voudrais pouvoir faire R.MergeArea où R n'est pas forcément une seule
cellule. Faire : For Each c in R.Cells: U=Union(U,C.MergeArea):Next c
ne suffit pas car il faut de plus que le résultat (U) soit rectangulaire
(comme pour .Select) : après la boucle, il faut encore regarder les
coordonnées de U de sorte qu'il soit la plus petite zone rectangulaire
contenant toutes ses cellules.



Bonjour,

Existe-t-il une commande qui à partir d'un objet Range R, me renvoie
l'équivalent de la sélection R.Select mais sans modifier la sélection ?

Ceci pour le cas où il y a des cellules fusionnées (sinon ça n'a
clairement pas d'intérêt...)

Merci d'avance.
Avatar
DanielCo
Set R = [D1:E10]
'D5:K6 sont fusionnées
R.Resize(R.Rows.Count, R.Columns.Count).Select
Daniel

Je voudrais pouvoir faire R.MergeArea où R n'est pas forcément une seule
cellule. Faire : For Each c in R.Cells: U=Union(U,C.MergeArea):Next c
ne suffit pas car il faut de plus que le résultat (U) soit rectangulaire
(comme pour .Select) : après la boucle, il faut encore regarder les
coordonnées de U de sorte qu'il soit la plus petite zone rectangulaire
contenant toutes ses cellules.
Avatar
GL
Le 02/06/2014 14:54, DanielCo a écrit :
Set R = [D1:E10]
'D5:K6 sont fusionnées
R.Resize(R.Rows.Count, R.Columns.Count).Select
Daniel



Exactement ! Mais sans sélectionner les cellules...
En fait on peut le faire avec Application.ScreenUpdatingúlse :
(A1:B1 sont fusionnées, les autres cellules ne le sont pas, et
je cherche à savoir la sélection correspondante à [B1:B2] : c'est
donc A1:B2)

Set SaveSelection = Selection ' Pour restauration
Application.ScreenUpdating = False
[B1:B2].Select: Set Result = Selection
SaveSelection.Select: Application.ScreenUpdating = True

Debug.Print Result.Address ' OK : $A$1:$B$2

Apparemment ScreenUpdating fonctionne aussi pour les feuilles, donc
on peut le faire en 3D :

Set Result = [B1:B2]

Set SaveSelection = Selection
Application.ScreenUpdating = False
For Each WS In ActiveWindow.SelectedSheets
WS.Activate: WS.Range(Result.Address).Select
Set Result = Union(Result, _
SaveSelection.Worksheet.Range(Selection.Address))
Next WS
SaveSelection.Worksheet.Activate: SaveSelection.Select
Application.ScreenUpdating = True

Donc je n'étais pas obligé de passer par les coordonnées... ;-(

Bonne journée.
Avatar
LSteph
Bonjour,

Les facteurs typiques de nuisances à la bonne mécanique d'excel et vba excel comme les fusions de cellules et les select peuvent pratiquement touj ours être évités. (Par ailleurs screenupdating false ne soustrait pas du tout l'exécution d'acrobaties quand on les prévoit dans le code, i l t'empêche simplement de voir leur déroulement à l'écran).

Pour utiliser la plage qu'on veut utiliser sans avoir à la sélectionne r avant avec un select pour finir par utiliser selection pour désigner la plage sélectionnée qu'on veut utiliser.

Il suffit de le faire directement en désignant cette plage exemple:

[A1:A10].copy [C4]

plutôt que

[a1:a10].select
selection.copy [C4]

Si tu ne veux pas utiliser de coordonnées mais des noms de plage existant s dans ton classeurs

[maplage].copy [cible]

Cela fonctionne aussi sur des cellules fusionnées.


Cordialement.

--
LSteph

Le dimanche 1 juin 2014 11:29:10 UTC+2, GL a écrit :
Bonjour,



Existe-t-il une commande qui à partir d'un objet Range R, me renvoie

l'équivalent de la sélection R.Select mais sans modifier la sélecti on ?



Ceci pour le cas où il y a des cellules fusionnées (sinon ça n'a

clairement pas d'intérêt...)



Merci d'avance.
Avatar
GL
Le 02/06/2014 16:32, LSteph a écrit :
Bonjour,

Les facteurs typiques de nuisances à la bonne mécanique d'excel et vba excel comme les fusions de cellules et les select peuvent pratiquement toujours être évités. (Par ailleurs screenupdating false ne soustrait pas du tout l'exécution d'acrobaties quand on les prévoit dans le code, il t'empêche simplement de voir leur déroulement à l'écran).

Pour utiliser la plage qu'on veut utiliser sans avoir à la sélectionner avant avec un select pour finir par utiliser selection pour désigner la plage sélectionnée qu'on veut utiliser.

Il suffit de le faire directement en désignant cette plage exemple:

[A1:A10].copy [C4]



Oui d'accord. Je voulais le range correspondant à .Select

En fait, ce que je veux au final, c'est le Range correspondant à
.Select, en considérant que les cellules qui ont .HasArray
(ie .FormulaArray) sont fusionnées.

Donc pour cela, le crois que je suis obligé de passer par
les coordonnées (.Row/.Column/.Rows.Count/.Columns.Count)
de chaque .Areas de la plage initiale :
1. => ajouter à la plage les cellules qui ont .HasArray et
dont le .CurrentArray intersecte cette plage
2. => agrandir si besoin le résultat de sorte qu'il soit
"l'enveloppe rectangulaire" de cette collection de cellules.
3. => si l'opération 2. a pour effet d'ajouter de nouvelles
cellules qui ont .HasArray, retourner au point n°1

Sinon .Offset est bien casse pied avec les cellules fusionnées :
Si A1:C1 sont fusionnées:
a) [A1].Offset(0,1) va en D1 ' pratique c'est vrai
b) mais : [A1:A2].Offset(0,1) va en B1:B2 ' incohérent avec a)
c) et : [B1].Offset(0,1) va encore en D1 ' incohérent avec b)

De sorte qu'on ne peut pas utiliser .Offset pour faire un décalage
absolu sur la feuille sans tenir compte des fusions.

Bonne journée.