[[20220518194228]] 『リストを選択すると行を非表示にするマクロ』(素人) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『リストを選択すると行を非表示にするマクロ』(素人)

質問いたします。
リストから名前を選んだら、該当の行を非表示にするというマクロを作りたいのです。具体的には、以下のような状況です。

B4に名前のリストがあります。
そのリストの名前によって、O8:O117に1か0が入るようにしておき、0となった行は非表示にするというものです。
リストによって、0の範囲が変わります。
1と0が交互になることはありません。
リストから名前を選択したと同時に行の非表示マクロを実行するようにしたいです。
よろしくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


こんばんは〜^^
リストの詳細情報、シート、セル番地[範囲]
O8:O117
との関連、など、今少し、具体的にご説明賜れば
お手伝い、できるやもしれません。。。←多分。^^;
m(__)m
(隠居Z) 2022/05/18(水) 19:58

早速ありがとうございます。
リストの詳細情報→名前をリスト化していまして、最大10名ですが、実際にはその半分くらいです。
名前は、姓と名の間を必ず一文字あけている名前です。

シート→Sheet1

セル番地[範囲]→B8:L117
O8=IF(B8<>"",1,0)

リストの名前によって、O列の0の範囲が変動します。必ず連続します。1と0は混在しません。

隠居Zさん、よろしくお願いします。
(素人) 2022/05/18(水) 20:14


>リストの名前によって、O列の0の範囲が変動します。
名前だったら誰でもいいの。条件はどうなってるの。
ただそれだけだと分からないよ。
(くま) 2022/05/18(水) 20:32

ありがとうございます。
リストに登録している名前です。
誰でもよいわけではありません。
実名は避けたいので、例えば、
鈴木 太郎
山田 一郎
松田 明子
のような名前です。
(素人) 2022/05/18(水) 20:35

>リストに登録している名前です。
ではその人達が選択されたら O列に「0」が入るということ。
だから条件はと聞いたんですよ。
いずれにせよマクロになるかと。
マクロは詳しくないので返答できません。
(くま) 2022/05/18(水) 20:49

O8=IF(B8<>"",1,0)
この関数にて、B列が空白でないなら1、空白なら0を返すようにしていて、
その0の行を非表示にしたいというものです。
B4のリスト選択した名前によって、B列の状況が変わるため、O列の0の行数も変動するということです。
説明がわかりづらく、すみません。
(素人) 2022/05/18(水) 20:53

こんばんは。
参考になるかもです。
https://kirinote.com/excelvba-zerorow-hidden/

(くれよん) 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


皆さん、ありがとうございます。
γさんのご質問にお答えいたします。
Q1B4だけではありませんが、他のシートと様々関連していて、結果、B列を参照させて、O列に1か0の判定をさせています。
Q2おっしゃるとおり、回答していただく方は気にされなくてよいと思います。 
Q3はい、そうです。B列が空欄ならば、O列は0を返すように、 =IF(B8<>"",1,0)を設定しています。
 O8:O117までこの関数が入っています。これにより、1か0かを判定します。
Q4はい、そうです。O8:O117までのうち、0になっている行は非表示にしたいです。それもB4の名前を選択すると同時にマクロを作動させ、非表示にできればと思います。ご紹介いただいたサイトと同じようなマクロを参考にして、ボタンを作って、一度押したら非表示、もう一度押したら、再表示のようにはできるのですが、私としては、B4セルの名前を選択するのと同時に非表示にするマクロを実行できたらと思っています。また、別の名前を選択したら、さらに0の行を非表示という具合にです。
よろしくお願いします。
(素人) 2022/05/18(水) 22:06

Changeイベントプロシージャを調べてください。
B4が変更になったときに、動作するようにすればいいでしょう。

(γ) 2022/05/18(水) 22:16


http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
が参考になるでしょう。

(γ) 2022/05/18(水) 22:19


勘違いしてたらすみませんが
名前を選択すると0が入っている行が非表示になり、
また別の名前を選択すると0が入りその行が非表示になるって事ですか?
非表示が増えて行くってコードですか?
(くれよん) 2022/05/18(水) 22:22

くれよんさんへの回答

いいえ、リストの名前が変わることで、B列の内容が変わり、B列を参照してO列が1か0の判定をすることで、0の行を非表示にするものです。
名前により非表示の行が増えるかもしれないし、減るかもしれません。
必ずしも非表示が増えるわけではありません。
(素人) 2022/05/18(水) 22:32


こんばんわ ^^
既に適切なアドバイスが多数あり、何も申し上げることは無いのですが
後学のため←私の勉強の^^;とでもいいますか
なにやら、B列の書き換え方法がふか〜く、関わってくるよ〜な
気がするのですが。。。気のせいでせうか。差支えなければ、教えて頂けば
テストも出来るのですが。
既に、ご解決でしたら、無視して下さいませ。m(__)m
(隠居Z) 2022/05/18(水) 23:32

隠居Zさんへの回答
B列は他シートから参照させた日付が入っています。
数式としては、=Sheet3!$D5です。その日付が入っているのかどうかをO列に1か0で判定させています。
すみません。これだけではあります。

くれよんさんとγさんに教えていただいたサイトを参考にして組んだものは以下のとおりです。
ボタンによる非表示、再表示はできましたが、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


参考のものなどを当て込んでみただけです。
理解できていないままで、すみません。
名前を指定したい
再クリックではなく0の行を非表示にする
が希望です。

(素人) 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


γ様
いえいえ。。。ご案内のとおりかと存じます。 ^^
ありがとうございます。
m(_ _)m
(隠居Z) 2022/05/19(木) 08:14

ご自分のことですので、よく理解してコードを作成して下さい。
他の回答者さんからも有益な指摘をいただいていますので、合わせてご対応ください。
私はひとまずこれで失礼します。
(γ) 2022/05/19(木) 08:21

 >O8=IF(B8<>"",1,0)

0列の数式って必要ですか?

B列が""の行を非表示にしたいのですよね?
ならば、B列が""でない行をオートフィルターで、抽出してしまえばよいかと。

(まっつわん) 2022/05/19(木) 10:00


皆さん、ありがとうございます。
なかなかむずかしいですが、自分なりにすこしずつやっていきたいとおもいます。
(素人) 2022/05/19(木) 20:15

さしつかえなければ、ひとつ、教えて下さいますか。
B4の値が変われば、どういう方法で、B列の値が変わるのでしょうか。
無理にとは。。。申し上げませんが、← 無視していただいても、いいです。
m(__)m

(隠居Z) 2022/05/19(木) 22:32


隠居Zさんへの回答

以下のようなシートがあります。
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


こんにちわ ^^
何時間か拝見させてもらっているのですが
Sheet1のB4で、どなたの名前を選んでも、実行結果は同じという意味でしょうか??;
手作業で変更するのはSheet2のAL列の値で、マクロは
その値が無ければSheet1の連動する当該の行[同じ名前の]を非表示との理解で良いですか。
年のせいか理解力が不足で、済みません。。。←もとからかも。( ̄▽ ̄;)
まっつわん さんのご提案は試されましたでしょうか。
ちなみに
ご提示のコードは配置するべき箇所に配置すれば、変数宣言をきちんと
記述すれば表示、非表示は実行されましたですよ。
m(__)m

(隠居Z) 2022/05/20(金) 10:28


コメント返信:

[ 一覧(最新更新順) ]


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