[[20110815153817]] 『1つのシートで2種類のオートフィルタをマクロで』(AKO) ページの最後に飛ぶ

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

 

『1つのシートで2種類のオートフィルタをマクロで設定できますでしょうか?』(AKO)
 Excel2003

 本日2回目で申し訳ございません。
 過去ログを探すも、どうもピンとこなくて・・・

 1つのシートで、A列〜J列までをオートフィルタするところ(@)と、
 A列は結合していてB列からJ列までをオートフィルタしたいところ(A)があります。
 どちらも空欄でないところを抽出してくるように指定したいのですが、
 もともと@は設定していたのですが、追加でAを設定しようと入力したら、
 @に影響が出る始末です。

 @
 With Sheets("データ表示").Range("A36:J76")
 AutoFilter Field:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), VisibleDropdown:=False
 AutoFilter Field:=1, Criteria1:="<>", VisibleDropdown:=False
 End With

 A
 With Sheets("データ表示").Range("A6:J13")
 AutoFilter Field:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), VisibleDropdown:=False
 AutoFilter Field:=1, Criteria2:="<>", VisibleDropdown:=False
 End With

 ちなみに、A5:A13、B5:C5、D5:F5、は項目名のため結合しています。
 項目名に続く行は、B6:C6、B7:C7・・・・、と結合しています。

 このような形でもオートフィルタは可能でしょうか?
 いつもすみません。
 よろしくお願いいたします。


 回答の前に

 オートフィルターは、1つのシートでは、ある時点では1つの領域にしか設定できないけど、それは理解してる?
つまり、@ と A は 並存できないということだけど。

 以下のコードは、何を意図している?(わかりそうな気もするけど)
With Sheets("データ表示").Range("A36:J76")
With Sheets("データ表示").Range("A6:J13")

 そもそもが
AutoFilter Field:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), VisibleDropdown:=False
これは実行できてる?
AutoFilterメソッドは、必ず Expression.AutoFilter と記述することが必要。(ヘルプに目を通してみて)

 A5:A13、B5:C5、D5:F5、は項目名のため結合しています。
この A5:A13 って? もしこうなら、そのあとのA14以降も結合?

 (ぶらっと)

 一つの領域にしか設定できないんですね。
 @は、実行できてたんです(これも、こちらで教えてもらったものでして・・・)
 Aについては、A14以降は結合されていないんです。
 すみません・・・ 

 >@は、実行できてたんです(これも、こちらで教えてもらったものでして・・・)
実行できていたということは 実際のコードは AutoFIlter の前に . (ピリオド) があるのかな?

 (ぶらっと)

 そうです!
 こちらに書き込む時に、消してしまってました。
 すみません。

 With Sheets("データ表示").Range("A36:J76")
  .AutoFilter Field:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), VisibleDropdown:=False
  .AutoFilter Field:=1, Criteria1:="<>", VisibleDropdown:=False
 End With

 このような形です。
 重ね重ね、すみません・・・

 上で書いたとおり、1つのシートには、同時に2つのオートフィルター領域を持つことはできないので
やるとすれば、2つのブロックのそれぞれの抽出結果を別シートに表示するといったことになるのでは?

 それ以前に、シートの姿が見えない。かつ、そこで、どんなフィルタリングをしようとしているのかが見えない。
Aなんか、結合セルの真ん中あたりから始まる領域をオートフィルター領域にしていたり。

 @、A それぞれ、具体的なレイアウトと、オートフィルター用のタイトル(項目名)が、どこにどんなようにあるのか
