Function ToutSaufDesZones(mesZones As Range) As Range
'--------------------------------------------------------------------------
' retourne le range de toute la feuille sauf mesZones
' mesZones est un ensemble de plages rectangulaires
' mesZones ne doit pas être vide et ne doit pas être la feuille entière
'--------------------------------------------------------------------------
Dim xzone As Range, sel As Range, xsel As Range
On Error Resume Next
For Each xzone In mesZones.Areas
Set xsel = ToutSaufUneZone(xzone)
If sel Is Nothing Then Set sel = xsel Else Set sel = Intersect(sel, xsel)
Next xzone
On Error GoTo 0
Set ToutSaufDesZones = sel
End Function
Function ToutSaufUneZone(UneZone As Range) As Range
'--------------------------------------------------------------------------
' retourne le range de toute la feuille sauf UneZone.
' UneZone est une unique plage rectangulaire de cellules contigües.
' Unezone ne doit pas être vide (on peut pas déterminer la feuille parent)
' une zone ne doit pas être la feuille entière (car le complément à la
' feuille entière est vide)
'--------------------------------------------------------------------------
Dim sel As Range, x As Range
With UneZone.Parent
On Error Resume Next
Set x = .Rows("1:" & UneZone.Row - 1)
If sel Is Nothing Then Set sel = x Else Set sel = Union(sel, x)
Set x = .Rows(UneZone.Row + UneZone.Rows.Count & ":" & Rows.Count)
If sel Is Nothing Then Set sel = x Else Set sel = Union(sel, x)
Set x = .Range(.Cells(1, 1), .Cells(1, UneZone.Column - 1)).EntireColumn
If sel Is Nothing Then Set sel = x Else Set sel = Union(sel, x)
Set x = .Range(.Cells(1, UneZone.Column + UneZone.Columns.Count), .Cells(1, Columns.Count)).EntireColumn
If sel Is Nothing Then Set sel = x Else Set sel = Union(sel, x)
On Error GoTo 0
Set ToutSaufUneZone = sel
End With
End Function