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.
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.
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...)
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.
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.
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.
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.
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.
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... ;-(
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.
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.
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
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.
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.
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.
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.