Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3465 / 13645 ツリー ←次へ | 前へ→

【61531】フィルターでOR抽出するには にしもり 09/5/14(木) 17:46 質問[未読]
【61532】Re:フィルターでOR抽出するには kanabun 09/5/14(木) 18:23 発言[未読]
【61533】Re:フィルターでOR抽出するには にしもり 09/5/14(木) 18:41 質問[未読]
【62042】Re:フィルターでOR抽出するには にしもり 09/6/18(木) 18:43 質問[未読]
【62043】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 19:37 発言[未読]
【62044】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 19:54 発言[未読]
【62046】Re:フィルターでOR抽出するには にしもり 09/6/18(木) 20:12 質問[未読]
【62047】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 20:56 発言[未読]
【62048】Re:フィルターでOR抽出するには にしもり 09/6/18(木) 21:12 質問[未読]
【62051】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 21:43 発言[未読]
【62053】Re:フィルターでOR抽出するには にしもり 09/6/18(木) 23:05 質問[未読]
【62054】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 23:48 発言[未読]
【62055】Re:フィルターでOR抽出するには kanabun 09/6/19(金) 0:24 発言[未読]
【62056】Re:フィルターでOR抽出するには にしもり 09/6/19(金) 1:06 質問[未読]
【62062】Re:フィルターでOR抽出するには kanabun 09/6/19(金) 9:05 発言[未読]
【62063】Re:フィルターでOR抽出するには にしもり 09/6/19(金) 9:35 お礼[未読]
【62045】Re:フィルターでOR抽出するには kanabun 09/6/18(木) 20:05 発言[未読]

【61531】フィルターでOR抽出するには
質問  にしもり  - 09/5/14(木) 17:46 -

引用なし
パスワード
   こんにちは
フィルターでJ列がトムか または、M列にトムを含むレコードを抽出したいと思いこう記述しました。↓

  Selection.AutoFilter Field:=10, Criteria1:="=トム, Operator:=xlOr
  Selection.AutoFilter Field:=12, Criteria1:="=*トム*", Operator:=xlAnd

ところがテスト結果は、J列が空白でM列にトムを含むレコードを missしてしまいます。
私の記述は間違っていますでしょうか。
どなたかご教授ください。  

【61532】Re:フィルターでOR抽出するには
発言  kanabun  - 09/5/14(木) 18:23 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは

>フィルターでJ列がトムか または、M列にトムを含むレコードを抽出したい

オートフィルタで2列の OR抽出は無理でしょう。
フィルタオプションの設定(AdvancedFilter) を使いましよう。

フィルタ条件は 空いているセル範囲に

  J列見出し    M列見出し
  '=トム     
          '=*トム*

のように、段違いに書き込むことはご存じですね。

【61533】Re:フィルターでOR抽出するには
質問  にしもり  - 09/5/14(木) 18:41 -

引用なし
パスワード
   ▼kanabun さん:
有難うございます。
マクロの記録でフィルタオプションの設定は一度使ったことがあります。
マクロ記録しようとしましたが、どう設定すれば段違いが表示されるのか忘れてしまいました。
教本でさがして見ます。

【62042】Re:フィルターでOR抽出するには
質問  にしもり  - 09/6/18(木) 18:43 -

引用なし
パスワード
   こんにちは。
どうにか下記のロジックを作って使っています。

   Range("A10689").Select
  ActiveCell.FormulaR1C1 = "名前1"
 
  Range("A10690").Select
  ActiveCell.FormulaR1C1 = "=""トム"""
  
  Range("B10689").Select
  ActiveCell.FormulaR1C1 = "名前2"

  Range("B10691").Select
  ActiveCell.FormulaR1C1 = "=""トム"""

  Range("A1").Select
  Range(Selection, Selection.End(xlToRight)).Select
  Range(Selection, Selection.End(xlDown)).Select

  With Selection
      .AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
      Range("A10689:B10691"), Unique:=False
  End With

