[[20210127183410]] 『【VBA】指定範囲の最終行以下を非表示にしたい』(ありんこ) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『【VBA】指定範囲の最終行以下を非表示にしたい』(ありんこ)

名簿管理をしております。
以下のような名簿を「一覧」というシート名で作成しているときに、
C9:C76の範囲にある最下部の名前(例だとC19)以下C76までの行と、C80:C147の範囲にある最下部の名前(例だとC88)以下C147までの行を非表示にしたい(最終敵に他シートに実行&再表示ボタンを設置)と考えております。

VBAがさっぱりわからず、関数で指定範囲の最終行を取得して最終行以下を非表示にすればいいのか?
と考えて、とりあえず

 =MAX(IFERROR(MATCH(MAX(C9:C76)+1,C9:C76, 1),0),IFERROR(MATCH("",C9:C76,-1),0))*2+1
→重複するのでC9:C76だけの関数を作成しております。
という関数で最終行の取得まではできたのですが、それ以降がとんと進まず、皆様の知恵をお借りすることができればと思い投稿させていただきました。

また、条件には含まれていませんが「一覧」シートだけでなく、他のシートでも同様に指定範囲の最終行以下を日表示にしたいと考えておりますので、応用できるようコメントをいただけると助かります。
よろしくお願いいたします。

「一覧」シートのデータ↓
 C:F(結合セル)
8 名前
9 い
11 ろ
13 は
15 に
17 (空欄)(非表示にしない)
19 ほ
21 (空欄)



75 (空欄)
77 (1行で空欄)(非表示にしない)
78 名前(非表示にしない)
80 へ
82 と
84 ち
86 (空欄)(非表示にしない)
88 り
90 (空欄)



146 (空欄)
148 (1行で空欄)(非表示にしない)
149 (以下非表示にしない)
※C9:C76とC80:C147までは2行ずつ結合されてます

非表示の結果↓
 C:F(結合セル)
8 名前
9 い
11 ろ
13 は
15 に
17 (空欄)(非表示にしない)
19 ほ

非表示

77 (1行で空欄)(非表示にしない)
78 名前(非表示にしない)
80 へ
82 と
84 ち
86 (空欄)(非表示にしない)
88 り

非表示

148 (1行で空欄)(非表示にしない)
149 (以下非表示にしない)
※C9:C76とC80:C147までは2行ずつ結合されてます

< 使用 Excel:Excel2016mac、使用 OS:MacOSX >


 こんなことでしょうか。
  
Sub Test()
    Dim i As Long
    With Sheets("Sheet1")
        For i = 76 To 9 Step -1
            If Cells(i, 3).Value = "" Then Rows(i).Hidden = True
            If Cells(i, 3).Value <> "" Then Exit For
        Next i
        For i = 147 To 80 Step -1
            If Cells(i, 3).Value = "" Then Rows(i).Hidden = True
            If Cells(i, 3).Value <> "" Then Exit For
        Next i
    End With
End Sub

  
(tora) 2021/01/27(水) 21:11

tora様

コメントありがとうございます。
いただきましたマクロを実行したところ、ほとんど期待通りに動作いたしました。
本当にありがとうございます。
しかしながら、以下の結果ではなく

 19 ほ 
 20 "表示"
 21 非表示
 ・ 
 非表示 
 ・ 
 77 (1行で空欄)(非表示にしない) 

以下のようになりました

 19 ほ 
 20 "非表示"
 21 非表示
 ・ 
 非表示 
 ・ 
 77 (1行で空欄)(非表示にしない) 

19、20は結合されたセルなので、20は表示しておきたいのです。
よろしくお願いいたします。
(ありんこ) 2021/01/28(木) 21:07


 結合セルを考慮していなかったので修正しました。
  
Sub Test()
    Dim i As Long
    With Sheets("Sheet1")
        For i = 76 To 9 Step -1
            If Cells(i, 3).Value = "" And Cells(i, 3).MergeCells = False Then Rows(i).Hidden = True
            If Cells(i, 3).Value <> "" Then Exit For
        Next i
        For i = 147 To 80 Step -1
            If Cells(i, 3).Value = "" And Cells(i, 3).MergeCells = False Then Rows(i).Hidden = True
            If Cells(i, 3).Value <> "" Then Exit For
        Next i
    End With
End Sub
  
(tora) 2021/01/28(木) 22:20

 とりあえず結合セルは非表示にしないよにしたんですけど、
 よく考えたら、結合セルでもなにも入力されていなくて非表示にしたい場合があるんですよね?
 その場合はうえのコードではうまくいきませんね。
  
(tora) 2021/01/28(木) 22:35

 再度作ってみました。
 これでうまくいくといいのですが。
  
Sub Test4()
    Dim i As Long
    Dim r As Long
    With Sheets("Sheet1")
        For i = 76 To 9 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i
        For i = 147 To 80 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i
    End With
End Sub

 ↑一部修正しました。  
(tora) 2021/01/29(金) 09:03

tora様

ご返信が遅くなり申し訳ございません。
色々と試しておりました。

修正ありがとうございます!
期待どおり動作することを確認いたしました。

複数シートに渡って実行したく、以下の変更を加えて見ましたが、エラーになってしまいました。
Sheets(Array("一覧", "一覧(白)")).Select
しかし、「With-End With」間を重複することで解決することができました。
本当にありがとうございます。

本来であればいただいたコードを元に自力で変更を試したいと思っていたのですが、追加の質問をしてもよろしいでしょうか?
1. 当該行と当該列にある値(0)が連続した場合、非表示になって欲しい。
・H149:AL158(31行10列)には数字が並んでおります。
このとき1行に0が28個〜31個連続した場合その行を非表示にしたい。
考えうる可能性として、末尾3行は空欄の場合がある。

