Selection de plages multiples

Résolu/Fermé
Newby - 13 mai 2013 à 08:38
 Newby - 13 mai 2013 à 13:18
Bonjour à tous,

Alors voilà, je poste pour la première fois pour un problème de programmation en VBA (Je suis débutant).

L'idée est de sélectionner plusieurs plages de données consécutives séparées par un espacement constant et d'encadrer ces plages sélectionnées.

Voici l'extrait du code que j'ai utilisé mais qui ne fonctionne pas comme je le souhaite :


Sub FrameTheRange()
'
'
Application.ScreenUpdating = False
Range(Cells(10, 4), Cells(502, 11)).Select
For i = 87 To 1000 Step 83
For j = 93 To 1000 Step 83
Union(Selection, Range(Cells(10, i), Cells(502, j))).Select
Next j
Next i
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
End Sub


Je n'ai pas d'erreurs, mais au lieu de me sélectionner plusieurs plages de 8 de large et de 498 de haut il me sélectionne la première plage que je lui indique puis en créé une 2ème et c'est tout.


Comme j'ai pu déjà le lire, "Excel fais toujours ce qu'on lui demande et rarement ce que l'on souhaite", qu'est ce que je ne lui demande pas comme il faut ?


Merci d'avance pour votre aide,


Cordialement,


Robin

Windows8 / Excel 2013

3 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 13/05/2013 à 09:26
Bonjour,

1/Normal, tu boucles juste sur une selection de plage: tes next i et next j doivent être à la fin de ton code ci dessus

2/d'autre part pour encadrer tes plages
Range(Cells(10, i), Cells(502, j)).borders.weight=xlthin
on évite au maximum les select-selection très lents

3/ je ne comprend pas l'idée d'une fusion de ta plage de départ et les suivantes successives...
pourquoi ne pas parcourir uniquement que ces plages successivement car actuellement tu vas encadrer N fois la plage de départ

4/ afin d'éviter des clignotements de l'écran et aller + vite(env. 20x), mets en début de macro la ligne suivante qui fige le défilement de l'écran
application.screenupdating=false

5/"...Comme j'ai pu déjà le lire, "Excel fais toujours ce qu'on lui demande et rarement ce que l'on souhaite"....
Si tu pars avec cette croyance en cette phrase stupide d'un looser, arrête tout de suite d'utiliser Excel :o)



Michel
0
Tout d'abord, merci pour ta réponse rapide et structurée !

1/Normal, tu boucles juste sur une selection de plage: tes next i et next j doivent être à la fin de ton code ci dessus =>Pas bète, c'est même logique quand on le voit écrit

2/d'autre part pour encadrer tes plages
Range(Cells(10, i), Cells(502, j)).borders.weight=xlthin
on évite au maximum les select-selection très lents => Je modifie tout de suite, pourquoi faire compliqué quand on peut faire simple ? j'ai juste utilisé le borderaround pour n'encadrer que le contour de la plage sélectionnée

3/ je ne comprend pas l'idée d'une fusion de ta plage de départ et les suivantes successives...
pourquoi ne pas parcourir uniquement que ces plages successivement car actuellement tu vas encadrer N fois la plage de départ => Cc'était un essais pour voir si je m'y prenait bien

4/ afin d'éviter des clignotements de l'écran et aller + vite(env. 20x), mets en début de macro la ligne suivante qui fige le défilement de l'écran
application.screenupdating=false => Il me semble qu'il est présent, même si je ne savais pas à quoi ça servait, du coup je te remarcie pour éclairer ma lumière

5/"...Comme j'ai pu déjà le lire, "Excel fais toujours ce qu'on lui demande et rarement ce que l'on souhaite"....
Si tu pars avec cette croyance en cette phrase stupide d'un looser, arrête tout de suite d'utiliser Excel :o) => Mais non, je suis plutôt dans le genre persévérent!

Du coup pour ce qui est de l'évolution de mon problème, voila ce que donne mon code maintenant :

Sub FrameTheRange()
'
'
Application.ScreenUpdating = False
For i = 4 To (14 * 83) Step 84
For j = 12 To (14 * 83) Step 84
Range(Cells(11, i), Cells(502, j)).BorderAround LineStyle:=xlContinuous
Next j
Next i
End Sub

J'ai toutefois un petit problème qui subsiste, mes sélections se chevauchent j'ai l'impression, je n'en comprend pas la cause.

Pour imager, ça me donne quelque chose comme ca :
l_l___l_l___________ l_l___ l_l___________ l_l___l_l ...

Alors que je souhaite :

l___l___________l___l__________l___l...

Je sais, c'est pas trés imagé, mais je ne sais pas comment poster un fivhier joint.


Merci encore pour votre aide !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
13 mai 2013 à 11:37
pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
0
Merci,

voici le lien : http://cjoint.com/?CEnlPcKYgSD
0
Bonjour
je pense que faire 2 boucle ca serat plus rapide

Sub Test()
I = 4
Dlig = 11
Flig = 502
Application.ScreenUpdating = False
For j = 11 To (14 * 83) Step 83
Range(Cells(Dlig, I), Cells(Flig, j)).BorderAround LineStyle:=xlContinuous
Next
For I = 4 To (14 * 83) Step 83
Range(Cells(Dlig, I), Cells(Flig, j)).BorderAround LineStyle:=xlContinuous
Next
Application.ScreenUpdating = False
End Sub

A tester sur ton Mico

A+
Maurice
0
Bonjour,

Je te remercie pour ta solution, cela fonctionne parfaitement!

@+

Robin
0
re

desoler mettre True a la fin

Maurice
0