VBAで非表示の行と列をグループ化する汎用プロシージャ
誰かから引き継いだExcelや自分が昔に作ったExcelを開いたときに、非表示の行や列が見つかることがあると思います。
行と列を一つずつ開いていくのは大変ですよね。
そこで、ボタンひとつで、今開いているシートの非表示行と非表示列をグループ化に変更する処理を作りました。
この処理をxlamファイルに書き込み、Excelで参照し、リボンに登録すれば、リボン上のボタンから非表示の行列をグループ化できます。
Public Sub GroupHiddenRowsAndColumns()
'アクティブシートの非表示の行と列をグループ化する
'問題なく使える(2025/6/18 永富)
On Error GoTo ErrorHandler
Dim Book As Workbook: Set Book = ActiveWorkbook ' ← アドインではなくユーザーのブック
Dim Sheet As Worksheet: Set Sheet = Book.ActiveSheet
Dim IsRowGrouped As Boolean
Dim IsColGrouped As Boolean
Dim Message As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'非表示の行と列をグループ化する
IsRowGrouped = GroupHiddenRows(Sheet) '非表示の行をグループ化する
IsColGrouped = GroupHiddenColumns(Sheet) '非表示の列をグループ化する
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'非表示の行も列も見つからなかった場合
If Not IsRowGrouped And Not IsColGrouped Then
MsgBox "非表示の行・列は見つかりませんでした。", vbInformation
Exit Sub
End If
'行に関するメッセージ作成
If IsRowGrouped Then
Message = Message & "非表示の行をグループ化しました。" & vbCrLf
Else
Message = Message & "非表示の行はありませんでした。" & vbCrLf
End If
'列に関するメッセージ作成
If IsColGrouped Then
Message = Message & "非表示の列をグループ化しました。" & vbCrLf
Else
Message = Message & "非表示の列はありませんでした。" & vbCrLf
End If
'メッセージ表示
MsgBox Message, vbInformation, "グループ化の結果"
CleanExit:
' --- 終了処理(必ず通る) ---
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub
ErrorHandler:
' エラーが発生した場合でも終了処理へ
MsgBox "エラーが発生しました:" & Err.Description, vbExclamation
Resume CleanExit
End Sub
Private Function GroupHiddenRows(ByRef Sheet As Worksheet) As Boolean
'GroupHiddenRowsAndColumnsの補助Sub
'非表示の行をグループ化する
Dim Row As Long: Row = 1
Dim StartRow As Long
Dim EndRow As Long
Dim Lng_Last As Long: Lng_Last = Sheet.UsedRange.Row + Sheet.UsedRange.Rows.Count - 1
Dim IsGrouped As Boolean: IsGrouped = False '処理対象があったかどうかのフラグ
Do While Row <= Lng_Last
If Sheet.Rows(Row).EntireRow.Hidden Then
StartRow = Row
'複数行が非表示になっているかチェックする
Do While Row <= Lng_Last And Sheet.Rows(Row).EntireRow.Hidden
Row = Row + 1
Loop
EndRow = Row - 1
'対象行の非表示を解除し、グループ化する
If EndRow >= StartRow Then
Sheet.Range(Sheet.Cells(StartRow, 1), Sheet.Cells(EndRow, 1)).EntireRow.Hidden = False
Sheet.Range(Sheet.Cells(StartRow, 1), Sheet.Cells(EndRow, 1)).Rows.Group
IsGrouped = True 'グループ化した
End If
Else
Row = Row + 1
End If
Loop
GroupHiddenRows = IsGrouped
End Function
Private Function GroupHiddenColumns(ByRef Sheet As Worksheet) As Boolean
'GroupHiddenRowsAndColumnsの補助Sub
'非表示の列をグループ化する
Dim Col As Long: Col = 1
Dim StartCol As Long
Dim EndCol As Long
Dim Lng_Last As Long: Lng_Last = Sheet.UsedRange.Column + Sheet.UsedRange.Columns.Count - 1
Dim IsGrouped As Boolean: IsGrouped = False '処理対象があったかどうかのフラグ
Do While Col <= Lng_Last
If Sheet.Columns(Col).EntireColumn.Hidden Then
StartCol = Col
'複数列が非表示になっているかチェックする
Do While Col <= Lng_Last And Sheet.Columns(Col).EntireColumn.Hidden
Col = Col + 1
Loop
EndCol = Col - 1
'対象列の非表示を解除し、グループ化する
If EndCol >= StartCol Then
Sheet.Range(Sheet.Cells(1, StartCol), Sheet.Cells(1, EndCol)).EntireColumn.Hidden = False
Sheet.Range(Sheet.Cells(1, StartCol), Sheet.Cells(1, EndCol)).Columns.Group
IsGrouped = True 'グループ化した
End If
Else
Col = Col + 1
End If
Loop
GroupHiddenColumns = IsGrouped
End Function