・AM9:AU76,AM80:AU147(9行68列がふたつ)には以下のように一つとびで数字が並んでおります。
このとき1列に0と空欄のみが存在した場合その列を非表示にしたい。

   AM 
9 0
10 
11 0
12
13 1
14
・
・
・

どちらも空欄を除いて1以上が存在したときに非表示にしないという文でできるのではないかと思う。

2. 列の非表示
シートを指定してA, H:K, AM:APの列を非表示にしたい。

どちらもいただいたコードとともに実行したいと考えております。
他にシートのロックと解除を実行しているのですが、こちらは
「Dim i As Long - End With」の前後に

 Sheets("一覧").Select
 ActiveSheet.Unprotect
と
 Sheets("一覧").Select
 ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
というコードを追加することで実現することができました。

大変申し訳ございませんが、ご教授いただけると幸いです。
よろしくお願いいたします。
(ありんこ) 2021/01/30(土) 00:38


 修正コードがうまくいって何よりです。
 いくつか気づいた点を書いておきます。

 1.複数シートにわたって実行したいとのことで、ご自分で工夫されたようですね。
   うまくいったということですからそれでいいのですが、もし
       With Sheets("一覧")
       	   この間にコードを記入
       End With
       With Sheets("一覧(白)")
          この間にコードを記入 (前出のコードをコピー)
       End With
   みたいなことをされているのであればもっと効率的な方法を検討されたらいいと思います。
   コードが短いときはそれでもいいですけど、同じコードを二回くりかえして書くのは無駄ですし、
   また、なにより間違いの元です。

 2.シートの保護と解除は、たぶんマクロの自動記述を利用されたと思いますが。
   (間違いではないですけど)無駄な部分もありますし、記述場所も必ずしも適当ではないかもしれません。
   とりあえず今回のコードに入れてありますので参考にしてください。(私の案が最適かどうかわかりませんが)

 3.前回のコード(行を非表示にする件)では、二つの部分に分けて同じようなことを二回記述しましたが、
   実際にはやりたいことがいろいろ増えてきていますので、繰り返しの部分は一回にした方がいいかもしれません。
   今回のコードではそこも修正してあります。

 4.「シートを指定してA, H:K, AM:APの列を非表示にしたい」件については、さほど難しくないと思いますので、
   「VBA 列の非表示」などで検索してみてください。
   そのうえで不明な点があれば再度ご質問ください。

 5.最後に、VBAのコードの書き方はいろいろあります。
   私もわからないことはネットで調べながら回答している部分もあります。
   このサイトの他の回答者に比べたら私なんかヒヨッコみたいなものです。
   ありんこさんもいろんなコードをみて、自分で失敗しながら記述するのが上達の一番ではないかと思います。
   これからのご検討をお祈りします。

 [参考コード] 
  
Sub Test()
    Dim i As Long
    Dim n As Long
    Dim m As Long
'
    With Sheets("一覧")
    '// シートの保護を解除
    '
        .Unprotect
    '
    '// C列の指定セルが空欄の場合に行を非表示にする
    '
        For n = 76 To 147 Step 71
            For i = 76 To 9 Step -1
                If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                    .Rows(i).Hidden = True
                ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                    .Rows(i).Hidden = True
                Else
                    Exit For
                End If
            Next i
        Next n
    '
    '// H149:AL158で、1行に0(空白は0とカウントしない)が28個〜31個連続した場合その行を非表示する
    '
        For i = 149 To 158
            m1 = 0
            m2 = 0
            For n = 8 To 38
                If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                    m = m + 1
                Else
                    m = 0
                End If
                If m >= 28 Then .Rows(i).Hidden = True
            Next n
        Next i
    '
    '// AM9:AU76,AM80:AU147で、1列に0と空欄のみが存在した場合その列を非表示にする
    '
        For i = 39 To 47
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then Columns(i).Hidden = True
            If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then Columns(i).Hidden = True
        Next i
    '
    '// シートを保護する
    '
        .Protect
    End With
End Sub
  
 一応、簡単な検証はしていますが不具合がある場合はご容赦ください。
  
(tora) 2021/01/30(土) 20:31

tora様

色々とアドバイスをいただき、本当にありがとうございます。
自分なりに噛み砕いて理解に勤めようと思います!
トライアンドエラーやいろいろなコードを見て弄ってみるようにしてはいるのですが、本当に難しいものなのだと思うばかりです。

今回いただいたコードに関して色々と試行錯誤して質問をまとめさせていただきました、返信が遅く、また的外れなものになってしまっていると思いますがご容赦ください。

1.複数シートに渡って実行するため、
With Sheets("一覧") を↓
Sheets(Array("一覧", "一覧(白)")).Select に変更するとやはりエラー(オブジェクトが必要です→.Unprotect)が出てしまい、解決のため調べてみたのですが、やはりArrayを使用する方法しか理解できず、解決には至りませんでした。
となるとやはり2度繰り返す方法での解決策しか現状できませんでした。

2.いただいたコードですと
For n = 76 To 147 Step 71
この部分がうまくいっていないのか、後半の部分が非表示になりませんでした。
数字をいじってみるとやはりうまくいかず(エラーすら出ない)、下のコードを入れてエラーが出るように(という理解で入れてみている)してみても他の部分でエラーが出る(m1 = 0 が変数定義がされてない)だけで解決することができませんでした。
Option Explicit ''←変数の宣言を強制する

3.「AM9:AU76,AM80:AU147で、1列に0と空欄のみが存在した場合その列を非表示にする」ここに関して
他シートで範囲が一つ(H45:AM50)の場合に

        For i = 39 To 47
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then Columns(i).Hidden = True
            If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then Columns(i).Hidden = True
        Next i
を
        For i = 47 To 55
            If WorksheetFunction.Max(.Range(.Cells(11, i), .Cells(44, i))) = 0 Then Columns(i).Hidden = Tru True
        Next i
