記事ID: 112
タイトル: 【VBA】行・列の表示/非表示を一括で切り替える方法(コピペOK)
カテゴリ: シート操作
一次キーワード: VBA 行 列 非表示 表示 一括
想定読者: 毎回手作業で行・列を非表示/再表示している実務担当者(初心者〜初級者)
検索意図: VBAで行・列の表示/非表示をまとめて切り替えたい
読者の悩み(1文): 毎回同じ行・列を手作業で非表示にしたり戻したりしていて、範囲が多いほど漏れる。
読了後にできること(1文): VBAで指定した行・列の表示/非表示をボタン1つで一括切り替えできる。
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: マクロ実行 / ボタン割り当て
更新日: 2026-03-18
—
この記事でわかること
Rows.Hidden/Columns.Hiddenで行・列の表示/非表示をVBAから一括制御できる- トグル方式(ボタン1つで表示⇔非表示を切り替え)の実装方法がわかる
- 複数の離れた範囲を一括で操作する実務版コードがコピペで動く
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 月次報告書の印刷整形: 仕入値や原価率など社外に見せたくない列を非表示にして印刷し、終わったら元に戻す
- プレゼン資料の見た目調整: 補助データの行・列を一時的に隠して、必要なデータだけ見せる
- データ入力画面の切り替え: 入力担当者に不要な列を見せないようにして、入力ミスを減らす
- 集計シートの表示制御: 詳細行を非表示にして小計・合計だけを見せるレイアウトをワンクリックで切り替える
- 共有ファイルの閲覧制御: 部署ごとに見せる列を変えたいとき、ボタンで切り替えられるようにする
—
完成イメージ(Before / After)
Before(不要な列が表示されている状態):
| A列(商品名) | B列(仕入値) | C列(原価率) | D列(販売価格) | E列(備考) |
|---|---|---|---|---|
| 商品A | 500 | 0.35 | 1,500 | 定番品 |
| 商品B | 800 | 0.40 | 2,000 | 新商品 |
After(仕入値・原価率の列を非表示):
| A列(商品名) | D列(販売価格) | E列(備考) |
|---|---|---|
| 商品A | 1,500 | 定番品 |
| 商品B | 2,000 | 新商品 |
再実行すると非表示の列が再表示され、元のレイアウトに戻る。
—
自分も月次報告書を作るたびに、「B列とC列を非表示にして、F〜H列も隠して、印刷して、終わったら全部戻して…」という作業を毎回やっていた。列が20個以上ある表だと、どこを非表示にしたか忘れて戻し漏れが発生する。しかも翌月また同じ作業。管理職になってからは報告書のフォーマットが増えて、「印刷用に整形 → 印刷 → 元に戻す」を1日に何回もやることもあった。
VBAでトグル切り替えを作ってからは、ボタン1つで「印刷用レイアウト」と「全列表示」を行き来できるようになった。もう列を数える必要がないし、戻し忘れもゼロ。同じように毎回手作業で非表示を繰り返している人が、この記事でサクッと自動化できればうれしい。
Rows.HiddenとColumns.Hiddenを使えば、行・列の表示/非表示をVBAで一括制御できる。
なお、マクロ実行中にエラーが発生した場合の基本的な対処は エラー処理(On Error)で止まらないマクロを作る方法 を参照。
—
実行前の準備
バックアップを取る
非表示操作自体はデータを削除しないが、非表示のまま保存すると翌日「データが消えた?」と焦る原因になる。念のためファイルのコピーを別フォルダに保存してから実行する。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
Alt + F8→ マクロ名を選んで「実行」
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
—
コード(最小版)– 指定した行・列を非表示にする
まずはこれで動きを確認する。指定した列を非表示にするだけのシンプル版。
'============================================================
' ■ 指定列を非表示にする(最小版)
' → B列とC列を非表示にする
'============================================================
Sub HideColumns()
Columns("B:C").Hidden = True
MsgBox "B列〜C列を非表示にしました。", vbInformation
End Sub
再表示したい場合は以下を実行する。
'============================================================
' ■ 指定列を再表示する(最小版)
'============================================================
Sub ShowColumns()
Columns("B:C").Hidden = False
MsgBox "B列〜C列を再表示しました。", vbInformation
End Sub
行を非表示にする場合は Rows に変えるだけ。
'============================================================
' ■ 指定行を非表示にする(最小版)
' → 3行目〜5行目を非表示にする
'============================================================
Sub HideRows()
Rows("3:5").Hidden = True
MsgBox "3〜5行目を非表示にしました。", vbInformation
End Sub
書き換えポイント
| コード | 説明 | 例 |
|---|---|---|
Columns("B:C") |
非表示にする列の範囲。列はアルファベットで指定 | Columns("E:G") に変更 |
Rows("3:5") |
非表示にする行の範囲。行は数字で指定 | Rows("10:20") に変更 |
.Hidden = True |
非表示にする | .Hidden = False で再表示 |
列の指定方法の補足: アルファベット指定 Columns("C") と数値指定 Columns(3) はどちらもC列を指す。範囲指定する場合はアルファベット Columns("B:D") で書く。Columns("3") のように数字を文字列で渡すとC列として動作するが紛らわしいので避ける。
ポイント: Columns.Hidden は列全体、Rows.Hidden は行全体の表示/非表示を制御する。データは削除されない。Hidden = False で元に戻る。
コード解説: Columns("B:C").Hidden = True は、B列からC列までの全行を一括で非表示にする1行の命令。Excelの手動操作で「列を選択 → 右クリック → 非表示」とやっていた作業がこの1行で済む。True を False に変えれば再表示になるので、非表示と再表示のマクロを分けて用意しておけば、ボタンで切り替えられる。行の場合は Rows に置き換えるだけで、同じ考え方がそのまま使える。
—
コード(実務版)– トグル切り替え+複数範囲+エラー処理
このトグル方式を覚えてからは、印刷用と編集用のレイアウト切り替えをボタンに割り当てて、同僚にも配っている。「ボタン押すだけで切り替わるの便利」と言ってもらえるようになった。
※ 非表示にした列は画面から消えます(データは残ります)。初回は必ずバックアップを取ってから実行してください。
'============================================================
' ■ 行・列の表示/非表示をトグル切り替え(実務版)
' → 指定した行・列の表示⇔非表示をボタン1つで切り替え
' → 複数の離れた範囲に対応
' → シート保護・エラー処理付き
'============================================================
Sub ToggleRowsColumns()
'--- ★書き換えポイント ここから ---
'非表示にしたい列(カンマ区切りで複数指定可)
Dim hideCols As String
hideCols = "B:C,F:F,H:J" '← B〜C列、F列、H〜J列
'非表示にしたい行(カンマ区切りで複数指定可。不要なら "" にする)
Dim hideRowRange As String
hideRowRange = "" '← 行は非表示にしない場合は空文字
'--- ★書き換えポイント ここまで ---
Dim ws As Worksheet
Set ws = ActiveSheet
'--- エラー処理の開始
On Error GoTo ErrHandler
'--- 画面更新を止めて高速化
Application.ScreenUpdating = False
'--- シート保護の一時解除(保護されている場合のみ)
Dim wasProtected As Boolean
wasProtected = ws.ProtectContents
If wasProtected Then
'※ パスワード付き保護の場合は以下のように変更:
' ws.Unprotect "ここにパスワード"
' パスワードなしで Unprotect するとエラーになる
ws.Unprotect
End If
'--- 列のトグル切り替え
If hideCols <> "" Then
Dim colRange As Range
Set colRange = ws.Range(hideCols).EntireColumn
'現在の状態を取得(最初の列の状態を基準にする)
Dim colHidden As Boolean
colHidden = colRange.Areas(1).Hidden
'反転させる
colRange.Hidden = Not colHidden
End If
'--- 行のトグル切り替え
If hideRowRange <> "" Then
Dim rowRange As Range
Set rowRange = ws.Range(hideRowRange).EntireRow
'現在の状態を取得(最初の行の状態を基準にする)
Dim rowHidden As Boolean
rowHidden = rowRange.Areas(1).Hidden
'反転させる
rowRange.Hidden = Not rowHidden
End If
'--- シート保護を元に戻す
If wasProtected Then
ws.Protect UserInterfaceOnly:=True
End If
Application.ScreenUpdating = True
MsgBox "行・列の表示/非表示を切り替えました。", vbInformation
Exit Sub
ErrHandler:
Application.ScreenUpdating = True
If wasProtected Then
On Error Resume Next
ws.Protect UserInterfaceOnly:=True
On Error GoTo 0
End If
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description, vbExclamation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
hideCols |
非表示にする列の範囲 | "B:C,F:F,H:J"(カンマ区切り) |
hideRowRange |
非表示にする行の範囲 | ""(空文字=行は操作しない) |
ws.Unprotect |
シート保護の解除 | パスワード付きなら ws.Unprotect "パスワード" に変更 |
使い方の例
列だけ切り替える場合:
hideCols = "B:C,F:F"
hideRowRange = ""
行だけ切り替える場合:
hideCols = ""
hideRowRange = "3:5,10:15"
行と列の両方を切り替える場合:
hideCols = "B:C"
hideRowRange = "3:5"
全シートに一括で適用したい場合は 複数シートに同じ処理を一括実行 の方法でループさせる。
—
よくある落とし穴5選
1. 非表示のまま保存して翌日「データが消えた!」と焦る
自分もこれをやらかした。列を非表示にした状態で上書き保存し、翌日ファイルを開いたら「あれ、B列とC列のデータが消えた?」と10分も焦った。実際は非表示のまま保存されていただけ。
原因: 非表示はデータの削除ではなく、表示を隠しているだけ。保存しても非表示の状態が維持される。
対策: 非表示にしている列がある場合は、セルのアドレス表示(名前ボックス)を確認する。A列の隣がD列になっていたら、B〜C列が非表示。全ての非表示列を一括再表示するには、シート全体を選択(Ctrl+A)して右クリック →「再表示」。
2. シート保護中に実行してエラー1004が出る
原因: シートが保護されていると、Rows.Hidden や Columns.Hidden を変更できない。実行時エラー 1004「アプリケーション定義またはオブジェクト定義のエラーです」が発生する。
対策: 実務版コードのようにシート保護を一時解除してから操作する。または、シート保護時に ws.Protect UserInterfaceOnly:=True を設定しておけば、VBAからの操作は保護を解除しなくても可能。パスワード付き保護の場合は ws.Unprotect "パスワード" のようにパスワード引数が必要。パスワードなしで Unprotect を呼ぶとエラーになる。シート保護の詳細は 特定シートだけ保護・解除する方法 を参照。
3. 列番号の指定方法を間違えて意図しない列が非表示になる
原因: Columns("C") と Columns(3) はどちらもC列を指すが、Columns("3") も実はC列(3番目の列)として動作する。紛らわしいため混乱の元になる。さらに Columns("3:5") のように数字の範囲を文字列で渡すと意図しない列が選択される可能性がある。
対策: 列指定は Columns("C") (アルファベット)または Columns(3) (数値)のどちらかに統一する。範囲指定は Columns("C:E") のようにアルファベットで書く。行は Rows("3:5") のように数字で書く。
4. オートフィルタの非表示行とVBAの非表示行が混在して混乱する
原因: AutoFilterで絞り込むと、条件に合わない行は「フィルタによる非表示」になる。これは Rows.Hidden で設定した「手動の非表示」とは別物だが、画面上の見た目は同じ。VBAで Rows.Hidden = False にしてもフィルタによる非表示は解除されない。
対策: フィルタの非表示を解除するには ws.AutoFilterMode = False または ws.ShowAllData を使う。詳しくは オートフィルタでデータを絞り込み・解除する方法 を参照。
5. 非表示の行・列を含む範囲をコピーすると、見えているセルだけコピーされる
原因: Excelの仕様で、非表示の行・列を含む範囲を手動でコピーすると、可視セルだけがコピーされる。VBAでも同様に、可視セルだけコピーしたい場合は SpecialCells(xlCellTypeVisible) を使う。ただし、非表示セルも含めてコピーしたい場合は、先に全て再表示してからコピーする必要がある。
対策: コピー前に非表示の有無を確認する。全データをコピーしたい場合は、先にトグルマクロで再表示してからコピーする。
VBA 行 非表示 解除できない場合の原因と対処
「VBAで Rows.Hidden = False を実行したのに行が再表示されない」というケースでは、まずシート保護がかかっていないかを確認する。シートが保護されていると、Hidden プロパティの変更がエラーなく無視されることがある。次に、オートフィルタによる非表示と混在していないかをチェックする。フィルタで非表示になっている行は Rows.Hidden = False では解除できず、ws.ShowAllData または ws.AutoFilterMode = False が必要になる。それでも解除できない場合は、グループ化(アウトライン)で折りたたまれている可能性があるので、「データ」タブの「グループ解除」を確認してみる。
VBA 列 表示されない 原因の確認ポイント
Columns.Hidden = False を実行しても列が見えない場合、列幅が0に設定されているケースがある。Columns("B").ColumnWidth = 0 になっていると、非表示ではないが画面上は見えない。Columns("B").ColumnWidth = 8.43(デフォルト幅)のように明示的に幅を設定すれば表示される。また、条件付き書式でフォント色を背景色と同じにしているためにデータが見えないケースもある。列自体は表示されているのにデータが見えない場合は、セルの書式設定を確認するとよい。
非表示にした列がブックを開くたびに再表示される場合
ブックを開くたびに列の非表示設定がリセットされる場合は、Workbook_Open イベントで Columns.Hidden = False が実行されている可能性がある。VBEの「ThisWorkbook」モジュールを確認し、不要な初期化処理がないかチェックする。また、共有ドライブ上のファイルで他のユーザーが上書き保存している可能性もある。非表示状態を維持したい場合は、トグルマクロを使ってユーザーが明示的に切り替える運用にするのがおすすめ。
—
FAQ
Q1: 非表示にした行・列のデータは消える?
消えない。Hidden = True は表示を隠すだけで、データはそのまま残っている。Hidden = False で再表示すれば元に戻る。数式の参照先が非表示セルでも、計算結果には影響しない。
Q2: 全ての非表示行・列を一括で再表示するには?
以下のコードで全行・全列を一括再表示できる。
Sub ShowAll()
Cells.EntireRow.Hidden = False
Cells.EntireColumn.Hidden = False
MsgBox "全ての行・列を再表示しました。", vbInformation
End Sub
Q3: 特定のシートだけ非表示を適用するには?
ActiveSheet の代わりにシート名を明示的に指定する。
Worksheets("報告書").Columns("B:C").Hidden = True
シート名の取得や存在チェックの方法は シート名の取得・一括変更・存在チェックする方法 を参照。
Q4: 非表示にする列をセルの値で動的に決めたい場合は?
セルに列名を入力しておき、その値を読み取って非表示にする方法がある。
Sub HideByCell()
Dim colName As String
colName = Range("Z1").Value '← Z1に "B:C,F:F" のように入力しておく
If colName <> "" Then
Range(colName).EntireColumn.Hidden = True
End If
End Sub
条件に応じて動的にデータを絞り込みたい場合は 複数条件でデータを抽出して別シートにまとめる も参考になる。
Q5: 印刷時だけ特定の列を非表示にして、印刷後に自動で戻すには?
以下のようにマクロ内で非表示→印刷→再表示の一連を自動化できる。
Sub PrintWithHidden()
Columns("B:C").Hidden = True
ActiveSheet.PrintOut
Columns("B:C").Hidden = False
End Sub
ウィンドウ枠の固定と組み合わせると見やすい報告書を自動で印刷できる。詳しくは ウィンドウ枠の固定・解除をVBAで自動化する方法 を参照。
—
まとめ
行・列の表示/非表示は、Excelの表示制御のなかでも最も使用頻度が高い操作の1つ。手作業でやると「どこを非表示にしたか忘れる」「戻し漏れが起きる」というミスがつきものだが、VBAで自動化すれば、ボタン1つで確実に切り替えられるようになる。
- Rows.Hidden / Columns.Hidden: 行・列の表示/非表示を
True/Falseで制御できる - トグル切り替え:
Notで現在の状態を反転すれば、1つのマクロで表示⇔非表示を切り替えられる - 複数範囲:
Range("B:C,F:F")のようにカンマ区切りで離れた列も一括指定 - シート保護: 保護中は一時解除が必要。
UserInterfaceOnly:=Trueなら解除不要 - 非表示≠削除: データは残る。再表示すれば元通り
関連記事
- オートフィルタでデータを絞り込み・解除する方法 — フィルタと非表示の使い分け
- ウィンドウ枠の固定・解除をVBAで自動化する方法 — 表示制御の関連テクニック
- 特定シートだけ保護・解除する方法 — シート保護中の操作が必要な場合
- 画面更新・再計算を止めてマクロを高速化する方法 — 大量の行列操作を高速化
—
次にやりたくなること
- 複数シートに同じ処理を一括実行: 全シートの不要列をまとめて非表示にしたい場合。トグルマクロをシートループで全シートに適用できる
- オートフィルタでデータを絞り込み・解除する方法: 非表示ではなくフィルタでデータを絞り込みたい場合。条件に合うデータだけ表示する方法
- ExcelファイルをPDFに一括変換する方法: 非表示設定を適用した状態でPDF出力したい場合。印刷レイアウトの仕上げに使える
- マクロをボタン1つで実行する方法: トグルマクロをシート上のボタンに割り当てて、同僚にも配布できる形にしたい場合
- 処理時間を計測してボトルネックを見つける方法: 大量の行列操作でマクロが遅いと感じたとき、どこに時間がかかっているか調べたい場合


コメント