Sub a()
MsgBox VisibleCells(ActiveSheet).Address(0, 0)
End Sub
'---------------------------------------------------------------------
'Remplace Cells.SpecialCells(xlCellTypeVisible) quand feuille protégée
'---------------------------------------------------------------------
Function VisibleCells(Worksheet As Worksheet) As Range
Dim Range As Range
Dim UsedRangeVisibleRows As Range, UsedRangeVisibleColumns As Range
Dim WorksheetVisibleRows As Range, WorksheetVisibleColumns As Range
Dim RowColHidden As Boolean
Dim First As Long
Dim i As Long
'All Rows hidden
With Worksheet.Rows(Rows.Count)
If .Top + .Height = 0 Then Exit Function
End With
'All Columns hidden
With Worksheet.Columns(Columns.Count)
If .Left + .Width = 0 Then Exit Function
End With
'All hidden Rows & Columns are always inside the Worksheet.UsedRange (except for the 2 cases above)
With Worksheet.UsedRange
'----------
'Check Rows
'----------
RowColHidden = False
First = 1
For i = 1 To .Rows.Count
If .Rows(i).Hidden Then
If Not RowColHidden Then
RowColHidden = True
If i > First Then Set UsedRangeVisibleRows = Réunion(UsedRangeVisibleRows, Worksheet.Rows(First).Resize(i - First))
End If
Else
If RowColHidden Then
RowColHidden = False
First = i
End If
End If
Next i
If Not RowColHidden Then Set UsedRangeVisibleRows = Réunion(UsedRangeVisibleRows, Worksheet.Rows(First).Resize(i - First))
If Not UsedRangeVisibleRows Is Nothing Then Set WorksheetVisibleRows = UsedRangeVisibleRows.Offset(.Row - 1)
'Add non-UsedRange above Range
If Not .Rows(1).Top = 0 Then
If .Row > 1 Then
Set WorksheetVisibleRows = Réunion(Worksheet.Rows(1).Resize(.Row - 1), WorksheetVisibleRows)
End If
End If
'Add non-UsedRange below Range
If Not Round(Worksheet.Rows(Rows.Count).Top + Worksheet.Rows(Rows.Count).Height, 4) = _
Round(Worksheet.Rows(.Row + .Rows.Count - 1).Top + Worksheet.Rows(.Row + .Rows.Count - 1).Height, 4) Then
If (.Row + .Rows.Count - 1) < Rows.Count Then
Set WorksheetVisibleRows = Réunion(Worksheet.Rows(.Row + .Rows.Count).Resize(Rows.Count - (.Row + .Rows.Count - 1)), WorksheetVisibleRows)
End If
End If
End With
With ActiveSheet
'-------------
'Check Columns
'-------------
RowColHidden = False
First = 1
For i = 1 To Columns.Count
If .Columns(i).Hidden Then
If Not RowColHidden Then
RowColHidden = True
If i > First Then Set WorksheetVisibleColumns = Réunion(WorksheetVisibleColumns, Worksheet.Columns(First).Resize(, i - First))
'All the remaining columns are hidden ?
If .Columns(Columns.Count).Left + .Columns(Columns.Count).Width = .Columns(i).Left + .Columns(i).Width Then Exit For
End If
Else
If RowColHidden Then
RowColHidden = False
First = i
End If
End If
Next i
If Not RowColHidden Then Set WorksheetVisibleColumns = Réunion(WorksheetVisibleColumns, Worksheet.Columns(First).Resize(, i - First))
End With
'------------
'Return value
'------------
Set VisibleCells = Intersect(WorksheetVisibleRows, WorksheetVisibleColumns)
End Function
Private Function Réunion(Range1 As Range, Range2 As Range) As Range
Select Case True
Case Range1 Is Nothing And Range2 Is Nothing
Set Réunion = Nothing
Case Range1 Is Nothing
Set Réunion = Range2
Case Range2 Is Nothing
Set Réunion = Range1
Case Else
Set Réunion = Union(Range1, Range2)
End Select
End Function