Excelで扱う表の列数が多くなると、「特定の項目だけ一時的に隠したい」「用途によって必要な列だけ表示したい」といった場面が増えてきます。
手作業でも列を選択して非表示にできますが、毎回同じ条件で操作するのであれば、VBAで自動化した方が効率的です。特に「備考」「社内用」「管理番号」など、列の見出しを基準として非表示にしたい場合は、列番号を直接指定するよりも見出しを判定する方法が扱いやすくなります。
VBAでは、列のHiddenプロパティを利用することで列を非表示にできます。ただし、実務では単純に「C列を非表示」のように固定するだけでは、表のレイアウト変更に弱いコードになってしまいます。
この記事では、条件に一致する列を判定し、必要な列だけを自動的に非表示にする方法を解説します。まず前半では、基本となるHiddenプロパティの仕組みから、見出しを完全一致で判定する実務向けのコードまで確認していきましょう。
✅ VBAで条件に一致する列を非表示にする基本的な考え方
VBAで列を非表示にすること自体は難しくありませんが、実務では「どの列を隠すか」の判定方法が重要になります。列番号を固定したコードは簡単に書ける一方、途中に列が追加されるだけで意図しない列を非表示にする可能性があります。
また、「条件に一致したセルを非表示にする」と考えてしまうと、Hiddenプロパティの扱いでつまずくことがあります。Hiddenプロパティは基本的に行や列を対象として使用するためです。さらに、列を削除する処理とは異なり、非表示ではデータそのものは残ります。この違いを理解しておかないと、用途に対して必要以上に強い処理を選んでしまいます。まずは列を非表示にする基本構造を理解してから、条件判定を組み合わせていきましょう。
・Hiddenプロパティを使って列を非表示にする
VBAでは、列のHiddenプロパティをTrueに設定すると、その列を非表示にできます。
例えば、C列を非表示にする場合は次のように記述します。
Sub HideColumnC()
' C列を非表示にする
Worksheets("Sheet1").Columns("C").Hidden = True
End Sub処理の流れはシンプルです。
Worksheets("Sheet1")で処理対象のシートを指定するColumns("C")でC列を指定するHidden = Trueを設定する- C列全体が非表示になる
再び表示したい場合は、Falseを指定します。
Worksheets("Sheet1").Columns("C").Hidden = Falseつまり、基本的には次のように使い分けます。
Hidden = True:非表示Hidden = False:再表示
ただし、この方法では「C列」という位置を直接指定しています。
毎回同じレイアウトのファイルであれば問題ありませんが、実務では列の追加や削除によって対象列が移動することがあります。
例えば、現在C列にある「備考」が、仕様変更によってD列へ移動したとします。Columns("C")を固定しているコードでは、変更後もC列を非表示にしてしまいます。
そこで、列番号ではなく見出しの文字列を確認して対象列を判断する方法が有効になります。
・列の削除ではなく非表示を使うメリット
「不要な列なら削除してしまえばよいのでは?」と思うかもしれませんが、削除と非表示では用途が異なります。
列を削除すると、セルに保存されている値や数式も失われます。また、その列を参照している数式や別の処理に影響する可能性があります。
一方、非表示であれば列そのものは残っています。
例えば、次のような使い方ができます。
- 社内管理用の列だけ一時的に隠す
- 印刷や資料提出前に不要な列を非表示にする
- 利用者によって表示する項目を切り替える
- 集計に必要だが通常は見せる必要のない補助列を隠す
このような用途では、データを消さずに表示だけを変更できる非表示処理が向いています。
特に既存のブックを自動化するときは、「見えていない列も後続処理では利用する」というケースがあります。そのため、見た目だけを整理したいのであれば、安易に削除するよりHiddenを利用した方が安全です。
条件に一致した列を非表示にするのではなく、不要な列そのものを取り除きたい場合は、「特定の値を含む列を削除する方法」もあわせて確認しておくと、非表示と削除を目的に応じて使い分けやすくなります。
✅ VBAで見出しが条件に一致する列を非表示にする方法
実務では「3列目を隠す」よりも、「見出しが『備考』なら隠す」という条件の方が仕様として分かりやすいことがあります。列の位置は変更されても、見出し名が変わらなければ同じコードを利用できるためです。ただし、見出しを検索するときにワークシート全体を無条件に走査すると、必要のないセルまで判定するコードになってしまいます。
また、最終列を固定値にすると、新しい項目が追加されたときに判定対象から漏れる可能性があります。そこで、見出し行の最終列を取得し、その範囲だけを順番に確認する構成にしておくと保守しやすくなります。ここでは「1行目が見出し」という一般的な表を例に、列位置に依存しにくい処理を作っていきます。
・「備考」と完全一致する見出しの列を自動で隠す
例えば、1行目に次のような見出しがあるとします。
商品番号|商品名|単価|数量|備考
このうち「備考」列だけを非表示にしたい場合、1行目を順番に確認して「備考」と一致した列を判定できます。
Sub HideMatchingColumn()
Dim targetSheet As Worksheet
Dim lastColumn As Long
Dim currentColumn As Long
Dim targetHeader As String
' 処理対象のシートと検索する見出しを設定
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
targetHeader = "備考"
' 1行目を基準に、使用されている最後の列を取得
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Column
' 見出しを左から順番に確認
For currentColumn = 1 To lastColumn
If targetSheet.Cells(1, currentColumn).Value = targetHeader Then
' 条件に一致した列を非表示にする
targetSheet.Columns(currentColumn).Hidden = True
End If
Next currentColumn
End Subこのコードでは、「備考が何列目にあるか」を事前に決めていません。
まず、
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Columnによって1行目の最終列を取得しています。
そのうえで、1列目から最終列までをFor文で確認し、
If targetSheet.Cells(1, currentColumn).Value = targetHeader Thenによって見出しが「備考」と一致するかを判定します。
一致した場合だけ、
targetSheet.Columns(currentColumn).Hidden = Trueを実行する仕組みです。
この構成であれば、「備考」がC列からF列へ移動したとしても、見出しが同じであれば対象を見つけて非表示にできます。
・検索する見出しを変数にしておく理由
先ほどのコードでは、条件式に直接"備考"と書かず、次の変数を用意しています。
Dim targetHeader As String
targetHeader = "備考"もちろん、次のように直接記述することもできます。
If targetSheet.Cells(1, currentColumn).Value = "備考" Then短いコードだけを見ると、こちらの方が簡潔です。
しかし、実務では後から「備考ではなく管理番号を非表示にしたい」といった仕様変更が発生することがあります。
判定条件をtargetHeaderとして分離しておけば、基本的には設定部分を変更するだけで済みます。
targetHeader = "管理番号"また、targetSheetも変数として保持しているため、処理対象が何なのかをコードから判断しやすくしています。
ActiveSheetやSelectionに依存する書き方は短くできますが、利用者が別のシートを開いていた場合などに意図しない場所を処理する原因になります。
そのため、業務で繰り返し使用するマクロでは、
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")のように、処理対象をコード側で明確にしておくことが重要です。
✅ VBAで列の値を判定して非表示にするときの考え方
見出しだけではなく、列内に保存されている値を条件として列を非表示にしたいケースもあります。ただし、ここでは「どこか1セルでも一致すれば隠すのか」「指定した行だけを見るのか」によって処理結果が大きく変わります。条件を曖昧にしたままループを組むと、想定以上の列が非表示になることがあります。
また、行数と列数の両方を無条件に走査すると、データ量によっては処理回数も増えてしまいます。特に実務では、検索範囲を必要な部分に限定する設計が重要です。見出し判定とは異なり、データ部分を条件にする場合は「何をもってその列を対象とするのか」を先に決める必要があります。後半では、この違いを踏まえて、列内の値・部分一致・複数条件を使った非表示処理へ発展させていきます。
・指定した行の値を判定して列を非表示にする
見出しではなく、特定の行に入力されている値を基準として列を非表示にすることもできます。
例えば2行目に「対象」「対象外」などの管理情報が入力されており、「対象外」となっている列を隠したいケースです。
この場合も、列を順番に確認する基本的な考え方は変わりません。
Sub HideColumnByValue()
Dim targetSheet As Worksheet
Dim lastColumn As Long
Dim currentColumn As Long
Dim targetValue As String
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
targetValue = "対象外"
' 1行目を基準に最終列を取得
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Column
' 2行目の値を左から順番に確認
For currentColumn = 1 To lastColumn
If targetSheet.Cells(2, currentColumn).Value = targetValue Then
' 「対象外」の列を非表示にする
targetSheet.Columns(currentColumn).Hidden = True
End If
Next currentColumn
End Subこのコードでは、1行目ではなく2行目を条件判定に使用しています。
処理の流れは次のとおりです。
- 対象となるワークシートを指定する
- 非表示の条件となる
"対象外"を変数に設定する - 1行目から表の最終列を取得する
- 2行目を左から順番に確認する
"対象外"と一致した列だけHidden = Trueにする
この方法が向いているのは、判定に使用する行があらかじめ決まっている表です。
一方、「列内のどこかに対象の値があったら非表示」という条件では、各列の複数セルを確認する必要があります。
すべてのセルを無条件に調べるのではなく、実際の業務ルールに合わせて判定範囲を限定することが重要です。
✅ VBAで特定の文字を含む列を部分一致で非表示にする
完全一致だけで判定すると、「社内用」と「社内用_管理」のような似た見出しをまとめて処理できません。そこで便利なのが、InStr関数による部分一致です。ただし、部分一致は条件を広くできる反面、想定していなかった見出しまで一致する可能性があります。
例えば「管理」という文字だけで検索すると、「管理番号」「管理者」「管理用メモ」などがすべて対象になることがあります。削除とは違ってデータそのものは残りますが、必要な列まで見えなくなると利用者はデータがなくなったと誤解するかもしれません。そのため、部分一致を使う場合は検索文字をどこまで具体的にするかが重要です。便利だからと無条件に完全一致から置き換えるのではなく、表の命名規則に合わせて使い分けましょう。
・InStrで見出しを部分一致判定して非表示にする
例えば、次のような見出しがあるとします。
社員番号|氏名|所属|社内用_確認|社内用_備考
「社内用」が含まれる列をまとめて非表示にするのであれば、InStrを利用できます。
Sub HideColumnsByPartialMatch()
Dim targetSheet As Worksheet
Dim lastColumn As Long
Dim currentColumn As Long
Dim searchText As String
Dim headerText As String
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
searchText = "社内用"
' 1行目から最終列を取得
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Column
For currentColumn = 1 To lastColumn
' 判定する見出しを取得
headerText = CStr(targetSheet.Cells(1, currentColumn).Value)
If InStr(1, headerText, searchText, vbTextCompare) > 0 Then
' 検索文字を含む列を非表示にする
targetSheet.Columns(currentColumn).Hidden = True
End If
Next currentColumn
End Subポイントは次の部分です。
If InStr(1, headerText, searchText, vbTextCompare) > 0 ThenInStrによってheaderTextの中からsearchTextを検索し、文字が見つかった場合に列を非表示にしています。
vbTextCompareを指定しているため、アルファベットを含む見出しの場合でも大文字・小文字を区別せずに判定できます。
また、
headerText = CStr(targetSheet.Cells(1, currentColumn).Value)として判定対象を文字列として扱っています。
見出しの完全一致で十分なら、前半で紹介した
If targetSheet.Cells(1, currentColumn).Value = targetHeader Thenの方が処理意図は明確です。
「複数の似た見出しをまとめて対象にしたい」という場合に、部分一致を選択するとよいでしょう。
InStrによる部分一致の考え方やLikeとの使い分けを詳しく確認したい場合は、「VBAで文字列を部分一致判定する方法」も参考にすると、条件判定をより柔軟に組み立てられます。
✅ VBAで複数条件に一致する列をまとめて非表示にする
実務では、非表示にしたい列が1種類だけとは限りません。「備考」「社内用」「管理番号」など、利用者には見せる必要のない複数項目をまとめて隠したいこともあります。このとき条件ごとに同じループ処理を何度も記述すると、条件が増えるほどコードが長くなります。
さらに、後から非表示対象を追加するときに複数箇所を修正する構成では、変更漏れも発生しやすくなります。条件と実際の非表示処理をできるだけ分けて考えることが、保守しやすいコードにつながります。特に定期的に仕様変更される業務ファイルでは、「何を隠すか」を後から変更しやすくしておくことが重要です。ここでは、複数の見出しを判定する基本的な方法を確認します。
・Select Caseで複数の見出しをまとめて判定する
対象となる見出しが明確に決まっている場合は、Select Caseを使うと条件を読み取りやすくできます。
Sub HideMultipleColumns()
Dim targetSheet As Worksheet
Dim lastColumn As Long
Dim currentColumn As Long
Dim headerText As String
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
' 1行目から最終列を取得
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Column
For currentColumn = 1 To lastColumn
headerText = CStr(targetSheet.Cells(1, currentColumn).Value)
Select Case headerText
Case "備考", "社内用", "管理番号"
' 指定した見出しの列を非表示にする
targetSheet.Columns(currentColumn).Hidden = True
End Select
Next currentColumn
End Subこの書き方では、
Case "備考", "社内用", "管理番号"を見るだけで、どの見出しが非表示対象なのか確認できます。
条件が少ない場合は、複雑な配列や別処理を用意するより、このように条件を明示した方が後からコードを確認する人にも意図が伝わりやすいことがあります。
例えば、後から「内部ID」も隠すことになった場合は、
Case "備考", "社内用", "管理番号", "内部ID"のように条件を追加できます。
コードを短くすることだけではなく、数か月後に別の担当者が見ても非表示の条件を理解できるかという視点で書き方を選ぶことが大切です。
複数の条件を使って列を判定し、非表示ではなく必要な列だけを取り出したい場合は、「複数条件に一致する列を抽出する方法」も参考になります。AND・OR条件を使った判定へ発展させたい場合にも役立ちます。
✅ VBAで列を非表示にする前に再表示しておく理由
条件によって列を非表示にするマクロでは、「隠す処理」だけを考えると後から問題が起きることがあります。特に条件が毎回変わるファイルでは、前回の実行結果として非表示になった列がそのまま残る可能性があります。
例えば前回は「備考」が非表示対象だったものの、今回は条件から外れた場合、非表示処理だけでは「備考」列は自動的に戻りません。その結果、現在の条件と画面上の表示状態が一致しなくなります。マクロを1回だけ使うのか、何度も繰り返し実行するのかによって必要な設計は変わります。定期的に実行する業務マクロであれば、実行前の状態をどう扱うかまで決めておくことが重要です。表示状態を毎回作り直したい場合は、一度再表示してから条件を判定する方法が分かりやすくなります。
・一度すべて表示してから条件を再判定する
例えば、見出し条件によって毎回表示状態を更新するのであれば、最初に対象列を再表示できます。
Sub RefreshHiddenColumns()
Dim targetSheet As Worksheet
Dim lastColumn As Long
Dim currentColumn As Long
Dim headerText As String
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
' 1行目から最終列を取得
lastColumn = targetSheet.Cells(1, targetSheet.Columns.Count).End(xlToLeft).Column
' 前回の非表示状態をいったん解除
targetSheet.Range( _
targetSheet.Columns(1), _
targetSheet.Columns(lastColumn) _
).EntireColumn.Hidden = False
' 現在の条件で表示状態を再判定
For currentColumn = 1 To lastColumn
headerText = CStr(targetSheet.Cells(1, currentColumn).Value)
Select Case headerText
Case "備考", "社内用", "管理番号"
targetSheet.Columns(currentColumn).Hidden = True
End Select
Next currentColumn
End Subこのコードでは、
- 最終列を取得する
- 表の対象範囲にある列をいったん再表示する
- 現在の見出しを確認する
- 条件に一致した列だけ改めて非表示にする
という順番にしています。
こうしておけば、以前の実行結果を引きずりにくくなります。
ただし、もともと利用者が手動で非表示にしていた列まで表示してはいけないブックでは、この方法は適しません。
「マクロが管理する表示状態」と「利用者が手動で設定した表示状態」が混在している場合は、どこまでマクロで変更してよいのかを事前に決めておきましょう。
✅ VBAで条件一致した列を非表示にするときの実務上の注意点
列の非表示はデータを削除しないため比較的安全に見えますが、業務ファイルでは表示状態そのものが利用者の操作に影響します。必要な列まで隠れてしまえば、「データが消えた」「項目が出力されていない」と勘違いされることもあります。
また、マクロ実行後に別の処理が続く場合、非表示列を含んだ範囲が後続処理でどのように扱われるのかも確認が必要です。さらに、見出しの表記揺れや空白によって、本来対象になる列が判定されないケースもあります。コードがエラーにならないからといって、正しい結果になっているとは限りません。非表示処理では、条件と表示結果が利用者から確認しやすい設計にすることも重要です。最後に、実務で特に確認しておきたいポイントを整理します。
・見出しの表記揺れに注意する
完全一致では、
"備考"と
"備考 "は同じ文字列として扱われません。
Excelでは見た目だけでは末尾のスペースに気づきにくいため、外部データから見出しを取り込んでいる場合などは注意が必要です。
必要に応じてTrimを使用し、
headerText = Trim(CStr(targetSheet.Cells(1, currentColumn).Value))のように前後の余分なスペースを除去してから判定する方法もあります。
・列番号の固定は用途を考えて使う
例えば、
Columns("D").Hidden = Trueという書き方自体が間違っているわけではありません。
「D列は必ず社内管理列」という仕様が保証されているのであれば、固定指定の方が単純で分かりやすい場合もあります。
一方、利用者が列を追加したり、システムから出力される項目順が変更されたりする可能性があるなら、見出しを判定した方が変更に対応しやすくなります。
重要なのは、複雑なコードを書くことではなく、そのExcelファイルが今後どのように変更される可能性があるかを考えて方法を選ぶことです。
・非表示と削除・抽出を目的によって使い分ける
条件に一致した列を見せたくないだけなら、Hiddenによる非表示が適しています。
一方で、
- 不要な列そのものを取り除きたい
- 必要な列だけ別シートへ取り出したい
- 条件に一致するデータを別の表として作り直したい
といった場合は、列の削除や抽出、コピーなど別の処理を検討した方がよいでしょう。
「条件に一致したものを見つける」という部分は似ていますが、見つけた後に何をしたいのかによって適切な処理は変わります。
条件に一致した列を隠すのではなく、必要な列だけを別シートへまとめたい場合は、「条件に一致する列だけを別シートへ抽出する方法」を確認すると、表示制御からデータ抽出へ処理を発展させられます。
✅ まとめ:VBAで条件に一致する列を判定して自動で非表示にしよう
VBAを使えば、列番号を直接指定するだけでなく、見出しやセルの値を判定して必要な列を自動的に非表示にできます。
単純に列を隠すだけならコードは短くできますが、実務では表のレイアウト変更や条件変更、マクロの再実行まで考慮しておくことが重要です。
今回のポイントをまとめると、次のとおりです。
- 列の非表示には
Hidden = Trueを使用する - 再表示する場合は
Hidden = Falseを使用する - 列位置が変わる可能性がある場合は、列番号ではなく見出しで判定する
- 完全一致では、対象となる見出しを正確に限定できる
InStrを使えば、特定の文字を含む複数の見出しを部分一致で判定できる- 複数の見出しを対象にする場合は、
Select Caseなどで条件を整理できる - 繰り返し実行するマクロでは、以前の非表示状態をどう扱うかも考える
- 表記揺れが想定される場合は、
Trimなどによる文字列の調整も検討する - データを残して表示だけを変えたい場合は、列削除より非表示が適している
実務では、「とりあえず列を隠す」だけではなく、何を条件として、どの列を、どのタイミングで非表示にするのかを明確にしておくことが大切です。
見出しを基準にした判定を取り入れておけば、列の位置が変わるファイルにも対応しやすくなります。さらに再表示と再判定まで含めて設計しておけば、条件が変化する業務ファイルでも表示状態を管理しやすくなるでしょう。