和風スパゲティのレシピ

日本語でコーディングするExcelVBA

データ閲覧機能を1クリックで一括設定するマクロ

CSVファイルを開いた直後など、
そのままではやや見づらいデータがあります。

生CSVデータ


こういったデータを見やすくする機能がExcelにはたくさん用意されており、

  • 列幅の自動調整(全選択して列と列の間をダブルクリック)
  • オートフィルターの設置
  • ウィンドウ枠をフィルター見出し行で固定
  • フィルター見出し行を印刷タイトルに
  • すべての列を1ページに印刷」に設定
  • 上下左右の印刷余白を0


あたりがとても便利です。


ということで、これらをすべて実行してくれるマクロを作って、
1クリックで見やすいデータにしてしまいましょう!


実行するとこんな風に設定されるマクロです。

閲覧機能設定マクロ実行後の表示


ついでに印刷設定も「見出し固定/列を1ページ/枠線表示」にしてこちら↓
自動設定後の印刷プレビュー


本マクロはExcel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

リボンやツールバーに登録すれば1クリックになりますし、
ショートカットキーへの登録も便利です。

ソースコード

Sub データ用の閲覧機能を一括設定する()
    On Error Resume Next ' ← 汎用マクロなのでエラーはとにかく無視

    ' アクティブシートに対して実行
    Dim ws As Worksheet: Set ws = ActiveSheet

    ' 見出し行はフィルターが既に設置されていればその行、なければアクティブセルのひとつ上
        ' ※ ウィンドウ枠の固定と同じ仕様にしました。
    Dim is実行前にフィルターあり As Boolean: is実行前にフィルターあり = ws.AutoFilterMode
    Dim R_見出し As Long
    Dim Rangeフィルター見出し As Range
    If is実行前にフィルターあり Then
        R_見出し = ws.AutoFilter.Range.Row
        Set Rangeフィルター見出し = ws.AutoFilter.Range.Rows(1)
    Else
        R_見出し = IIf(ActiveCell.Row = 1, 1, ActiveCell.Row - 1)
    End If

    ' 実行範囲はフィルターが既設置ならその範囲、なければシート全体
    Dim C1st As Long, CLast As Long
    If is実行前にフィルターあり Then
        C1st = Rangeフィルター見出し.Column
        CLast = Rangeフィルター見出し.Columns.Count + Rangeフィルター見出し.Column - 1
    Else
        C1st = 1
        CLast = ws.UsedRange.Columns.Count + ws.UsedRange.Column - 1
    End If

    ' フィルターをいったん解除してから列幅の自動調整(▼の分も広がるのが好きじゃないので)
    If is実行前にフィルターあり Then ws.AutoFilterMode = False
    ws.Range(ws.Columns(C1st), ws.Columns(CLast)).AutoFit
        
    ' 広すぎる列は狭くして「縮小して全体を表示」
    Dim C As Long
    For C = C1st To CLast
        If Columns(C).ColumnWidth > 20 Then
            Columns(C).ColumnWidth = 20
            Columns(C).ShrinkToFit = True
        End If
    Next

    ' フィルターを設置(元々あれば再設置)
    If is実行前にフィルターあり Then
        Rangeフィルター見出し.AutoFilter
    Else
        ws.Rows(R_見出し).AutoFilter
    End If

    ' 見出し行を行高を広げて中央上寄せに(これは好み)
    With ws.Rows(R_見出し)
        .RowHeight = 27
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
    End With

    ' ウィンドウ枠の固定
    ActiveWindow.FreezePanes = False
    Cells(R_見出し + 1, ActiveCell.Column).Select
    ActiveWindow.FreezePanes = True

    ' 印刷余白を0
    With ws.PageSetup
        .LeftMargin = 0: .RightMargin = 0
        .TopMargin = 0: .BottomMargin = 0
        .HeaderMargin = 0: .FooterMargin = 0
    
    ' 印刷タイトルの設定
        .PrintTitleRows = "$1:$" & R_見出し
        
    ' すべての列を1ページに印刷
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = False
    End With

End Sub

解説

一つ一つの機能を地道に設定していくだけのマクロですので、
各コメントを見れば大体の処理はわかるかなと思います。

「テーブル」機能が好きな方は、AutoFilterの設置あたりのコードを、
ListObjectの設置コードに変更してご利用ください。


あとは個人的な好みで実装している部分なのですが、
見出しの書式を

見出し行の書式設定

こんな風に「行高を2行分確保して上寄せ」するのが好みです。

フィルターの▼ブロックの分の列幅を確保する必要がなくなるので、
シート全体の横幅を結構抑えることができますよ。


気に入ったらこの仕様も取り入れてみてください。