XL 2010 Plage variable [Résolu par job75]

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'ai 4 plages de cellules (plage1, plage2, plage3, plage4) que je voudrais sélectionner simultanément.
Chaque plage est déclarée mais peut être ou pas exlue de la sélection suivant les circonstances.
À chaque plage correspond une variable (x1, x2, x3, x4) qui stipule si la plage est ou pas sélectionnée.
Ex. : si x1 = 1 --> plage1 incluse | si x1 = 0 --> plage1 exclue

bigplage = Union(plage1, plage2, plage3, plage4)

Si les 4 plages sont incluses, ça marche.

Supposons que je veuille exclure les plages 1 et 3, comment définir alors bigplage ?

J'avais bricolé ceci afin de satisfaire tous les cas de figures :
bigplage = Union(IIf(x1 = 1, plage1, ""), IIf(x1 = 2, plage2, "", IIf(x3 = 1, plage3 ,"", IIf(x4 = 1, plage4, "")

Échec total. Prévisible, car "" n'est évidemment pas un "Range".
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor,

Par exemple cette macro :
Code:
Sub SelectionPlages()
Dim x1 As Byte, x2 As Byte, x3 As Byte, x4 As Byte
Dim plage1 As Range, plage2 As Range, plage3 As Range, plage4 As Range, sel As Range
Dim a, b, i
x1 = 1: x2 = 0: x3 = 1: x4 = 1 'adapter
Set plage1 = [A1:B4]: Set plage2 = [C1:D5] 'adapter
Set plage3 = [E1:F6]: Set plage4 = [G1:H7] 'adapter
a = Array(x1, x2, x3, x4)
b = Array(plage1, plage2, plage3, plage4)
For i = 0 To UBound(a)
  If a(i) Then Set sel = Union(b(i), IIf(sel Is Nothing, b(i), sel))
Next
If Not sel Is Nothing Then sel.Select
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Magic_Doctor, job75,

Une autre méthode:

  • On construit via une boucle l'adresse de la sélection finale S en concaténant les adresses des plages devant être sélectionnées (xi = 1).
  • Puis on sélectionne la plage S d'adresse .
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i&, s
  If Not Intersect(Range("m2:m5"), Target) Is Nothing Then
  For i = 1 To 4
    If Range("m2").Offset(i - 1) = 1 Then s = s & "," & Range("plage" & i).Address(0, 0)
  Next i
  If Left(s, 1) = "," Then Range(Mid(s, 2)).Select Else Application.Goto [a1]
End If
End Sub

nota : à adapter puisqu'aucun fichier fourni :cool:. Pour l'exemple j'ai pris des plages nommées.
 

Pièces jointes

  • Magic_Doctor- sélection à la carte- v1.xlsm
    16.4 KB · Affichages: 49
Dernière édition:

job75

XLDnaute Barbatruc
Re, hello mapomme,

Avec des plages nommées comme celles de mapomme c'est un peu plus simple :
Code:
Sub SelectionPlagesNommees()
Dim x1 As Byte, x2 As Byte, x3 As Byte, x4 As Byte, a, i, sel As Range
x1 = 1: x2 = 0: x3 = 1: x4 = 1 'adapter
a = Array(x1, x2, x3, x4)
For i = 0 To UBound(a)
  If a(i) Then Set sel = Union(Evaluate("plage" & i + 1), IIf(sel Is Nothing, Evaluate("plage" & i + 1), sel))
Next
If Not sel Is Nothing Then sel.Select
End Sub
A+
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour mapomme,
Rebonjour job,

Merci pour vos réponses, je regarderai plus tard (je vais me coucher...).
Dans la PJ on peut voir où je voulais en venir : encadrer une plage de cellule.
Pour le fun, j'ai fait quelques adaptations. Ça marche bien, mais je pense que l'on pourrait simplifier. L'appel des macros via un array laisse à désirer...
 

Pièces jointes

  • Encadrement.xlsm
    21.6 KB · Affichages: 33

job75

XLDnaute Barbatruc
Hello Lone-wolf,

Simplifications :
Code:
Sub EncadrementTableau(firstcell As Range, lastcell As Range, couleur As Long, Optional haut As Byte = 1, Optional bas As Byte = 1, Optional gauche As Byte = 1, Optional droit As Byte = 1)
    Dim plage As Range, nbcol As Byte, nblgn As Byte, cuadro As Range
    Dim h As Range, b As Range, g As Range, d As Range, ta, tb, i
      
    Set plage = Range(firstcell, lastcell)
    nbcol = plage.Columns.Count
    nblgn = plage.Rows.Count
  
    'Encadrement supérieur du tableau
    Set h = plage(0, 1).Resize(, nbcol)
  
    'Encadrement inférieur du tableau
    Set b = plage(nblgn + 1, 1).Resize(, nbcol)
  
    'Encadrement gauche du tableau
    Set g = plage(1 - haut, 0).Resize(nblgn + haut + bas)
  
    'Encadrement droit du tableau
    Set d = plage(1 - haut, nbcol + 1).Resize(nblgn + haut + bas)
  
    ta = Array(haut, bas, gauche, droit)
    tb = Array(h, b, g, d)
      
    For i = 0 To UBound(ta)
      If ta(i) Then Set cuadro = Union(tb(i), IIf(cuadro Is Nothing, tb(i), cuadro))
    Next
  
    If Not cuadro Is Nothing Then cuadro.Interior.color = couleur

End Sub
A+
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 199
Messages
2 086 161
Membres
103 148
dernier inscrit
lulu56