のように書き換えると、「構文エラー」と出てしまい、実行することができませんでした。

4.「シートを指定してA, H:K, AM:APの列を非表示にしたい」という部分に関して
マクロを記録してそのコードを先にいただいたコードに追加してみるという方法で試してみたのですがうまくいきませんでした(検索して出てくるものが理解できなかったのです…)
実際に使用したコードは以下の通りです
Sub Test4()

    Dim i As Long
    Dim r As Long
    With Sheets("Sheet1")
        For i = 44 To 11 Step -1
            If .Cells(i, 4).MergeCells = True And .Cells(i, 4).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 4).MergeCells = False And .Cells(i, 4).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i

        Range ("A:A,H:K,AQ:AT")
        Selection.EntireColumn.Hidden = True

    End With
        With Sheets("Sheet2")
        For i = 44 To 11 Step -1
            If .Cells(i, 4).MergeCells = True And .Cells(i, 4).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 4).MergeCells = False And .Cells(i, 4).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i

         Range ("A:A,H:K,AQ:AT")
         Selection.EntireColumn.Hidden = True

    End With
End Sub

このコードに関しても1番と同じようにArrayを使用して複数シートを指定するとエラーが出てしまい実行することができなかったために間違いの元であることは理解しながらもこのようなコードになっています。

検索しながら試行錯誤はしているのですが、自力でできず頼りきりになってしまい歯がゆいばかりです。
ご返信いただけると幸いです。
よろしくお願いいたします。
(ありんこ) 2021/02/02(火) 02:10


 いくつか問題があるようですが、少しずつ解決していきましょう。

With Sheets("一覧") を↓ Sheets(Array("一覧", "一覧(白)")).Select に変更するやはりエラー(オブジェクトが必要です →.Unprotect)が出てしまい、

やはり2度繰り返す方法での解決策しか現状できませんでした。

 1.シート保護をしているのはどちらのシートですか。または両方?

 2.非表示にする行・列は、一覧シートの条件で判断して一覧シートと一覧(白)シートの両方の行列を非表示にするのですか。
 (この場合、一覧(白)シートのデータはチェックされません)
  それとも別々にチェックしてそれぞれのシートで非表示にするのですか。
 (この場合、二つのシートで非表示になる行列は一致しません)

いただいたコードですと For n = 76 To 147 Step 71 この部分がうまくいっていないのか、後半の部分が非表示になりませんでした。

 この件に関しては、ほかの部分を先に解決したいのでちょっと後回しにします。

「AM9:AU76,AM80:AU147で、1列に0と空欄のみが存在した場合その列を非表示にする」ここに関して 他シートで範囲が一つ(H45:AM50)の場合に

 3.前回提示したコードにちょっとしたミスがありました。
   修正前に確認したいのは、
   一覧シートでは「AM9:AU76,AM80:AU147」、一覧(白)シートでは「H45:AM50」のを対象にするということですか?

「シートを指定してA, H:K, AM:APの列を非表示にしたい」

 4.指定したいシートは一覧シート、一覧(白)シート、または両方?

 5.なお、ついでに参考までにシート構成を教えてください。
   このBookに一覧シートと、一覧(白)シート以外にもシートはあるんですか

 以上いろいろ並べましたが、要はどのシートで何をしたいのかをはっきりさせたいということです。
 お返事をいただいてもすぐに回答できるかどうかはは分かりませんが、
 できる範囲でご回答させていただきます。
  
(tora) 2021/02/02(火) 10:22

tora様

ご返信ありがとうございます。
Bookとシートの構成、その中のデータ、また現状に関して説明させていただきます。
懸案として今後考えうる変更に関してもお伝えできればと思います。
私の方で作成しているデータの内容を一部変更して共有させていただこうと思います。
→DLリンク:https://www.dropbox.com/s/mfzcv67vindw4e4/%E3%82%B7%E3%83%95%E3%83%88%E8%A1%A8.xlsm?dl=0
*このリンクはtora様からのコメントがあり次第削除します

Bookの内容はシフト表で、7つのシートがあります。(シートの名前は簡略しています)
1.名簿
2.職種1
3.職種2
4.一覧
5.一覧(白)
6.週間予定1
7.週間予定2

1.名簿
スタッフの名簿が管理されています。
スタッフは「職種1」「職種2」と別れており、それぞれのシートに名前が表示されます。
2.職種1
名簿シートの職種1に該当する人のシフト管理を行います。
行が日付、列が名簿、交差した場所に当日の勤務形態を入力するという形で管理されております。
3.職種2
名簿シートの職種2に該当する人のシフト管理を行います。
行が日付、列が名簿、交差した場所に当日の勤務形態を入力するという形で管理されております。
4.一覧
シート「職種1」「職種2」のデータをまとめて表示しております。
提出された紙ベースのシフト表を用いてチェックするために各行が白黒になっています。
行が日付、列が名簿、交差した場所に当日の勤務形態を入力するという形で管理されております。
5.一覧(白)
シート「職種1」「職種2」のデータをまとめて表示しております。
掲示するために各行が白一色になっております。
行が日付、列が名簿、交差した場所に当日の勤務形態を入力するという形で管理されております。
6.週間予定1
シート「職種1」が拡大されて表示してあります。
行が日付、列が名簿、交差した場所に当日の勤務形態を入力するという形で管理されております。
7.週間予定2
シート「職種1」「職種2」をまとめて表示していますが、データの管理方法が違います。
行が日付、列が勤務形態、交差したところが名簿という形で管理されております。

大別して「名簿」・「職種1」「職種2」・「一覧」「一覧(白)」・「週間予定1」・「週間予定2」という5種類に分かれております。

・シート「名簿」に関して
今後VBAマクロの実行ボタンを設置する以外変更の予定はございません。

