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

シート1の結果で、シート2の特定の行を非表示にするのをVBAで組みたいのですが
やり方がわからず困っています。どなたかご教授いただけないでしょうか。

sheet1のA1~A3までに文字がある状態を「True」、ない状態で「False」と表示するのを
関数でセルC3に結果表示
=if(amd(istext(A1),istext(A2),istext(A3)),True,False)

シート2で4行目から6行目までを結果次第で、表示・非表示にするのを

VBAにて、シート2に以下のコードを記述

Sub 項目削除()

If Sheet("sheet1").Range("C3") = "False" Then
Sheet("sheet1").Rows("4:6").Hidden = True
Else
Sheet("sheet1").Rows("4:6").Hidden = False
End If
ActiveWorkbook.RefreshAll
End Sub

再計算ボタンを押しても、反映されないので困っています。
どこが間違っているのかを教えて下さい。

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

  • 大変申し訳ございません。
    非表示にしたいのは、シート2のほうで、こちらのサイトに乗せたコードが間違っておりました。

    〉C3セルにわざわざTrue/Falseを計算させなくても、VBAで直接同様の判定を行う方が良さそうに思います。
    (C3セルに表示することが他の目的で必要な場合は別ですが)

    実際の入力シートには、セルの結合を行っているので、VBAで記述するより
    別のセルに結果を出力させて、それを判定させた方が早いのではないかと判断した結果でございますが。
    それがそもそもの間違いでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/04/07 11:31

A 回答 (3件)

質問とコードの、ロジックが違っていませんか?



Sheet("sheet1").Range("C3") = "False" の時に、
Sheet("sheet1").Rows("4:6").Hidden をTrue にする
-----------------------------------------
これ自体は何の矛盾もありませんが、ご質問には

●シート2の特定の行を非表示にする
とあるのですから、

Sheet("sheet1").Range("C3") = "False" の時に、
Sheet("sheet2").Rows("4:6").Hidden をTrue にする
にならなくてはいけませんね。

しかし、これを自動的にもし行うとするなら、どれがトリガーになるか分かりますか?

Sheet("sheet1").Range("C3") = "False"
とうぜん、ここの部分ですよね。

Sheet2 からは行うというのは、Excelの構造上、Active以外のシートは、プログラム上休止状態になっているらしいのです。したがって、私なら、以下のようにします。

なお、数式でトリガーするのは、私には邪魔な気がします。
直接調べればよいです。ただ、A1:A3 が数式の場合は、
Worksheet_Culculate などのイベントにするか、A1:A3の数式に対して、DirectPresedents プロパティを取る必要が出てきます。

----------------------
'''Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
Dim flg As Boolean
Dim c As Variant
With Me
If Intersect(Target, .Range("A1:A3")) Is Nothing Then Exit Sub
For Each c In .Range("A1:A3")
 If VarType(c.Value) <> vbString Then
   flg = True
   Exit For
 End If
Next
 Worksheets("Sheet2").Rows("4:6").Hidden = flg
End With
End Sub
    • good
    • 0
この回答へのお礼

書類作成の時間が短縮でき、大変助かりました。
もうひとつ質問してよければ、お聞きしたいのですが。
with~end withまでを条件を変えて、end subの前の行にコピペすれば、同じシートの違う条件から、また別の行を表示・非表示にできるものでしょうか?

お礼日時:2017/04/07 13:02

#1です。



>それがそもそもの間違いでしょうか?
間違いではありません。
「C3セルの値に基づいて表示/非表示を決める」という処理は当然あるでしょう。
ただ、ご質問文を読んだ限りでは、「表示/非表示のために関数で計算させている」ように感じましたので、シート上に(人間の作業上で)不必要なものを表示することもないですし、他の作業で必要でないのであればいらないだろうと思った次第です。
実際の利用状況はわかりませんが、他の方がそのシートを操作する際などに、間違ってC3セルに値を入れたりデリートしたりすると、VBAが正しく動作しなくなるというリスクもありますので。

#1で言葉で説明していた内容を、#2様がすでに回答として記してくださっていますので、コードなどはそちらをご覧になってください。
人によって記述の仕方に違いはありますが、基本的には同じようなものになりますので。
    • good
    • 0

こんにちは



ご質問文が一定していないのでよくわかりませんが、非表示になさりたいのは、シート2なのでしょうか、それともシート1?
範囲は4~6行なのだと思いますが、文章では「シート2の特定の行」となっているけれど、コードでは「Sheet("sheet1").Rows("4:6")~~」となっていますね。

なさりたいことは、
『Sheet1のセルA1~A3が空なら、Sheet2の4~6行を非表示、そうでなければ表示する』
ということなのでしょうか?

よくわからないのでコードは記しませんが、C3セルにわざわざTrue/Falseを計算させなくても、VBAで直接同様の判定を行う方が良さそうに思います。
(C3セルに表示することが他の目的で必要な場合は別ですが)

>再計算ボタンを押しても、反映されないので~
常にその表示状態を反映しておきたいのであれば…
シート1の Worksheet_Change イベントとして処理を設定しておくことで、シート1の状態が変わると自動的に反映されるようにすることも可能です。
この回答への補足あり
    • good
    • 0

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