【VBA】Excelマクロを利用して作業効率を上げたい④

こちらの記事は【VBA】Excelマクロを利用して作業効率を上げたい③の続きです。

実装4-1 選択範囲のグループ化またはインデント追加

続いて、選択行(列)をグループ化または、選択範囲のインデントを追加するマクロです。
行(列)ごと選択されている場合は、グループ化することができます。(Alt + Shift + → と同様の操作)

2025年5月2日追記:
結合セルでインデントを増やすとレイアウトが崩れるので、結合範囲の左上のセルのみのIndentLebelが更新されるようにしています。

Sub グループまたはインデント増やす()
    Dim selRange As Range, cell As Range
    
    On Error Resume Next
    Set selRange = Selection
    On Error GoTo 0
    If selRange Is Nothing Then Exit Sub
    
    ' 行全体選択ならグループ化 
    If selRange.Address = selRange.EntireRow.Address Then
        On Error Resume Next: selRange.EntireRow.Group: On Error GoTo 0
        Exit Sub
    End If
    ' 列全体選択ならグループ化 
    If selRange.Address = selRange.EntireColumn.Address Then
        On Error Resume Next: selRange.EntireColumn.Group: On Error GoTo 0
        Exit Sub
    End If
    
    ' それ以外は“各 cell”のIndentLevel を更新 
    For Each cell In selRange.Cells
        If cell.MergeCells Then
            If cell.Address = cell.MergeArea.Cells(1, 1).Address Then
                If cell.IndentLevel < 15 Then cell.InsertIndent 1
            End If
        Else
            If cell.IndentLevel < 15 Then cell.InsertIndent 1
        End If
    Next cell
End Sub

以下が、キー登録マクロです。

    Application.OnKey "^.", "グループまたはインデント増やす"

実装4-2 選択範囲のグループ解除またはインデントを減らす

実装4-1とは逆の動作をするものです。
行(列)ごと選択されている場合は、グループ化解除することができます。(Alt + Shift + ← と同様の操作)

2025年5月2日追記:
結合セルでインデントを減らすとレイアウトが崩れるので、結合範囲の左上のセルのみのIndentLebelが更新されるようにしています。

Sub グループ解除またはインデント減らす() 
    Dim selRange As Range, cell As Range
    
    On Error Resume Next
    Set selRange = Selection
    On Error GoTo 0
    If selRange Is Nothing Then Exit Sub
    
    ' 行全体選択ならグループ解除  
    If selRange.Address = selRange.EntireRow.Address Then
        On Error Resume Next: selRange.EntireRow.Ungroup: On Error GoTo 0
        Exit Sub
    End If
    ' 列全体選択ならグループ解除 
    If selRange.Address = selRange.EntireColumn.Address Then
        On Error Resume Next: selRange.EntireColumn.Ungroup: On Error GoTo 0
        Exit Sub
    End If
    
    ' それ以外は“各 cell”のIndentLevel を更新 
    For Each cell In selRange.Cells
        If cell.MergeCells Then
            If cell.Address = cell.MergeArea.Cells(1, 1).Address Then
                If cell.IndentLevel > 0 Then cell.InsertIndent -1
            End If
        Else
            If cell.IndentLevel > 0 Then cell.InsertIndent -1
        End If
    Next cell
End Sub

続いて、キー登録用マクロです。

    Application.OnKey "^,", "グループ解除またはインデント減らす"

実装4-3 選択行(列)の非表示・再表示を切り替える

こちらは、選択行(列)を非表示・再表示を切り替えるマクロです。
Ctrl + Shift + ピリオドを押下することにより実行されます。

Sub 選択行列表示を設定()
    Dim selRange As Range
    On Error Resume Next
    Set selRange = Selection
    On Error GoTo 0
    
    If selRange Is Nothing Then
        Exit Sub
    End If
    
    ' 選択が行全体の場合
    If selRange.Address = selRange.EntireRow.Address Then
        selRange.EntireRow.Hidden = Not selRange.EntireRow.Hidden
        Exit Sub
    End If
    
    ' 選択が列全体の場合
    If selRange.Address = selRange.EntireColumn.Address Then
        selRange.EntireColumn.Hidden = Not selRange.EntireColumn.Hidden
        Exit Sub
    End If
    
    ' 上記以外の場合は、選択セルの「行全体」を対象とする(必要に応じて調整)
    selRange.EntireRow.Hidden = Not selRange.EntireRow.Hidden
End Sub

下記がキー登録マクロです。

    Application.OnKey "^+.", "選択行列表示を設定"

おわりに

【VBA】Excelマクロを利用して作業効率を上げたい③ に引き続き、いくつか作成してみました。

いずれも私が普段の業務でよく使用しているものです。
キーボード入力のみでなるべく操作できるよう今後も特に便利なものがあれば、追加していきます。

参考:

【VBA】Excelマクロを利用して作業効率を上げたい①

はじめに こんばんは。 皆さんは作業効率を上げるためにどのような事を大切にしているでしょうか?僕は、社会人1年目に教えていただいた「キーボード操作のみで作業する…

【VBA】Excelマクロを利用して作業効率を上げたい②

前回から特に便利だなと思ったExcelマクロについて記しています。 機能実装 続きです。今回は2つのマクロを記載して見ました。 実装3〜コピー範囲を他のシートへ貼り付け…

【VBA】Excelマクロを利用して作業効率を上げたい③

はじめに 皆様。Excelは業務で活用しているでしょうか?本日は久しぶりにあったら便利かもしれないマクロを作成してみました。 実装3-1:文字列揃えマクル こちらでは…