・シート「職種1」「職種2」に関して
それぞれ別のデータが管理されています。
VBAマクロを使用して、以下の事柄を実行したいです。
#1 同じ表・違うデータという状態だが#2〜#5を一括で実行したい。
→Arrayを用いたシートの指定だと動作しなかった。
#2 D11:D44に入力されている名簿を参照し空欄を非表示にする
→1つ目にいただいたコードで実現できました。
#3 A, H:K, AM:APの列を非表示にしたい。列に関しては今後増加する予定がある。
→マクロ記録を使用して実行するコードを作成することはできましたが、1つ目にいただいたコードに組み込むとエラーが発生しました。
#4 L11:AI44(31行6列)に入力されている数値が0または空欄だけである場合非表示にする。
→2つ目にいただいたコードを編集することで実行しようと考えております。
#5 AM9:AU76(9行34列)に入力されている数値が0または空欄だけである場合非表示にする。
→2つ目にいただいたコードを編集することで実行しようと考えております。

・シート「一覧」「一覧(白)」に関して
同じデータが管理されています。違いは行の塗りつぶしだけです。
VBAマクロを使用して、以下の事柄を実行したいです。
#1 同じ表・同じデータという状態で#2〜#5を一括で実行したい。
→Arrayを用いたシートの指定だと動作しなかった。
#2 手入力による編集は予定されていないので、保護をしたい
→2つ目にいただいたコードで実現できました。
#3 列は未定だが非表示にしたい。現状必要ないが今後非表示にしたい列が出てくる予定がある。
→列を非表示にするコードを変更して実現したい。
#4 H149:AL158(31行10列)に入力されている数値が0または空欄だけである場合非表示にする。
→2つ目にいただいたコードで実現できました。
#5 AM9:AU76,AM80:AU147(9行68列がふたつ)に入力されている数値が0または空欄だけである場合非表示にする。
→2つ目にいただいたコードで実現できました。
#6 データが一緒なので指定範囲の行を白黒⇄白と入れ替えたい
→同じデータであるにもかかわらず見た目の問題でシートが2つある状態を解決するVBAマクロを今後作成する予定です

・シート「週間予定1」に関して
こちらはいただいたコードを元にVBAマクロを作成する予定ですが、作成するVBAマクロに関してお伝えさていただきます。
#1 A7:A74にある名簿データを元にデータの入力されている最終行以下を非表示にする
→1つ目にいただいたコードを編集して実現しようと考えております。

・シート「週間予定2」に関して
こちらはいただいたコードを元にVBAマクロを作成する予定ですが、作成するVBAマクロに関してお伝えさていただきます。
#1 A7:AI40に入力されているデータが4つを超過している行を非表示にする
→2つ目にいただいたコードを編集して実現しようと考えております。

以上です。

このスレッドで質問させていただいていたVBAマクロはシート「職種1」「職種2」に関してとシート「一覧」「一覧(白)」に関してです。

以上を踏まえた上でtora様からいただいたご質問に回答させていただこうと思います。
1.シート保護をしているのはどちらのシートですか。または両方?
→両方のシートを保護しております。

 2.非表示にする行・列は、一覧シートの条件で判断して一覧シートと一覧(白)シートの両方の行列を非表示にするのですか。
→「一覧」「一覧(白)」シートはデータ上同一なので、それぞれのデータを参照して行列の非表示をできればと思います。
一覧→一覧・一覧(白)よりも一覧→一覧 一覧(白)→一覧(白)の方がコードが理解しやすい(今後編集しやすい)のではないかと考えるためです。

3.一覧シートでは「AM9:AU76,AM80:AU147」、一覧(白)シートでは「H45:AM50」のを対象にするということですか?
「一覧」「一覧(白)」シートでは「AM9:AU76,AM80:AU147」と「H149:AL158」、「職種1」「職種2」シートでは「AQ11:AY44」と「H45:AL50」という対象の仕方になっております。(ちょっとセルの位置が違っていたため変更しています)

4.指定したいシートは一覧シート、一覧(白)シート、または両方?
指定したいシートは「一覧」「一覧(白)」シートの両方、または「職種1」「職種2」シートという形です。

5.なお、ついでに参考までにシート構成を教えてください。
以上の説明で回答になっていれば幸いです。

ご提示するデータを整形するのにお時間がかかってしまい申し訳ございません。
(ありんこ) 2021/02/02(火) 23:04


 詳細にご説明ただいたので、だいたいのことは理解できました。(完全にとはいえませんが)

 とりあえず、基本的なことから。
 With 〜 End With の使い方はご理解されているでしょうか。
 もしわからなければネットで検索してください。ここでの説明は省略します。

 Sheets(Array("一覧", "一覧(白)")).Select の書き方は、一覧シートと一覧(白)シートの二つを選択した状態です。
 例えばマクロを使わずにこの状態で10行目を非表示にすると、両方のシートで非表示になります。
 しかし、シートの保護・解除をしようとしてもできません。
 手動でできないことはマクロでもできません。

 それを踏まえて今回やりたいことは、職種、一覧、週間予定に分かれていますのでそれぞれ別々のマクロを作り、
 実際にはそれをまとめて実行すればいいように思います。
 具体的には、職種、一覧、週間予定という名前のマクロを作っておき、
  
Sub main()
    Call 職種
    Call 一覧
    Call 週間予定
