シート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
再計算ボタンを押しても、反映されないので困っています。
どこが間違っているのかを教えて下さい。
No.2ベストアンサー
- 回答日時:
質問とコードの、ロジックが違っていませんか?
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
書類作成の時間が短縮でき、大変助かりました。
もうひとつ質問してよければ、お聞きしたいのですが。
with~end withまでを条件を変えて、end subの前の行にコピペすれば、同じシートの違う条件から、また別の行を表示・非表示にできるものでしょうか?
No.3
- 回答日時:
#1です。
>それがそもそもの間違いでしょうか?
間違いではありません。
「C3セルの値に基づいて表示/非表示を決める」という処理は当然あるでしょう。
ただ、ご質問文を読んだ限りでは、「表示/非表示のために関数で計算させている」ように感じましたので、シート上に(人間の作業上で)不必要なものを表示することもないですし、他の作業で必要でないのであればいらないだろうと思った次第です。
実際の利用状況はわかりませんが、他の方がそのシートを操作する際などに、間違ってC3セルに値を入れたりデリートしたりすると、VBAが正しく動作しなくなるというリスクもありますので。
#1で言葉で説明していた内容を、#2様がすでに回答として記してくださっていますので、コードなどはそちらをご覧になってください。
人によって記述の仕方に違いはありますが、基本的には同じようなものになりますので。
No.1
- 回答日時:
こんにちは
ご質問文が一定していないのでよくわかりませんが、非表示になさりたいのは、シート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の状態が変わると自動的に反映されるようにすることも可能です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- Excel(エクセル) Excelでnullになるような式のセルをマクロで空白行と認識させるにはどうすればいいですか? 3 2023/03/13 13:42
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの中央値の複数条件について
-
エクセルで入力シートから別シ...
-
エクセルのワークシートが重く...
-
VBA セルの値と同じ名前のシー...
-
Excel日付変更との参照先の連動
-
エクセル シフト勤務表から、...
-
Excel 複数のシートからグラフ...
-
Excel2013の既存ファイルのワー...
-
エクセルVBAで
-
EXCEL VBA 一致しないデータの...
-
IF, ISNUMBER, INDIRECTの組み...
-
Excel ハイパーリンク先のセル...
-
エクセルでフィルターで抽出し...
-
エクセル 毎日更新する表のデ...
-
エクセル自動の年月
-
VBAでシート名をセルから取得し...
-
VBAのoffsetの動き方について教...
-
エクセルにて別シートの値を参...
-
Excelで入力用シートのデータを...
-
エクセルについて質問です 日付...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで入力シートから別シ...
-
VBA セルの値と同じ名前のシー...
-
Excel 複数のシートからグラフ...
-
ExcelVBAで、指定したシートに...
-
Excelの中央値の複数条件について
-
Excel ハイパーリンク先のセル...
-
IF, ISNUMBER, INDIRECTの組み...
-
エクセルのワークシートが重く...
-
VBAでシート名をセルから取得し...
-
エクセルで入力→日付を自動判別...
-
質問:特定文字列から空白行ま...
-
エクセル自動の年月
-
エクセル シフト勤務表から、...
-
エクセル マクロを使って日々...
-
VBAのoffsetの動き方について教...
-
Excel日付変更との参照先の連動
-
エクセルVBA:表の内容を担当者...
-
EXCEL VBA 一致しないデータの...
-
エクセルについて質問です 日付...
-
Excelの選択肢をポップアップリ...
おすすめ情報
大変申し訳ございません。
非表示にしたいのは、シート2のほうで、こちらのサイトに乗せたコードが間違っておりました。
〉C3セルにわざわざTrue/Falseを計算させなくても、VBAで直接同様の判定を行う方が良さそうに思います。
(C3セルに表示することが他の目的で必要な場合は別ですが)
実際の入力シートには、セルの結合を行っているので、VBAで記述するより
別のセルに結果を出力させて、それを判定させた方が早いのではないかと判断した結果でございますが。
それがそもそもの間違いでしょうか?