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
  • URLをコピーしました!

この記事を書いた人

GASやVBAを使って、スプレッドシートやExcel作業を自動化しています。自分のつくったプログラムが、誰かの時間を節約できたらうれしいです。また、SEOライターとして、節約メディアや視覚障害メディアで執筆しています。広島県広島市在住。

目次