End Sub
  
 というマクロを実行すれば、三つのマクロをまとめて実行できます。
 今回、職種マクロと一覧マクロのサンプルを挙げておきます。
 実際にありんこさんができた部分もあるとのことですのでかなり省略してあります。

 また、以前の回答もばらばらに回答したため変数宣言の不足があったり統一性もないかもしれません。
 コードのテストもしていませんので、もしかしたら構文エラーがあるかもしれませんが悪しからず。

 もう一つ、これまでのコードでは行・列を非表示にはしていますが、再表示はしていません。
 このまま実行すると非表示はいつまでたっても非表示ですから、今回は再表示を追加しておきました。

 Sub 職種()
    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet
    '#1 同じ表・違うデータという状態だが#2〜#5を一括で実行したい。
    'For Each〜 Next の間のコードで職種1と職種2のシートで以下の処理を繰り返す
    For Each ws In Sheets(Array("職種1", "職種2"))
        With ws
            .Cells.EntireColumn.Hidden = False      'シートの列をすべて表示
            .Cells.EntireRow.Hidden = False         'シートの行すべて表示
            '
            '#2 実現できたコードを入れてください。
            '
            '#3 A, H:K, AM:APの列を非表示にしたい
            .Columns("A").Hidden = True
            .Columns("H:K").Hidden = True
            .Columns("AM:AP").Hidden = True
            '
            '#4、#5 L11:AI44(31行6列)に入力されている数値が0または空欄だけである場合非表示にする。
            '→2つ目にいただいたコードを編集することで実行しようと考えております。
            '頑張ってここに記入してください。ただし次のコードは一部修正が必要です。
            'If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then Columns(i).Hidden = True
            '                                                                       ↓ ここにピリオドが必要です。
            'If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then .Columns(i).Hidden = True
        End With
    Next
End Sub
  
Sub 一覧()
    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet
    '
    For Each ws In Sheets(Array("一覧", "一覧(白)"))
    '#2 手入力による編集は予定されていないので、保護をしたい
        ws.Unprotect
        ws.Cells.EntireColumn.Hidden = False    'シートの列をすべて表示
        ws.Cells.EntireRow.Hidden = False       'シートの行すべて表示
    Next
    '
    '#1 同じ表・同じデータという状態で#2〜#5を一括で実行したい。
    '同じレイアウトであれば、条件の判断は一覧シートのみでできます。
    '
    With Sheets("一覧")
    '#3 列は未定だが非表示にしたい。現状必要ないが今後非表示にしたい列が出てくる予定がある。
        .Columns("A").Hidden = True                     '一覧シートでA列非表示の例です。その他職種のマクロを参考に。
        Sheets("一覧(白)").Columns("A").Hidden = True   '一覧(白)シートも同じ列を非表示します。
    '
    '#4 H149:AL158(31行10列)に入力されている数値が0または空欄だけである場合非表示にする。
    '#5 AM9:AU76,AM80:AU147(9行68列がふたつ)に入力されている数値が0または空欄だけである場合非表示にする。
    '
    '二つのシートの同じ列を非表示ににする
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then Columns(i).Hidden = True
    '          ↓ 下記のように変更する
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
                .Columns(i).Hidden = True                   '一覧シートで非表示。先頭のピリオドを忘れないこと。
                Sheets("一覧(白").Columns(i).Hidden = True  '一覧(白)シートでも同じ列を非表示にする
            End If
    '#6 データが一緒なので指定範囲の行を白黒?白と入れ替えたい
    '→同じデータであるにもかかわらず見た目の問題でシートが2つある状態を解決するVBAマクロを今後作成する予定です
    '   ↓
    '最初からそのように色付けしておけばどうですか? 必要であれば条件付き書式でもできます。
    End With
    '
    Sheets("一覧").Protect
    Sheets("一覧(白)").Protect
End Sub

 週間予定のコードは自作できそうなので挙げてありません。
 がんばってください。 
  
(tora) 2021/02/03(水) 13:57

tora様

アドバイスとご返答本当にありがとうございます。
校正を十分にしたつもりでしたが抜けと間違いが幾つかありましたので、補足をさせていただければと思います。

・職種シートに関してはほとんど期待通りに動作するコードとなりました。
一点だけ、H45:AL50(31行6列)(先の質問ではセルの範囲が間違っていました)で0または空欄が連続する場合非表示にするコードがうまく動作しません。
どうやらH45:H50までに0があると非表示になってしまっているようで、稼働しているコードの該当部分のどこを修正するといいのかご指摘いただけると幸いです。
00000…←非表示(正常)
01000…←非表示(エラー)
10000…←表示(正常)
111111…←表示(正常)

実際に稼働しているコードの該当部分は以下の通りです。

    '// H45:AL50で、1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示する
    '
        For i = 45 To 50
            m1 = 0
            m2 = 0
            For n = 8 To 38
                If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                    m = m + 1
                Else
                    m = 0
                End If
                If m >= 28 Then .Rows(i).Hidden = True
            Next n
        Next i
    '

・シート「一覧」「一覧(白)」に関して
このスレッドを建てた当初の目的である質問が抜けておりました。

    '// C列の指定セルが空欄の場合に行を非表示にする
    '
        For n = 76 To 147 Step 71
            For i = 76 To 9 Step -1
                If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                    .Rows(i).Hidden = True
                ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                    .Rows(i).Hidden = True
                Else
                    Exit For
                End If
            Next i
        Next n
    '

このコードに関して修正ができなかったので、一つ目にいただいたコードを変更して使用したところエラーが発生してしまいました。
現状のコードは以下の通りです。
また、現状のコードですと

 '#5 AM9:AU76,AM80:AU147(9行68列がふたつ)に入力されている数値が0または空欄だけである場合非表示にする。
の「Next 」に対応する「For」がないとエラーが出て、実行できない状態になっています。

