Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA selectionner l'inverse d'une plage de cellule

mikael2235

XLDnaute Occasionnel
Bonjour à tous,

Je souhaiterai savoir si il est possible en vba, de selectionner l'inverse d'une plage de cellule.

Ex :
Je sélectionne une plage de cellule (disons B2:F4), je lance ma macro, et elle me selectionne tout le reste de ma feuille sauf cette plage.

Merci pour votre aide.
Mikael
 

JBARBE

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Bonsoir,

Pour ma part, je pense qu'il est impossible d'apporter une solution à ta demande !

En effet, essaie de le faire manuellement, tu verras que ta sélection se désactive après une nouvelle sélection ( logique )
 

mikael2235

XLDnaute Occasionnel
Re : VBA selectionner l'inverse d'une plage de cellule

Vous les pros d'Excel n'avez pas de solutions à m'apporter... ça serait bien la 1ere fois.

Effectivement manuellement ce n'est pas possible, mais je pensais qu'en vba tout était possible...

Autrement, j'ai toujours une solution de secours :
- Je selectionne de A1 à IV(row-1)
- Je selectionne de A(row+1) à IV65536
- Je selectionne de A1 à (column-1)65536
- Je selectionne de (column+1)1 à IV65536


Si ma selection est par exemple ma plage B2:F4,
Puis-je recuperer le mini et maxi pour row et column de ma plage ?
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Bonjour mikael2235,

La macro n'est pas forcément simple...

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim tablo(), n As Byte, t, plage As Range
If Target.Areas.Count > 1 Then MsgBox "Pas de sélection multiple svp...": Exit Sub
If Target.Row > 1 Then
  ReDim tablo(n)
  tablo(n) = "1:" & Target.Row - 1
  n = n + 1
End If
If Target.Row + Target.Rows.Count - 1 < Rows.Count Then
  ReDim Preserve tablo(n)
  tablo(n) = Target.Row + Target.Rows.Count & ":" & Rows.Count
  n = n + 1
End If
If Target.Column > 1 Then
  ReDim Preserve tablo(n)
  tablo(n) = Range(Columns(1), Columns(Target.Column - 1)).Address
  n = n + 1
End If
If Target.Column + Target.Columns.Count - 1 < Columns.Count Then
  ReDim Preserve tablo(n)
  tablo(n) = Range(Columns(Target.Column + Target.Columns.Count), Columns(Columns.Count)).Address
  n = n + 1
End If
If n Then
  For Each t In tablo
    Set plage = Union(IIf(plage Is Nothing, Range(t), plage), Range(t))
  Next
  Application.EnableEvents = False
  plage.Select
  Application.EnableEvents = True
End If
End Sub
Fichier joint.

Edit : salut JBARBE

A+
 

Pièces jointes

  • Sélections(1).xls
    40.5 KB · Affichages: 65

JBARBE

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

salut JOB


Sans vouloir polémiquer sur le fichier de job certes complexe5 BRAVO, dans tout les cas la cellule A1 reste sélectionnée avec la sélection dans ce fichier !

Je vous le dis ce Mikael arrogant vous donne un défit que microsoft n'a même pas prévu !
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Bonjour mikael2235, le forum,

12 lignes c'est quand même mieux que 32

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Areas.Count > 1 Then MsgBox "Pas de sélection multiple svp...": Exit Sub
Dim a$(3)
On Error Resume Next
a(0) = Rows("1:" & Target.Row - 1).Address
a(1) = Rows(Target.Row + Target.Rows.Count & ":" & Rows.Count).Address
a(2) = Range("A1", Columns(Target.Column - 1)).Address
a(3) = Range(Columns(Target.Column + Target.Columns.Count), Columns(Columns.Count)).Address
Application.EnableEvents = False
Range(Replace(Application.Trim(Join(a)), " ", ",")).Select
Application.EnableEvents = True
End Sub
Nota : Application.Trim c'est la fonction SUPPRESPACE.

Fichier (2).

A+
 

Pièces jointes

  • Sélections(2).xls
    28.5 KB · Affichages: 68

mikael2235

XLDnaute Occasionnel
Re : VBA selectionner l'inverse d'une plage de cellule

Merci job,

Est-ce que je peux mettre ce code dans un module ?
Il bloque sur Target qu'il ne connait pas !!!

La cellule A1 apparait visuellement comme deselectionnée, mais elle ne l'est pas en réalité.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Re,

Si ça vous agace de voir la cellule active (A1) :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Areas.Count > 1 Then MsgBox "Pas de sélection multiple svp...": Exit Sub
Dim a$(3)
Application.ScreenUpdating = False
On Error Resume Next
a(0) = Rows("1:" & Target.Row - 1).Address
a(1) = Rows(Target.Row + Target.Rows.Count & ":" & Rows.Count).Address
a(2) = Range("A1", Columns(Target.Column - 1)).Address
a(3) = Range(Columns(Target.Column + Target.Columns.Count), Columns(Columns.Count)).Address
Application.EnableEvents = False
Range(Replace(Application.Trim(Join(a)), " ", ",")).Select
Cells(Rows.Count, Columns.Count).Activate 'pour ne pas voir la cellule active
Application.EnableEvents = True
End Sub
Fichier (3).

A+
 

Pièces jointes

  • Sélections(3).xls
    34 KB · Affichages: 60

job75

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Re,

Au cas où l'on va se balader sur la dernière ligne ou la dernière colonne, il vaut mieux remplacer :

Code:
Cells(Rows.Count, Columns.Count).Activate
par :

Code:
Intersect(Cells(Rows.Count, Columns.Count), Selection).Activate
Voici la macro définitive :

Code:
Sub SelectionInverse()
On Error Resume Next
If Selection.Areas.Count > 1 Then MsgBox "Pas de sélection multiple svp...": Exit Sub
Dim a$(3)
Application.ScreenUpdating = False
a(0) = Rows("1:" & Selection.Row - 1).Address
a(1) = Rows(Selection.Row + Selection.Rows.Count & ":" & Rows.Count).Address
a(2) = Range("A1", Columns(Selection.Column - 1)).Address
a(3) = Range(Columns(Selection.Column + Selection.Columns.Count), Columns(Columns.Count)).Address
Range(Replace(Application.Trim(Join(a)), " ", ",")).Select
Intersect(Cells(Rows.Count, Columns.Count), Selection).Activate 'pour cacher la cellule active
End Sub
Fichier (5).

A+
 

Pièces jointes

  • Sélections(5).xls
    47 KB · Affichages: 63

job75

XLDnaute Barbatruc
Re : VBA selectionner l'inverse d'une plage de cellule

Re,

Dans un tout autre genre, une sélection inverse utilisant une mise en forme conditionnelle (MFC) :

Code:
Sub SelectionInverse()
Application.ScreenUpdating = False
On Error Resume Next
Cells.FormatConditions.Add Type:=xlExpression, Formula1:="=1"
Selection.FormatConditions.Delete 'supprime la MFC de la sélection
Cells.SpecialCells(xlCellTypeAllFormatConditions).Select
Cells.FormatConditions.Delete 'supprime la MFC de la feuille
Intersect(Cells(Rows.Count, Columns.Count), Selection).Activate 'pour cacher la cellule active
End Sub
Bien sûr cela suppose qu'il n'y ait pas déjà une MFC dans la feuille...

Notez qu'ici les sélections multiples ne posent aucun problème.

Fichier joint.

A+
 

Pièces jointes

  • Sélection inverse par MFC(1).xls
    43 KB · Affichages: 72

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…