質問ですが下記のようにすると、走る事は走るが、
全然フィルターが機能しません。
条件は2つまでなのですか?

   Range("A10689").Select
  ActiveCell.FormulaR1C1 = "名前1"
 
  Range("A10690").Select
  ActiveCell.FormulaR1C1 = "=""トム"""
  
  Range("B10689").Select
  ActiveCell.FormulaR1C1 = "名前2"

  Range("B10691").Select
  ActiveCell.FormulaR1C1 = "=""トム"""
  
  Range("C10689").Select
  ActiveCell.FormulaR1C1 = "名前3"
 
  Range("C10692").Select
  ActiveCell.FormulaR1C1 = "=""トム"""
        
  Range("A1").Select
  Range(Selection, Selection.End(xlToRight)).Select
  Range(Selection, Selection.End(xlDown)).Select

  With Selection
      .AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
      Range("A10689:C10692"), Unique:=False
  End With  

【62043】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 19:37 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。

>どうにか下記のロジックを作って使っています。
>
>   Range("A10689").Select
>  ActiveCell.FormulaR1C1 = "名前1"
> 
>  Range("A10690").Select
>  ActiveCell.FormulaR1C1 = "=""トム"""
>  
>  Range("B10689").Select
>  ActiveCell.FormulaR1C1 = "名前2"
>
>  Range("B10691").Select
>  ActiveCell.FormulaR1C1 = "=""トム"""
>
>  Range("A1").Select
>  Range(Selection, Selection.End(xlToRight)).Select
>  Range(Selection, Selection.End(xlDown)).Select
>
>  With Selection
>      .AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
>      Range("A10689:B10691"), Unique:=False
>  End With

条件範囲は A列とかでなくて シートの右のほうの空いている列に書くのが
ふつうです。

また、抽出範囲は [A1]セルの表領域のようなので、Select、Selection を使わず
CurrentRegionプロパティを使って表せます。

>全然フィルターが機能しません。
>条件は2つまでなのですか?