Sub 一覧()

    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet
    '
    For Each ws In Sheets(Array("一覧", "一覧(白)"))
    '#2 手入力による編集は予定されていないので、保護をしたい
        ws.Unprotect
        ws.Cells.EntireColumn.Hidden = False    'シートの列をすべて表示
        ws.Cells.EntireRow.Hidden = False       'シートの行すべて表示
    Next
    '
    '#1 同じ表・同じデータという状態で#2?#5を一括で実行したい。
    '同じレイアウトであれば、条件の判断は一覧シートのみでできます。
    '
    With Sheets("一覧")
    '#3 列は未定だが非表示にしたい。現状必要ないが今後非表示にしたい列が出てくる予定がある。
    '    .Columns("A").Hidden = True                     '一覧シートでA列非表示の例です。その他職種のマクロを参考に。
    '    Sheets("一覧(白)").Columns("A").Hidden = True   '一覧(白)シートも同じ列を非表示します。
    '
    '
        With Sheets("一覧")
        For i = 76 To 9 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i
        For i = 147 To 80 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i
    End With
    '
    '
    '#4 H149:AL158(31行10列)に入力されている数値が0または空欄だけである場合非表示にする。
       '// H149:AL158で、1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示する
    '
        For i = 149 To 158
            m1 = 0
            m2 = 0
            For n = 8 To 38
                If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                    m = m + 1
                Else
                    m = 0
                End If
                If m >= 28 Then .Rows(i).Hidden = True
            Next n
        Next i
    '
    '#5 AM9:AU76,AM80:AU147(9行68列がふたつ)に入力されている数値が0または空欄だけである場合非表示にする。
        '// AM9:AU76,AM80:AU147で、1列に0と空欄のみが存在した場合その列を非表示にする
    '
        For i = 39 To 47
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
            .Columns(i).Hidden = True
            Sheets("一覧(白").Columns(i).Hidden = True
            If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then
            .Columns(i).Hidden = True
            Sheets("一覧(白").Columns(i).Hidden = True
        Next i
    '
    '
    '二つのシートの同じ列を非表示ににする
    '        If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then Columns(i).Hidden = True
    '          ↓ 下記のように変更する
    '        If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
    '            .Columns(i).Hidden = True                   '一覧シートで非表示。先頭のピリオドを忘れないこと。
    '            Sheets("一覧(白").Columns(i).Hidden = True  '一覧(白)シートでも同じ列を非表示にする
    '        End If
    '#6 データが一緒なので指定範囲の行を白黒?白と入れ替えたい
    '→同じデータであるにもかかわらず見た目の問題でシートが2つある状態を解決するVBAマクロを今後作成する予定です
    '   ↓
    '最初からそのように色付けしておけばどうですか? 必要であれば条件付き書式でもできます。
    End With
    '
    Sheets("一覧").Protect
    Sheets("一覧(白)").Protect
End Sub

また、週間予定のコードができましたら質問させていただこうと思いますが、現状で出てきた質問にご返信いただければ幸いです。
よろしくお願いいたします。
(ありんこ) 2021/02/05(金) 15:53


 1.職種シートについて
   まず For i = 45 To 50 の後ろにある、m1 = 0 と m2 = 0 は不要です。
   試作途中で使った余分なコート話を消し忘れていました。

  >H45:AL50(31行6列)(先の質問ではセルの範囲が間違っていました)で0または空欄が連続する場合非表示にするコードがうまく動作しません。

 とのことですが、当初の質問では、
「・H149:AL158(31行10列)には数字が並んでおります。
  このとき1行に0が28個〜31個連続した場合その行を非表示にしたい。」
 でしたね。

 >01000…←非表示(エラー)

 この例は、おそらく 01000000・・・と1の後ろに0が28個以上続くのではないですか?
 その場合は当初の質問をそのまま解釈すると非表示にすることになります。
 実際やりたいことは、1行すべてが 0 の行を非表示にするではないですか?
 (その範囲には数式が入っている)
 そうであればまた別のコードになります。

 2.一覧シートについて
 (1)#4 H149:AL158(31行10列)に入力されている数値が0または空欄だけである場合非表示にする。
    については、上記職種シートと同じことですね?

 (2)>このスレッドを建てた当初の目的である質問が抜けておりました。
    '// C列の指定セルが空欄の場合に行を非表示にする
     (中略)
    '
 (3)>このコードに関して修正ができなかったので、一つ目にいただいたコードを変更して使用したところエラーが発生してしまいました。
 >'#5 AM9:AU76,AM80:AU147(9行68列がふたつ)に入力されている数値が0または空欄だけである場合非表示にする。
 >の「Next 」に対応する「For」がないとエラーが出て、実行できない状態になっています。

 IFに対するEnd IFが抜けています。
 このあたり、エクセルのエラーメッセージは必ずしも正しくない場合があります。
  
        For i = 39 To 47
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
                .Columns(i).Hidden = True
                Sheets("一覧(白").Columns(i).Hidden = True
            End If
            If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then
                .Columns(i).Hidden = True
                Sheets("一覧(白").Columns(i).Hidden = True
            End If
        Next i
 私の場合そんなミスを防ぐために、For・・Next、If・・End If、With・・End With など、終わりを指定する語がついになっている場合、
 For と入れたら必ず次に Next を記入して、次にその間に必要な構文を書くようにしています。

 あと、最初の方で With Sheets("一覧") が重複しています(エラーにはなりませんが)
 C列から判断して行を非表示にする部分は、一覧シートのみ非表示になり、一覧(白)では非表示にならないのでは?

 また、前回提示のものは説明のためにいろいろなコメントが入っていますが、
 最終的には不要と思われるコメントは削除した方がすっきりと見やすくなると思います。

 以上を参考に修正してみてください。
  
(tora) 2021/02/05(金) 20:06

tora様
コメントありがとうございます。
「’」で残されているコメント等を整理し、整形した現状のコードとともに現在起きている問題についてご相談させていただきます。

1.職種シートについて
・現在起きている問題
#1 1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示するコードがうまく動作しない

  'H45:AL50(31行6列)で、1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示する
のコードがうまく動作していない

