こんにちは。お邪魔します。
非表示も再表示も、行と列それぞれ、一回の処理ですませるように
また、参照文字列で指定するRangeプロパティの高い能力を活用するように
書いてみました。
速さをいうなら、もっと方法はありますが、
比較的扱い易い、遅くはない、方法を選びました。
HideCustomToggle()を実行すると交互に、非表示⇔再表示、するようにしています。
一番下のPrivate Sub PrintRowsRef4Hide()は、
行が増えたり変更が必要な時に
非表示にする行の参照文字列をイミディエイトウィンドウに出力するもので、
VBAの記述上でのセル範囲指定をサポートする為のものです。
不要なら削除して構いません。
マクロの呼び出しをシート上に配置したActiveXコマンドボタンから行う場合は、
コマンドボタンを"非表示にする範囲"に掛かって配置しないこと、
コマンドボタンのプロパティ TakeFocusOnClick をFalseに指定すること、
の2点、留意してください。
できれば、ウィンドウ枠の固定機能を使って
コマンドボタンをスクロールできない位置に配置した方がベターです。
期待の動作と違う場合や、疑問がある場合、補足欄にでも書いてみてください。
Sub HideCustomToggle() ' メイン 実行マクロ (Re8140423)
With ActiveSheet.UsedRange
If .Count = .SpecialCells(xlCellTypeVisible).Count Then
' ' 非表示セルがなければ、非表示
Call HideCustom(ActiveSheet)
Else
' ' 非表示セルがあればすべて再表示
Call UnDoHide(ActiveSheet)
End If
End With
End Sub
Sub UnDoHide(Sh As Worksheet) ' 再表示
With Sh
.Rows.Hidden = False
.Columns.Hidden = False
End With
End Sub
Sub HideCustom(Sh As Worksheet) ' 非表示
Const SREF_HIDECOL = "・合計・差額・" ' "・"区切り、両端も"・"、追加指定可能
Dim r As Range
Dim sRef As String
With Sh
' ' 行非表示
.Range( _
"6:9,11:14,16:19,21:24,26:29,31:34,36:39,41:44,46:49,51:54,56:59,61:64,66:69,71:74,76:79,81:84,86:89,91:94,96:99,101:104,106:109,111:114,116:119,121:124,126:129,131:134,136:139,141:144,146:149,151:154" _
).EntireRow.Hidden = True
' ' 項目名をチェックして一致すれば列非表示ようのセル参照に加える
For Each r In .UsedRange.Rows(1).Cells
If InStr(SREF_HIDECOL, "・" & r.Value & "・") Then sRef = sRef & "," & r.Address(0, 0)
Next
sRef = Mid$(sRef, 2)
' ' 列非表示
.Range(sRef).EntireColumn.Hidden = True
End With
End Sub
Private Sub PrintRowsRef4Hide() ' (コーディング補助)
' ' 行アドレスをイミディエイトウィンドウに出力
Dim sRef As String
With ActiveSheet.UsedRange
With .Columns(.Columns.Count + 1)
.Formula = "=1/MOD(ROW(),5)"
sRef = .Offset(5).SpecialCells(xlCellTypeFormulas, xlNumbers).EntireRow.Address(0, 0)
.ClearContents
Debug.Print Len(sRef) & "文字…" & IIf(Len(sRef) < 256, "そのまま使えます", "255を超えているので分割しないと使えません")
Debug.Print """"; sRef; """"
End With
End With
sRef = ActiveSheet.UsedRange.Row ' 手作業での最終セル取得(Ctrl+End等)を可能にするダミー処理
End Sub
お礼
返信遅くなりましてすみません。 すごいです。かなり早く処理が終わりました! ただ、 ' ' 列非表示 .Range(sRef).EntireColumn.Hidden = True でエラーになってしまいました。 デバッグのやり方がまだまだ分からなくて… ボタンの配置も、上部を固定にして作ることで、 すっきり綺麗に使えるようになりました! ありがとうございました。