[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『リストを選択すると行を非表示にするマクロ』(素人)
質問いたします。
リストから名前を選んだら、該当の行を非表示にするというマクロを作りたいのです。具体的には、以下のような状況です。
B4に名前のリストがあります。
そのリストの名前によって、O8:O117に1か0が入るようにしておき、0となった行は非表示にするというものです。
リストによって、0の範囲が変わります。
1と0が交互になることはありません。
リストから名前を選択したと同時に行の非表示マクロを実行するようにしたいです。
よろしくお願いいたします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
シート→Sheet1
セル番地[範囲]→B8:L117
O8=IF(B8<>"",1,0)
リストの名前によって、O列の0の範囲が変動します。必ず連続します。1と0は混在しません。
隠居Zさん、よろしくお願いします。
(素人) 2022/05/18(水) 20:14
(くれよん) 2022/05/18(水) 21:25
既にご指摘いただいています。 ただ、なんだか説明が足りていない印象です。 以下に回答していただけますか?
(Q1)リストの名前はB4だけにあるんですか? (Q2)B4セルを変更したとき、 他のB列の値はどういう論理で変更になるのですか? それは回答者は気にしなくていいんですか? 関係するなら、その内容を説明してください。 (Q3)B列の値によって、O列が変わるのですね O8: =IF(B8<>"",1,0) これはO8以下のすべてのO列に入っているんですか? (Q4)O列が0になっている行はすべて非表示にするんですね。 この(4)のところだけマクロにすればいいんですか? それなら紹介されたサイトを参考にしてできると思いますが。
(γ) 2022/05/18(水) 21:53
(γ) 2022/05/18(水) 22:16
(γ) 2022/05/18(水) 22:19
いいえ、リストの名前が変わることで、B列の内容が変わり、B列を参照してO列が1か0の判定をすることで、0の行を非表示にするものです。
名前により非表示の行が増えるかもしれないし、減るかもしれません。
必ずしも非表示が増えるわけではありません。
(素人) 2022/05/18(水) 22:32
くれよんさんとγさんに教えていただいたサイトを参考にして組んだものは以下のとおりです。
ボタンによる非表示、再表示はできましたが、B4のリスト選択による非表示は動いてくれません。
この二つを合体する?方法が分かりません。
よろしくお願いします。
↓ボタンにより非表示、再表示できました
Option Explicit
Dim 次は再表示 As Boolean
Sub macro()
Set r = Range("O8:O117")
If 次は再表示 Then r.EntireRow.Hidden = False 次は再表示 = False Else For Each c In r If c.Value = 0 Then c.EntireRow.Hidden = True Next 次は再表示 = True End If
End Sub
↓B4のリストを選択しても非表示になってくれません・・・
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address <> "$B$4" Then Exit Sub If Target.Value <> "" And IsNumeric(Target.Value) Then Application.EnableEvents = False Call macro Application.EnableEvents = True End If End Sub (素人) 2022/05/19(木) 07:03
>B4だけではありませんが、 という回答でしたが、それとの関係とか、 B4の選択によって、なぜ日付が影響をうけるのかといった点が不明ですが、 とりあえず、臨床的対応の観点から返答するならば、以下のようなことが気になります。
(1) If Target.Value <> "" And IsNumeric(Target.Value) Then のIsNumeric(Target.Value)とする意図はなんでしょうか? 名前を選択するんじゃなかったですか? (2) Changeイベントプロシージャで Call macro しているということは、非表示と再表示をサイクリックに繰り返すはずですが、 それは意図したことなんですか? (3) また、イベントプロシージャはシートモジュールに書いているんですよね。念のため。 # 隠居Zさん失礼します。
(γ) 2022/05/19(木) 07:47
(素人) 2022/05/19(木) 07:57
■1
>B4のリストを選択しても〜
Changeイベントを理解していますか?
表現の差なのかもしれませんが、B4セルの値が【書き換わった時】がマクロの発動条件になります。
また、少なくとも「Worksheet_Change」のほうだけはそのシートのモジュールに記述する必要があります。
■2
変数「次は再表示」はモジュールレベル変数にする必要があるのですか?
さらに、
(1)B4セルが変更(同じ値に変更されたことも含む)されたら (2)O8:O117を【含む行】を一旦表示にして (3)O8:O117を1セルずつ巡回して (4) セルの値が0ならば、そのセルを【含む行】を非表示にする (5)全セルの処理がおわるまで(4)を繰り返し
というアプローチなら「次は再表示」という変数は不要ではないでしょうか?
■3
↓は正しいのでしょうか?
If Target.Count > 1 Then Exit Sub If Target.Address <> "$B$4" Then Exit Sub
処理内容から考えると、Intersectメソッドを使用して書き換えられたセルの中にB4セルが含まれるかどうかで判定するべきなんじゃないかなと思いました。
■4
話がもどりますが、変数「c」「r」について宣言がありません。
ダメとはいいませんが、きちんと宣言することを強くお勧めします。
(もこな2) 2022/05/19(木) 07:58
0列の数式って必要ですか?
B列が""の行を非表示にしたいのですよね?
ならば、B列が""でない行をオートフィルターで、抽出してしまえばよいかと。
(まっつわん) 2022/05/19(木) 10:00
(隠居Z) 2022/05/19(木) 22:32
以下のようなシートがあります。
Y列とZ列を参照して、AL列にここでは「浜田 省吾郎」さんの日付を抽出しています。この名前がSheet1のB4の名前になります。
この名前をリスト化していて、変更することで、その方の日付を抽出してくるというものです。
お尋ねのSheet1のB列には、B8=IF(COUNTIF(Sheet2!$AL$5:AL5,Sheet2!AL5)>1,"",Sheet2!AL5)を入れています。
B8:B117まで全て日付が入るとは限りません。空欄が出てきます。その空欄の行をB4の名前を選択した時点で非表示にしたいというものです。
空欄の判断として、(これまで説明したことを訂正します)O8=IF(B8<>"",1,0)としてましたが、実際には、=IF(Sheet2!AL5<>"",1,0)です。
これにより、空白かどうかを判断して、空白行を非表示にしたいというものでした。
Sheet2
__Y_______________Z_____AL______
5_浜田 省吾郎____4/1___4/1
6_尾崎 豊次郎____4/5___4/15
7_山下 達五郎____4/10
8_浜田 省吾郎____4/15
9_徳永 英明子____4/20
:
(素人) 2022/05/20(金) 07:14
(隠居Z) 2022/05/20(金) 10:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.