直近の質問でも触れさせていただきましたが、やはり
00000…←非表示(正常)
01000…←非表示(エラー)
10000…←表示(正常)
111111…←表示(正常)
という状況です。
6桁移行は省略されておりますが、実際には
「0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0」
と入力されており、ご指摘いただいた0が28個連続しているという状況ではないことを確認いたしました。
職種1シートでも頭が0だと0が28個連続していなくても非表示になってしまったので、やはりうまく動作していないのではないかと考えました。

・現状のコード↓
Sub 職種()

    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet

    'For Each? Next の間のコードで職種1と職種2のシートで以下の処理を繰り返す
    For Each ws In Sheets(Array("職種1", "職種2”))
        With ws
        .Cells.EntireColumn.Hidden = False      'シートの列をすべて表示
        .Cells.EntireRow.Hidden = False         'シートの行すべて表示

        'D11:D44 の範囲で空欄行を非表示にする
        For i = 44 To 11 Step -1
            If .Cells(i, 4).MergeCells = True And .Cells(i, 4).MergeArea.Item(1).Value = "" Then
               .Rows(i).Hidden = True
            ElseIf .Cells(i, 4).MergeCells = False And .Cells(i, 4).Value = "" Then
               .Rows(i).Hidden = True
            Else
              Exit For
            End If
        Next i

        .Columns("A").Hidden = True    'A列を非表示
        .Columns("AM:AP").Hidden = True    'AM:AP列を非表示

    'H45:AL50(31行6列)で、1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示する
        For i = 45 To 50
            For n = 8 To 38
                If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                    m = m + 1
                Else
                    m = 0
                End If
                If m >= 28 Then .Rows(i).Hidden = True
            Next n
        Next i

    'AQ11:AY44(9行34列)で、1列に0(空白は0とカウントしない)のみが存在した場合その列を非表示にする
        For i = 42 To 50
            If WorksheetFunction.Max(.Range(.Cells(11, i), .Cells(44, i))) = 0 Then .Columns(i).Hidden = True
        Next i
        End With
    Next
End Sub

ここまで↑

2.一覧シートについて
・現在起きている問題
#1 保護解除のタイミングが遅い?
コードの頭に以下のように記述しましたが、保護解除のタイミングがずれているからなのか「一覧(白)」シートにおいてVBAがうまく動作しておりません。
幾つか他のコードにしてみたり試してみたのですが、上手に動作させることができず、アドバイスをいただければと思います。

    Sheets("一覧”).Unprotect
    Sheets("一覧(白)”).Unprotect

#2 職種シートで起きている問題が同じように起きている
一覧シートにおいても、0(もしくは空欄)が28個連続していなくても頭に0が来ると非表示になってしまう問題が発生してしまいました。

現状のコード↓
Sub 一覧()

    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet

    Sheets("一覧").Unprotect
    Sheets("一覧(白)").Unprotect

    For Each ws In Sheets(Array("一覧", "一覧(白)"))
        With ws
        .Cells.EntireColumn.Hidden = False    'シートの列をすべて表示
        .Cells.EntireRow.Hidden = False       'シートの行すべて表示

        'C3:C76 の範囲で空欄行を非表示にする
        For i = 76 To 9 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
               .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
               .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i
        'C80:C147 の範囲で空欄行を非表示にする
        For i = 147 To 80 Step -1
            If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                .Rows(i).Hidden = True
            ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                .Rows(i).Hidden = True
            Else
                Exit For
            End If
        Next i

    '    .Columns("A").Hidden = True                     '一覧シートでA列非表示の例です。その他職種のマクロを参考に。
    '    Sheets("一覧(白)").Columns("A").Hidden = True   '一覧(白)シートも同じ列を非表示します。

    'H149:AL158(31行10列)で、1行に0(空白は0とカウントしない)が28個?31個連続した場合その行を非表示する
        For i = 149 To 158
            For n = 8 To 38
                If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                    m = m + 1
                Else
                    m = 0
                End If
                If m >= 28 Then .Rows(i).Hidden = True
            Next n
        Next i

    'AM9:AU76,AM80:AU147(9行68列がふたつ)で、1列に0(空白は0とカウントしない)のみが存在した場合その列を非表示にする
        For i = 39 To 47
            If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
                .Columns(i).Hidden = True    '一覧シートで非表示
            End If
            If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then
                .Columns(i).Hidden = True    '一覧シートで非表示
            End If
        Next i
        End With
    Next
    Sheets("一覧").Protect
    Sheets("一覧(白)").Protect
End Sub

ここまで↑
以上でございます。
よろしくお願いいたします。
(ありんこ) 2021/02/08(月) 18:32


 >00000…←非表示(正常)
 >01000…←非表示(エラー)
 >10000…←表示(正常)
 >111111…←表示(正常)

 の件、0をカウントする変数(m)の初期化を忘れていました。
 修正しました。

 また、最後の方にある 
 >'AQ11:AY44(9行34列)で、1列に0(空白は0とカウントしない)のみが存在した場合その列を非表示にする
 は、
 AQ11:AY44(9行34列)で、1列に0(または空白)のみが存在した場合その列を非表示にする数式でした。
 コメントを修正しておきましたが、もし空白があった場合は非表示にするのであれば変更の必要があります。

 コメントの中に文字化けの部分があったので修正しておきました。
 これで試してみてください。
   
Sub 職種()
    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet
    'For Each〜Next の間のコードで職種1と職種2のシートで以下の処理を繰り返す
    For Each ws In Sheets(Array("職種1", "職種2"))
        With ws
            .Cells.EntireColumn.Hidden = False      'シートの列をすべて表示
            .Cells.EntireRow.Hidden = False         'シートの行すべて表示
            'D11:D44 の範囲で空欄行を非表示にする
            For i = 44 To 11 Step -1
                If .Cells(i, 4).MergeCells = True And .Cells(i, 4).MergeArea.Item(1).Value = "" Then
                   .Rows(i).Hidden = True
                ElseIf .Cells(i, 4).MergeCells = False And .Cells(i, 4).Value = "" Then
                   .Rows(i).Hidden = True
                Else
                  Exit For
                End If
            Next i
            .Columns("A").Hidden = True         'A列を非表示
            .Columns("AM:AP").Hidden = True     'AM:AP列を非表示
            'H45:AL50(31行6列)で、1行に0(空白は0とカウントしない)が28個〜31個連続した場合その行を非表示する
            For i = 45 To 50
                m = 0
                For n = 8 To 38
                    If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                        m = m + 1
                    Else
                        m = 0
                    End If
                    If m >= 28 Then .Rows(i).Hidden = True
                Next n
            Next i
        'AQ11:AY44(9行34列)で、1列に0(または空白)のみが存在した場合その列を非表示にする
            For i = 42 To 50
                If WorksheetFunction.Max(.Range(.Cells(11, i), .Cells(44, i))) = 0 Then .Columns(i).Hidden = True
            Next i
        End With
    Next
End Sub
  
Sub 一覧()
    Dim i As Long
    Dim r As Long
    Dim n As Long
    Dim m As Long
    Dim ws As Worksheet
    Sheets("一覧").Unprotect
    Sheets("一覧(白)").Unprotect
    For Each ws In Sheets(Array("一覧", "一覧(白)"))
        With ws
            .Cells.EntireColumn.Hidden = False    'シートの列をすべて表示
            .Cells.EntireRow.Hidden = False       'シートの行すべて表示
            'C3:C76 の範囲で空欄行を非表示にする
            For i = 76 To 9 Step -1
                If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                   .Rows(i).Hidden = True
                ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                   .Rows(i).Hidden = True
                Else
                    Exit For
                End If
            Next i
            'C80:C147 の範囲で空欄行を非表示にする
            For i = 147 To 80 Step -1
                If .Cells(i, 3).MergeCells = True And .Cells(i, 3).MergeArea.Item(1).Value = "" Then
                    .Rows(i).Hidden = True
                ElseIf .Cells(i, 3).MergeCells = False And .Cells(i, 3).Value = "" Then
                    .Rows(i).Hidden = True
                Else
                    Exit For
                End If
            Next i
            'H149:AL158(31行10列)で、1行に0(空白は0とカウントしない)が28個〜31個連続した場合その行を非表示する
            For i = 149 To 158
                m = 0
                For n = 8 To 38
                    If .Cells(i, n).Value = 0 And .Cells(i, n).Value <> "" Then
                        m = m + 1
                    Else
                        m = 0
                    End If
                    If m >= 28 Then .Rows(i).Hidden = True
                Next n
            Next i
            'AM9:AU76,AM80:AU147(9行68列がふたつ)で、1列に0(または空白)のみが存在した場合その列を非表示にする
            For i = 39 To 47
                If WorksheetFunction.Max(.Range(.Cells(9, i), .Cells(76, i))) = 0 Then
                    .Columns(i).Hidden = True    '一覧シートで非表示
                End If
                If WorksheetFunction.Max(.Range(.Cells(80, i), .Cells(147, i))) = 0 Then
                    .Columns(i).Hidden = True    '一覧シートで非表示
                End If
            Next i
        End With
    Next
    Sheets("一覧").Protect
    Sheets("一覧(白)").Protect
End Sub
  
(tora) 2021/02/08(月) 23:07

Tora様
本当にありがとうございます。
いただいたコードで期待通りの結果を得ることができました。

週間予定表用のコードも以下のように作成し希望通りの結果を得ることができるようになりました。
週間予定表2に関してはネットで調べて見つけたコードを編集して流用しております。
体温チェック表というシートも別途作成し、Tora様から頂いたコードを編集することで作成することができました。

あとは編集用にシートの行列を前表示するコードとVBA実行ボタンの作成のみになりましたので、調べて作成してみたいと思います。

長らくお付き合いいただき本当にありがとうございます。
頂いたコード・アドバイスを元に勉強してみようと思います。

メモのためコード↓

Sub 週間予定等()

    Dim i As Long
    Dim n As Long
    Dim m As Long

    With Sheets("週間予定表1”)

    .Cells.EntireRow.Hidden = False       'シートの行すべて表示

    'A7:A74 の範囲で空欄行を非表示にする
            For i = 74 To 7 Step -1
                If .Cells(i, 1).MergeCells = True And .Cells(i, 1).MergeArea.Item(1).Value = "" Then
                    .Rows(i).Hidden = True
                ElseIf .Cells(i, 1).MergeCells = False And .Cells(i, 1).Value = "" Then
                    .Rows(i).Hidden = True
                Else
                    Exit For
                End If
            Next i
       End With

    With Sheets("週間予定表2”)

    .Cells.EntireRow.Hidden = False       'シートの行すべて表示

     'A7:A40 の範囲で空欄行を非表示にする
     Const col As String = "A"  'A列の指定
     Application.ScreenUpdating = False
            For n = 1 To Range(col & "65536").End(xlUp).Row
              If Cells(n, col).Value = 31 Then
                     Rows(n).Hidden = True
              End If
            Next
     Application.ScreenUpdating = True
       End With

    With Sheets("体温チェック表")

    .Cells.EntireRow.Hidden = False       'シートの行すべて表示

     'A7:A40,A41:A74 の範囲で空欄行を非表示にする
        For m = 40 To 7 Step -1
            If Cells(m, 1).Value = "" Then Rows(m).Hidden = True
            If Cells(m, 1).Value <> "" Then Exit For
        Next m
        For m = 74 To 41 Step -1
            If Cells(m, 1).Value = "" Then Rows(m).Hidden = True
            If Cells(m, 1).Value <> "" Then Exit For
        Next m
    End With
End Sub

(ありんこ) 2021/02/09(火) 16:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.