Selection de plages multiples

Résolu
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

  1. Contributeur
    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
    1. 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
    2. Contributeur
      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
    3. Merci,

      voici le lien : http://cjoint.com/?CEnlPcKYgSD
      0
  2. 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
    1. Bonjour,

      Je te remercie pour ta solution, cela fonctionne parfaitement!

      @+

      Robin
      0
  3. re

    desoler mettre True a la fin

    Maurice
    0