いいえ、いくつでも可能です。だから 「Advanced」フィルタなのです(^^
書き方がちょっと適切ではないのでは?

たとえば、
その「名前1」「名前2」「名前3」の列が仮に D列、J列、L列のことだとしますと
条件 Criteria は こんな風に書けます。

Sub Try2()
  With Range("AA1")
    .CurrentRegion.ClearContents
    .Range("A1").Formula = "=D1"
    .Range("B1").Formula = "=J1"
    .Range("C1").Formula = "=L1"
    .Range("A2,B3,C4").Value = "'=トム"  'ダブルクォートを使わない
  End With
  
  Range("A1").CurrentRegion.AdvancedFilter _
   xlFilterInPlace, _
   CriteriaRange:=Range("AA1").CurrentRegion
   
End Sub

【62044】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 19:54 -

引用なし
パスワード
   以下は ある常連回答者の発言です。

完全一致で"トム"だけ抽出したい場合、普通は
'=トム
とします。

="=トム"
ってするのは面倒ですから。

表示形式を「文字列」にしてあれば
=トム
でもいいけど、表示形式の設定が必要なので
'=トム
が一番楽でしょう。

【62045】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 20:05 -

引用なし
パスワード
   おまけで、フィルタオプション のもう一つの条件式の書き方
に、こんなのがあります。

空いている列 たとえば AG列に

[AG1] (空白)
[AG2] =OR(D2="トム",J2="トム",L2="トム")

これで [AG1:AG2] を条件範囲に指定すれば、前のと同じく
D,J,L列に「トム」のある行がすべて抽出できます。

お好きなほうをどうぞ (^^

【62046】Re:フィルターでOR抽出するには
質問  にしもり  - 09/6/18(木) 20:12 -

引用なし
パスワード
   ▼kanabun さん:
まことに有難うございます。
投稿の便宜上、抽出条件を3つともトムにしましたが「<>トム」「=トム」「=*トム*」です。すみません。
そこで下記のように記述し実行すると、走るには走りましたが意図どおりにいきませんでした。
書き方がおかしいでしょうか。

 With Range("AA1")
    .CurrentRegion.ClearContents
    .Range("A1").Formula = "=B1"
    .Range("B1").Formula = "=P1"
    .Range("C1").Formula = "=R1"
    .Range("A2").Value = "'<>トム"  'ダブルクォートを使わない
    .Range("B3").Value = "'=トム"  'ダブルクォートを使わない
    .Range("C4").Value = "'=*トム*"  'ダブルクォートを使わない
  End With
 
  Range("A1").CurrentRegion.AdvancedFilter _
   xlFilterInPlace, _
   CriteriaRange:=Range("AA1").CurrentRegion

【62047】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 20:56 -

引用なし
パスワード
   ▼にしもり さん:
こんばんは。

>投稿の便宜上、抽出条件を3つともトムにしましたが「<>トム」「=トム」「=*トム*」です。すみません。
>そこで下記のように記述し実行すると、走るには走りましたが意図どおりにいきませんでした。
>書き方がおかしいでしょうか。

>    .Range("A2").Value = "'<>トム"  'ダブルクォートを使わない
>    .Range("B3").Value = "'=トム"  'ダブルクォートを使わない
>    .Range("C4").Value = "'=*トム*"  'ダブルクォートを使わない

この条件を日本語で表現するとどういう抽出条件ですか?

【62048】Re:フィルターでOR抽出するには
質問  にしもり  - 09/6/18(木) 21:12 -

引用なし
パスワード
   ▼kanabun さん:

>>    .Range("A2").Value = "'<>トム"  'ダブルクォートを使わない
>>    .Range("B3").Value = "'=トム"  'ダブルクォートを使わない
>>    .Range("C4").Value = "'=*トム*"  'ダブルクォートを使わない
>
>この条件を日本語で表現するとどういう抽出条件ですか?

B列はトム以外、
P列はトムと等しい、
R列はトムを含む、
です。
どうかご教示よろしくお願いします。 

【62051】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 21:43 -

引用なし
パスワード
   ▼にしもり さん:

>>この条件を日本語で表現するとどういう抽出条件ですか?
>
>B列はトム以外、
>P列はトムと等しい、
>R列はトムを含む、
>です。

たとえば、簡単な例として、
以下のようなデータがあったばあい、
提示の条件で どの行が抽出されればいいですか?

  B列     P列   R列
1 名前1    名前2  名前3
2  あ     か    さ
3  い     き    し
4 トム    トム    す
5  え     け    せ
6 トム    こ    アトム


 B列[2,3,5]
 P列[4]
 R列[6]

と条件に一致するから、答えは 全行が抽出されれば「意図通り」
との考えで いいですか?

【62053】Re:フィルターでOR抽出するには
質問  にしもり  - 09/6/18(木) 23:05 -

引用なし
パスワード
   ▼kanabun さん:
すみません、質問が少し間違っていたことに気づきました。
まことにすみません。

この条件を日本語で表現すると

B列が太郎以外、かつ(P列がトムと等しい、またはR列がトムを含む)、
というのが正しかったです。

  B列     P列   R列
1 名前1    名前2  名前3
2  太郎    か    さ
3  い     トム   し
4 太郎    トム    す
5  え     け    アトム
6 太郎    こ    アトム
このとき抽出されるべきは,
 [3]と[5]行です。
どう記述すればいいでしょうか。
お手数かけてまことにすみません。

【62054】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/18(木) 23:48 -

引用なし
パスワード
   ▼にしもり さん:

>すみません、質問が少し間違っていたことに気づきました。
>
>B列が太郎以外、かつ(P列がトムと等しい、またはR列がトムを含む)、
>というのが正しかったです。

なるほど、、、複雑な条件ですね〜

そのばあい、2番目の記述法のほうでトライしてみてください。
たとえば、条件を書く列が [AA]の1列として、

[AA1] (空白)
[AA2] =AND(B2<>"太郎",OR(P2="トム",COUNTIF(R2,"*トム*")>0))

[AA1:AA2] を条件範囲に指定してみてください。

【62055】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/19(金) 0:24 -

引用なし
パスワード
   ▼にしもり さん:

>B列が太郎以外、かつ(P列がトムと等しい、またはR列がトムを含む)

これを 当初の 検索条件範囲の書き方で行くと、こう


=B1     =P1    =R1
<>太郎   '=トム 
<>太郎        '=*トム*


ですね、きっと。

以下が参考になりました。
ht tp://www.d3.dion.ne.jp/~jkondou/excelvba/K4.htm

【62056】Re:フィルターでOR抽出するには
質問  にしもり  - 09/6/19(金) 1:06 -

引用なし
パスワード
   ▼kanabun さん:
記述式のアドバイスありがとうございます。理解はできました。
ですが、記述式でなければできませんでしょうか。
といいますのは、毎日使いたいので、できればボタン一発でRUNするようにしたいです。

Sub Try2()
  With Range("AA1")
    .CurrentRegion.ClearContents
    .Range("A1").Formula = "=B1"
    .Range("B1").Formula = "=P1"
    .Range("C1").Formula = "=R1"
  ( .Range("A2").Value = "'<>太郎"and  
    .Range("B3").Value = "'=トム" ) or
  ( .Range("A2").Value = "'<>太郎"and
    .Range("C4").Value = "'=*トム*")
  End With
  
  Range("A1").CurrentRegion.AdvancedFilter _
   xlFilterInPlace, _
   CriteriaRange:=Range("AA1").CurrentRegion
   
End Sub
みたいな。
すみません、むちゃくちゃな聞き方とわかって質問しております。

【62062】Re:フィルターでOR抽出するには
発言  kanabun  - 09/6/19(金) 9:05 -

引用なし
パスワード
   ▼にしもり さん:

>みたいな。
>すみません、むちゃくちゃな聞き方とわかって質問しております。


'---[BB]----------------------------------
'  =B1     =P1    =R1
'  <>太郎   '=トム
'  <>太郎        '=*トム*
'-----------------------------------------
なら、

Sub Try4()
  With Range("BB1")
    .CurrentRegion.ClearContents
    .Range("A1").Formula = "=B1"
    .Range("B1").Formula = "=P1"
    .Range("C1").Formula = "=R1"
    .Range("A2:A3").Value = "<>太郎"
    .Range("B2").Value = "'=トム"
    .Range("C3").Value = "'=*トム*"
  End With

  Range("A1").CurrentRegion.AdvancedFilter _
   xlFilterInPlace, _
   CriteriaRange:=Range("BB1").CurrentRegion

End Sub


'----------------------------------------------------
'[CC1] (空白)
'[CC2] =AND(B2<>"太郎",OR(P2="トム",COUNTIF(R2,"*トム*")>0))
'---------------------------------------------------
なら

Sub Try5()
  Dim CR As Range
  Set CR = Range("CC1:CC2") '← CriteriaRange
  
  CR.Item(1, 1).ClearContents
  CR.Item(2, 1).Value = _
   "=AND(B2<>""太郎"",OR(P2=""トム"",COUNTIF(R2,""*トム*"")>0))"
  
  Range("A1").CurrentRegion.AdvancedFilter _
   xlFilterInPlace, CriteriaRange:=CR
  
End Sub

【62063】Re:フィルターでOR抽出するには
お礼  にしもり  - 09/6/19(金) 9:35 -

引用なし
パスワード
   ▼kanabun さん:

まことにありがとうございます。
しかも2パターンとも例示してくださり、深く深く感謝いたします。
Try4を参考にしてできました。
投稿のたび、自分の力の無さを思い知らされます。
それにしてもこのAdvancedFilterというのは非常に有用ですね。
使いこなせるようになりたいと思っています。
有難うございました。

3465 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free