こんにちは、Ryoです。
Excelで行や列に対する操作を行うことは多々ありますが、羅列するデータの中で必要なデータをピックアップする際に他の行や列を非表示にすることで視認性を向上することが出来ますので、その非表示をVBAで扱う際にどう使うかについて書いていきたいと思います。
サンプルとしては先ず単独/範囲での非表示や連続しない複数の行/列に対する選択方法についてと、それらを使った簡単な運用例を紹介します。
1.サンプル概要、サンプルコード
◆単独、及び連続する(隣接する)行/列に対する非表示方法
サンプルとして以下画像の表を使います。この表に対し、「行番号8、15~17」と「列番号C、K~M」を非表示にします。
サンプル実行後は以下の通り非表示となります。
サンプルコードは次の通りです。
Sub Sample1() '単一の行を非表示 Rows(8).Hidden = True '複数行の非表示 Rows("15:17").Hidden = True '単一の列を非表示 Columns("C").Hidden = True '複数列の非表示 Columns("K:M").Hidden = True End Sub
指定した行や列を非表示とするにはHiddenプロパティを使用します。
オブジェクト.Hidden = True(非表示)又はFalse(表示)
非表示とした行や列を再度表示させるには、同様の記述をして=FalseとすればOKです。
◆連続(隣接)しない複数の行/列を非表示にする
次は上述と同じ表を使い、「行番号8~10、13~14、17」と「列番号D~F、I~K、M」を非表示にします。
≪実行前≫
≪実行後≫
サンプルコードは次の通りです。
Sub Sample2() '連続しない(隣接しない)行の選択と非表示 '行番号8~10、13~14、17を非表示 Application.Union(Range(Cells(8, 1), Cells(10, 1)), Range(Cells(13, 1), _ Cells(14, 1)), Cells(17, 1)).EntireRow.Hidden = True '又は以下指定でも可 'Application.Union(Range("8:10"), Range("13:14"), _ 'Range("17:17")).EntireRow.Hidden = True '連続しない(隣接しない)列の選択と非表示 '列番号D~F、I~K、Mを非表示 Application.Union(Range(Cells(1, 4), Cells(1, 6)), Range(Cells(1, 9), _ Cells(1, 11)), Cells(1, 13)).EntireColumn.Hidden = True '又は以下指定でも可 'Application.Union(Range("D:F"), Range("I:K"), _ 'Range("M:M")).EntireColumn.Hidden = True End Sub
不連続な行や列を指定して処理するには、Application.UnionメソッドとEntrieRow/EntrieColumnプロパティを使用します。
Application.Unionメソッドについては、こちらのMSDNがわかりやすいと思いますので、よろしければご参照ください。ちなみにApplication.を前に記述せずUnionでも普通に動作します。
EntrieRow/EntrieColumnは指定したセルやセル範囲を含む行・列を取得するプロパティなので、それを利用して処理対象のセルやセル範囲をサンプルコード内で指定しています。
実際に使用上では不連続であることの方が多いと思いますので、この方法を知っておくと便利です。
◆非表示状態の解除(全体)
一部の非表示状態解除であればサンプルコード記述のTrueをFalseに変えれば良いですが、全体をサッと元の表示に戻すには以下の通り記述すればOKです。
Sub Sample3() '非表示状態の解除 Rows.Hidden = False Columns.Hidden = False End Sub
この指定で行と列全体に対して解除(非表示⇒表示)してくれます。
2.【参考例】表内データのピックアップ
本例はタブレットPCなどを使用して、Sheetに出力されたデータリストから必要とするデータのみをピックアップして表示したいケースを想定しています。サンプルとして使用する表は1.で使用したものと同一ですが、ピックアップしたい番号(S/N欄)を選択した時に処理を実行させますので、「シートモジュール」に記述します。
≪実行前≫
≪実行後≫
「S/N欄」(例はA003)を選択すると処理が実行されます。
◆サンプルコード
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Active_Row, T_HideCnt, B_HideCnt As Long '//**処理対象外の設定など**// 'ファイル名が処理対象と異なる場合は終了 If InStr(ThisWorkbook.Name, "Hidden") = 0 Then Exit Sub '対象列以外、又は範囲指定の場合は終了 If InStr(Target.Address, "C") = 0 Or _ InStr(Target.Address, ":") <> 0 Then Exit Sub '入力範囲の塗りつぶしを「なし」にし、フォントをデフォルトサイズにする With Range("C8:M17") .Interior.ColorIndex = xlNone .Font.Size = 10 End With '【参考】行番号8をウィンドウ枠固定化 If Target.Value <> "" And ActiveWindow.FreezePanes = False Then Rows("8:8").Select ActiveWindow.FreezePanes = True Cells(8, 2).Select End If '選択したセルが空白なら終了 If Target.Value = "" Then Exit Sub '//**表示/非表示対象行の取得、行/列の非表示化**// 'アクティブセルの行番号取得 Active_Row = Target.Row 'アクティブセルより上の行で非表示とする行数 T_HideCnt = Active_Row - 9 'アクティブセルより下の行で非表示とする行数 B_HideCnt = 17 - Active_Row 'アクティブセルより上で非表示対象行があれば実行 If T_HideCnt >= 0 Then Rows("8:" & 8 + T_HideCnt).Hidden = True 'アクティブセルより下で非表示対象行があれば実行 If B_HideCnt <> 0 Then Rows(Active_Row + 1 & ":17").Hidden = True 'ピックアップ対象以外の列を非表示 Application.Union(Range(Cells(1, 4), Cells(1, 6)), Range(Cells(1, 9), _ Cells(1, 11)), Cells(1, 13)).EntireColumn.Hidden = True '//**Application.Unionを使わない場合は以下の形で指定**// 'Columns("D:F").Hidden = True 'Columns("I:K").Hidden = True 'Columns("M").Hidden = True '//**対象セルの強調化**// 'ピックアップ対象セルの背景色フォントカラー、サイズを設定 '連続しない(隣接しない)セルをUnionでまとめて処理 With Application.Union(Range(Cells(Active_Row, 7), _ Cells(Active_Row, 8)), Cells(Active_Row, 12), Cells(Active_Row, 3)) .Interior.ColorIndex = 1 .Font.ColorIndex = 3 .Font.Size = 16 End With '//**必要があれば次行の表示に時間差を設ける**// '1秒間処理を中断する Application.Wait Now + TimeValue("00:00:01") '処理再開時に次の行表示 Rows(Active_Row + 1).Hidden = False End Sub
セルを選択した時に処理を実行するので、Worksheet_SelectionChangeを使用します。
このイベントはとにかく選択したら実行されるので、処理対象外とする操作を記述しておかないとエラー頻発しますから注意が必要です。
私の場合はファイル名や対象列、単独Or範囲などを指定して想定外動作は終了するようにしています。他のフォントサイズや塗りつぶし、ウィンドウ枠の固定化などは必要に応じてで良いと思いますので、参考程度に見ていただければ良いです。
次の表示/非表示対象行の取得~非表示化については、選択したセルと次の行のみ表示させて列は画像内赤矢印部のみとしたいので、アクティブセル行番号から算出して対象行以外を非表示とし列の非表示対象は予め判っていますから、複数範囲をまとめて指定します。
Application.Union(Range(Cells(1, 4), Cells(1, 6)), Range(Cells(1, 9), Cells(1, 11)), Cells(1, 13)).EntireColumn.Hidden = True
後は強調したいセルに対してフォントサイズや色、背景色を指定して変化させればOKです。
最後の方に記述しているWaitを使った処理中断は、例えば一定時間経過後に次の行を表示させることによって「誤認」を防ぐなど効果があるようなら、使えるかもしれません。
非表示を使ったデータのピックアップ例を書いてみましたが、この辺りは色々なアプローチがありますから、参考程度に見ていただければ良いと思います。
3.まとめ
行や列の非表示自体は簡単なのですが、私が使う上では連続しない範囲指定をするケースが多いので、そこに焦点を当てて書いてみました。この機能も使ってみると表示したいデータを柔軟に対応出来るので、知っておくと何かと有用かと思います。何か機会があればご検討されてみるのも良いかもしれません。
以上、行や列(単独/範囲)を非表示にする方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo