[[20170504205433]] 『行非表示の自動化』(右近) ページの最後に飛ぶ

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

 

『行非表示の自動化』(右近)

お世話になります。

U10からU20に以下の関数を設定しています。
U10=IFERROR(IF(C10<>"",1,0),0)
以下、U20までオートフィルしています。
その結果、0 という結果がでた行を自動的に非表示したいと考えております。
逆に 1 という結果がでれば再表示する形にしたいのです。
よろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


>自動的に

の意味がよくわかりません。
C列またはU列でオートフィルターではだめなのでしょうか。

(マナ) 2017/05/04(木) 21:15


オートフィルターですね。
早速、マクロボタンを作ってみました。
その際、通常シートの保護をかけておきたいです。
パスワードも設定したいのですが、
以下のようにマクロの記録をもとに、パスワードの設定を入れてみたのですが、
うまく動作しません。
よきアドバイスをお願いいたします。

Sub オートフィルター()
'
' オートフィルター Macro
'

'

    sh1 Unprotect. "123"
    Range("U10:U20").Select
    Selection.AutoFilter
    ActiveSheet.Range("$U$10:$U$20").AutoFilter Field:=1, Criteria1:="1"
    Range("O10").Select
    ReProtect sh1, "123"

End Sub

(右近) 2017/05/04(木) 22:47


あら、マクロでよいのですか。
ならば、オートフィルタでなく行の非表示・再表示でよいのですが。

近いところでは、こんな質問がありました。
[[20170503003602]] 『指定値を含む行の非表示(VBA)』(Joey)

シート保護についても、マクロの記録を利用するとよいです。

(マナ) 2017/05/04(木) 22:58


>シート保護についても、マクロの記録を利用するとよいです

試してみたら、パスワード部分は記録されませんでした。
なので、ネット検索してみました。

http://officetanaka.net/excel/vba/sheet/sheet07.htm

(マナ) 2017/05/04(木) 23:13


マナさん、ありがとうございます。
最初の投稿を参考に以下のように自分の条件に見合うように作成してみました。
いかがでしょうか?
これは、U10:U20列内に0が入力されている行を非表示にするというものですが・・・

 Sub Macro()
     Dim k As Long
     For U = 10 To 20
         If Cells(k, "U").Value = 0 Then
             Rows(k).Hidden = True
         End If
     Next
 End Sub
(右近) 2017/05/04(木) 23:16

以下のように修正して、テストしたらところ、うまく動作しました。
ただ、マナさんのパスワード解除、保護の構文は、どこにどのように入れればよいのか、教えていただいた記事を見ましたが、いまひとつわかりません。
よろしければ、ご指導ください。

Sub Macro()

     Dim k As Long
     For U = 10 To 20
         If Cells(U, "U").Value = 0 Then
             Rows(U).Hidden = True
         End If
     Next
End Sub
(右近) 2017/05/04(木) 23:26

シート保護の件はあとにして、
今のコードは問題ありです。

>以下のように修正して、テストしたらところ、うまく動作しました。

修正が間違っています。
kをUにするのではなく、Uをkにしてください。 

 Sub Macro() 
     Dim k As Long

     For k = 10 To 20
         If Cells(k, "U").Value = 0 Then
             Rows(k).Hidden = True
         End If
     Next
End Sub

でも、これだと、以下の点でだめじゃないですか。

>逆に 1 という結果がでれば再表示する形にしたいのです。

10〜20行について再表示しておくコードを追加してください。
わからなければ、マクロの記録です。

(マナ) 2017/05/04(木) 23:48


ありがとうございます。
再表示ですが、テストしたところ、1にするとこのコードで行が表示されています。

(右近) 2017/05/04(木) 23:58


逆に、1だったものが0になった場合は、自動で非表示されず、マクロボタンを押さないと非表示になりません。
0だったものが1になった場合は、ボタンを押さずとも表示されます。
(右近) 2017/05/05(金) 00:03

すみません。
マナさんがおっしゃるとおり、やはり、再表示されません。
私の確認ミスでした。すみません。
再表示のコードが必要になるわけですね。やってみます!
(右近) 2017/05/05(金) 00:05

こんな流れのマクロになります。

1)シート保護解除
2)10〜20行再表示
3)U10について
4)もし、0であったら、行を非表示
5)同様に、U11〜U20まで繰り返し
6)シート保護

わたしは、もう寝ますが、あとは試行錯誤でできると思います。

(マナ) 2017/05/05(金) 00:08


追加で。

シート保護の条件で、行の書式設定を許可しておけば、
マクロでシート保護を解除しなくてもよいです。

(マナ) 2017/05/05(金) 00:14


 まず、再表示のコードは以下です良いでしょうか?
ただ、パスワードによる保護のコードに行き詰まっております。

Sub Macro()

     Dim k As Long
     For k = 10 To 20
         If Cells(k, "U").Value = 0 Then
             Rows(k).Hidden = False
         End If
     Next
End Sub
(右近) 2017/05/05(金) 09:02

