プロが教えるわが家の防犯対策術!

たびたび失礼いたします。

以前にも同じ内容で質問させていただきました。
前回の質問の答えを自分なりに調べ考えた結果なんですが、私の頭が悪いようできちんとしたコードが記述できません。


シート”必要入力事項”のI16からI18まで記述がない場合、シート”2-2現場組織表”の16~22行を非表示
シート”必要入力事項”のI19からI21まで記述がない場合、シート”2-2現場組織表”の23~28行を非表示
シート”必要入力事項”のI22からI24まで記述がない場合、シート”2-2現場組織表”の29~34行を非表示
というのをVBAで行いたいのですが、どなたか、間違いを指摘していただけると助かります。

以下、記述したコードです。
Private Sub worksheet_change(ByVal Target As Range)
Dim CNT As Long
Dim GS As Long
Dim flg As Boolean
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet

Set Sh1 = Worksheets("必要入力事項")
Set Sh2 = Worksheets("2-2現場組織表")

With Me

If Intersect(Target, .Range("I16:i24")) Is Nothing Then Exit Sub

For CNT = 16 To 24 Step 3
If Sh1.Range("C" & CNT).Value = "" Or Sh1.Range("C" & CNT + 1).Value = "" Or Sh1.Range("C" & CNT + 2).Value = "" Then
flg = True
GoTo contenue
End If
contenue: If CNT = 16 Then
GS = 17
Sh2.Rows(GS & ":" & GS + 5).Hidden = flg
ElseIf CNT = 19 Then
GS = 23
Sh2.Rows(GS & ":" & GS + 5).Hidden = flg
ElseIf CNT = 22 Then
GS = 29
Sh2.Rows(GS & ":" & GS + 5).Hidden = flg
Next CNT

End With
End Sub

「VBA 行の非表示について 3」の質問画像

質問者からの補足コメント

A 回答 (2件)

こんにちは



よくわからないところがあるのと、今までのご質問でも回答者にちゃんと通じていない節がありますが・・・
とりあえず、ループの中をこんな感じにしてみては?

For CNT = 16 To 24 Step 3
 flg = CBool(WorksheetFunction.CountIf(sh1.Cells(CNT, 9).Resize(3), ""))
 sh2.Rows(2 * CNT - 15).Resize(6).Hidden = flg
Next CNT

※ セルの値の判定が""かどうかになっていますので、スペースや改行だけのセルでも、値があるものとして判断されます。
※ ご質問の文章では『16~22行を非表示』とあるけれど、コードでは17行目らしいので、一応17行目を正と考えました。
    • good
    • 0
この回答へのお礼

ありがとうございます。
下手な質問の仕方をしてしまい、すいませんでした。
ループの中を変えたところ、私のやりたかった結果がでました。

お礼日時:2017/04/11 17:28

SheetのPrivate Subだから


If Intersect(Target, .Rangeで
.Rangeの.は要らないと思います。


Next CNTの前に Endif が必要です。

シート名をsh1、sh2で区別しているから
With MeとEnd Withは要らないと思います。
    • good
    • 0
この回答へのお礼

確かに、いらない部分でした、。初心者なもので、一人で頭をぐちゃぐちゃにさせていたようです。
ご指摘ありがとうございました。

お礼日時:2017/04/11 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!