具体的な説明がほしいね。それから、そこで、実際にどんなフィルタリングをしたいのかも(コードじゃなく言葉で)

 (ぶらっと)

 すみません。

 こんな感じでわかりますでしょうか?

 Aには、下記のように納品仕様みたいなのを
   A |B    |C|D |E・・・J
  6 数 |メーカー |コード |納品日 
  7 量 |パナソニック |123-456 |'11/8/31
  8   |     |    |
 ・    |         |        |   
 ・

 @には、上記Aに続けて納品時の注意事項が記載できるようになっています。
   A |B    |C|D |E・・・J
   その他特記事項
 36 ・納品日厳守
 37  ・数量表を確認の事
 ・
 ・

 @もAも何行か入力できるようになっているのですが、オートフィルタで文字が入っている行だけ
 抽出するようにしたいのです。
 もともと@だけの設定であったのですが、Aも数量を入れない行を印刷するのが無駄かなと思い、
 オートフィルタができたらいいかなと思いました。

 昔どなたかが作られていたのを、四苦八苦しながら修正をかけています。
 先日のとおり、あまり仕組みをわかっていなくてすみません。

 


 レイアウト拝見。

 まずA
 6行目がタイトル行で、データは7行目からだよね。(パナソニックというのはタイトルではなくデータだよね。)
 で各行の数量をA列にいれて、数量があるものだけを表示させて印刷したいということでいいね。
 ここで、わからなくなるのは、8行目の数量は、A8に入力するんだろうと思うんだけど、7行目の数量はどこ?

 で、そのAの領域は13行目まででいいのかな?それより下、@の直前までデータ行として使うってことは
 ないの?

 次に@
 36行目から特記事項をフリーに記入、この領域が76行目まであって、A列の特記事項が空白のところを
 非表示にしたいということだよね。
 エクセルのフィルター機能はフィルターリストの領域の先頭行がタイトル行というきまりだけど、
 ここにはタイトル行はなく、いきなりデータ行ということだね。

 もう1つ。
 14行目から35行目まで、何が入っているのか(あるいは入っていないのか)わからないけど、
 ここはさわらなくてもいいということだよね。

 (ぶらっと)

 すみません。
 またしてもです。

 Aですが、A列は数量表という項目名でA6:A13までは結合されています。

   A |B    |C|D |E    |F   |G・・・J
 ____________________________
  6 数 |メーカー |コード |納品日  |数量  |
       |__________________________
  7 量 |パナソニック |123-456 |'11/8/31 |1  |
       |_________________________
  8 表 |     |    |     |   |
 ・   |         |        |     |   |
 ・
 13
 ____________________________

 14行目から34行目は別の情報が入っているのですが触りません。
 14行目から34行目はAよりも更にいろんな結合をしています。

 @ですが、35行目のA35にタイトルが入っています。
 A35:J37は結合していません。
 A36からの各々の行は、A36:J36 A37:J37・・・A76:J76と結合されています。
 もともと別のシートに並べられた情報をA36〜A76までにコピーされます。
 それからA36〜J76までをオートフィルタし、空欄でないところを抽出させています。

   A |B    |C|D |E・・・J
 35その他特記事項
 ____________________
 36●納品日厳守
 ____________________
 37●数量表を確認の事
 ____________________
 ・
 ・
 ____________________
 76

 本当に重ね重ねすみません。


 ラッジャー。
最初にアップされたAのフィルタリングのコードからは、うかがいしれないレイアウトだったね。
(というより、そもそも、このコードはヘンだったけど)

 いずれにしても、レスしたように、1つのシートには、同じタイミングで2つ以上のオートフィルター領域を設定することはできない。
@もAもオートフィルターじゃない方法に変更する手もあるけど、今、少なくとも@についてはオートフィルターのコードで
問題なく動いているとのことなので、Aだけを別方式で。
以下の「非表示」「再表示」のなかのコードを現在のコードに組み込んで。

 Sub 非表示()
    Dim c As Range
    With Sheets("データ表示")
        For Each c In .Range("B7:B13")
            If Len(c.Value) = 0 Then c.EntireRow.Hidden = True
        Next
    End With
 End Sub

 Sub 再表示()
    With Sheets("データ表示")
        .Rows("7:13").Hidden = False
    End With
 End Sub

 (ぶらっと)

 ありがとうございます。

 試してみたのですが、変化がないんです(T-T)
 ちなみに、@と同様にAも別シートからコピーされた情報が貼り付けられるようになっていて、
 計算式が入っているのですが、計算式が入っていたら空欄扱いにならないとかありますでしょうか?
 @は計算式が入っていてもオートフィルタされるので関係ないですよね?

 すみません。

 う〜ん・・・