この非表示と再表示のコードを一つにしたいのです。
一度押すと非表示、もう一度押すと再表示という形です。
よきアドバイスをお願いします。
(右近) 2017/05/05(金) 09:28

このようにコードをつくってみました。
テストしたところ、切り替え可能になりました。
しかしながら、0から1になった場合、その逆も同様ですが、
うまく表示、非表示ができません。
なにかが足りないのでしょうか・・・
よろしくお願いします。

 Sub Macro()
     Dim k As Long

     For k = 10 To 43
         If Cells(k, "U").Value = 0 Then
             Rows(k).Hidden = Not Rows(k).Hidden
         End If
     Next
 End Sub

(右近) 2017/05/05(金) 09:47


説明が分かりにくくてすいません。
この表示・非表示切り替えボタンを押す場合、
非表示にした状態で、U列の状態(0→1、1→0)を変化させ、
表示にしようとすると、うまく表示されないです。
(右近) 2017/05/05(金) 09:55

マクロを自分で作ったことがないようだから
今回は、答えを提示しようか迷っていたのですが
その前に、追加要望ですか。
たぶん、完成コードをみても理解できなくなりそうで心配です。

で、最初にもどって、オートフィルタでもよいですか。
マクロも不要です。シート保護したままで実行可能です。

(マナ) 2017/05/05(金) 10:06


よろしければ、この表示・非表示の切り替えマクロでいかせてもらいたいです。
非表示の状態からU列の状態が変化しても、1は表示、0は非表示させるマクロにしたいです。
よろしくお願いします。
(右近) 2017/05/05(金) 10:30

 おはようございます。

 話が噛み合ってないようなので一点だけ、

 U列(C列)の変化に対して、自動で表示非表示を切り替えたいんですよね?
 Worksheet_Changeイベントを調べて下さい。

 回答者はあなたの画面は見えませんし、頭の中の考えも知りません。
 マクロ云々以前に、やりたい事を正しく相手に伝える努力をして下さい。

(sy) 2017/05/05(金) 10:44


・ボタンを用意して、下記マクロを登録
・シートは事前に保護しておくこと

 Option Explicit

 Sub test()
     Const pw As String = "123"
     Dim rr As Range, r As Range

     ActiveSheet.Unprotect Password:=pw

    Set rr = Rows("10:20")
    rr.Hidden = False

     With ActiveSheet.Shapes(Application.Caller).TextFrame.Characters
        If .Text = "絞り込む" Then
            For Each r In rr.Rows
                If r.Range("U1").Value = 0 Then
                    r.Hidden = True
                End If
            Next
            .Text = "全表示する"
        Else
            .Text = "絞り込む"
        End If
    End With

     ActiveSheet.Protect Password:=pw

 End Sub

(マナ) 2017/05/05(金) 11:00


syさん

いつもフォローありがとうございます。

C列の変更(入力)するには、いずれにしても再表示が必要かと思いました。
C列も数式かもしれませんが。

(マナ) 2017/05/05(金) 11:06


 >C列の変更(入力)するには、いずれにしても再表示が必要かと思いました。 

 あっ!そうですね。
 言われてみれば、そもそも変更する為には表示しないと出来ないですね。
 Worksheet_Change以前の問題でした。
 失礼しました。

(sy) 2017/05/05(金) 11:57


マナさん、syさん、ご指導ありがとうございます。
私の質問の仕方についてもご指摘いただき、ありがとうこざいます。
足りないことばかりで、申し訳ありません。

マナさんにご教授いただいたコードで実行してみましたところ、うまく動作しました!
ありがとうございます。

ただ、もう一つ欲を言わせていただければと思います。

C10〜C20には、関数が入っておりまして、名前が入っております。
この名前が入っているかいないかで、U列 に 1 又は 0 を表示させるものです。
1 であれば表示、0 であれば非表示するというものです。

それで、例えば、C10〜C14まで名前が入っている場合、絞り込みボタンを押すと、15〜20行目は非表示となります。その後、キーとなる日付が B2 セルに入っておりまして、これを変更すると、C列の名前が変わるようにしております。

日付を変更したら、C10〜C14まで入っていた名前が、C10〜C16になると、日付を変えた時点で、C16まで表示させるようにすることは可能でしょうか?

つたない説明で申し訳ありません。
どうぞよろしくお願いいたします。
(右近) 2017/05/05(金) 14:15


ならば、syさんのコメント通りです。
使い方は、Worksheet_Changeイベントで検索してください。

 Option Explicit

 Private Sub Worksheet_Change(ByVal Target As Range)
     Const pw As String = "123"
     Dim rr As Range, r As Range

     If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub

     ActiveSheet.Unprotect Password:=pw

    Set rr = Rows("10:20")
    rr.Hidden = False

    For Each r In rr.Rows
        If r.Range("U1").Value = 0 Then
            r.Hidden = True
        End If
    Next

     ActiveSheet.Protect Password:=pw

 End Sub

(マナ) 2017/05/05(金) 14:35


希望どおりの結果となりました!
ご教授まことにありがとうございました。

(右近) 2017/05/05(金) 15:28


コメント返信:

[ 一覧(最新更新順) ]


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