Selection de plages multiples

Résolu
Newby -  
 Newby -
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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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. Newby
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. Newby
       
      Merci,

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

      Je te remercie pour ta solution, cela fonctionne parfaitement!

      @+

      Robin
      0
  3. foo
     
    re

    desoler mettre True a la fin

    Maurice
    0