式が入っていても、値として空白であれば機能するんだけどなぁ・・・
(こちらでは、問題なく機能している)
まさか、コピペした別のところのセルを、たとえば、それが Z10 だったとして、=Z10 なんて式だと
Z10が空白の場合でも、 「0」 になって「空白じゃなくなる」けど、そこはどうなんだろう?

 いずれにしても、どんな式がB7:B13に入っているのかアップしてもらえる?

 (ぶらっと)

 本当にすみません

 B7:B13まで下記のような式が入っています。
 
 =IF(入力画面!C16="","",入力画面!C16)

 B7にはC16、B8にはC17・・・となっていきます。

 C7には、
 =IF(入力画面!D16="","",入力画面!D16)

 E7には、上記の式にF16と展開しています。

 ちなみに、@のA36:A76は、
 下記の式が入っています。

 =IF(Sheet1!E69<>"",Sheet1!E69,"")

 こちらも、A36にはE69、A37にはE70・・・となっていきます。

 作業の流れは、
 『入力画面』というシートに情報を入力します。
 @については一旦『印刷画面』というシートの
 =CONCATENATE(" ",入力画面!C121,"")
 という式が入っているところにコピーされます。
 これを更にマクロで、『Sheet1』というシートにコピーされます。
 最後に『データ表示』のA36:A37にコピーされます。

 Aについては、
 『入力画面』に入れると直接 『データ表示』のB7:B13〜J7:J13に
 コピーされます。

 すみません。
 何だか本当にすみません。


 同じような環境を作り、同じ式をいれて試したけど、やはり「正常」だなぁ。
仮に空白なのに非表示にならないというのがB10だったとして、データ表示シートの、どこかのセルに
=LEN(B10) と打ち込んで、「0」かどうか試してみてくれる?

 =IF(入力画面!D16="","",入力画面!D16) これが
 =IF(入力画面!D16=""," ",入力画面!D16) とか
 =IF(入力画面!D16=""," ",入力画面!D16) になってたりして・・・・

 (ぶらっと)


 なんとなく想像が・・・
たぶん、B7:B13 に入っている式は「正しい」
でも、入力画面!C16からはじまる元ネタは人間が入力しているので、空白のつもりでも、半角スペースや全角スペースがあるのかも。
そうすると、=IF(入力画面!C16="","",入力画面!C16) で、「空白じゃないので」その「スペース」という値をセットする。
一方、アップしたコードは、「空白かどうか」をきいていて、スペースは空白じゃないので非表示にならない。

 この想像が当たっていれば、上でお願いした =Len(B10)が「0」じゃないはず。

 で、こうだった場合の対応策は
1.ちゃんと空白にしてもらう。でも、これは困難かな?見た目わからないからね。
2.空白なら非表示とするのではなく、何かマークをきめておいて、たとえば"○"なら表示というふうに変更する。
3. If Len(c.Value) = 0 Then c.EntireRow.Hidden = True
  これを
    If Len(Trim(c.Value)) = 0 Then c.EntireRow.Hidden = True
    に変更する。

 とりあえず、3.でいきますか?

 (ぶらっと)


 やっとBをチャレンジしてみました。
 でも、やはりダメでした。
 何かが邪魔してるのだと思います。
 やはり初心者レベルの私には無理があったのかと・・・

 ぶらっとさま
 ありがとうございました。
 もう少し整理して、またチャレンジしてみます。

コメント返信:

[ 一覧(最新更新順) ]


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