Excel VBA質問箱 IV

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

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


3876 / 13646 ツリー ←次へ | 前へ→

【59463】アドバンスフィルターの使い方について フィルター 08/12/12(金) 10:41 質問[未読]
【59464】Re:アドバンスフィルターの使い方について kanabun 08/12/12(金) 11:49 発言[未読]
【59469】Re:アドバンスフィルターの使い方について フィルター 08/12/12(金) 15:12 質問[未読]
【59473】Re:アドバンスフィルターの使い方について kanabun 08/12/12(金) 15:43 発言[未読]
【59474】Re:アドバンスフィルターの使い方について フィルター 08/12/12(金) 16:00 お礼[未読]
【59491】Re:アドバンスフィルターの使い方について kanabun 08/12/13(土) 10:35 発言[未読]
【59492】Re:アドバンスフィルターの使い方について kanabun 08/12/13(土) 11:35 発言[未読]
【59504】Re:アドバンスフィルターの使い方について pico 08/12/14(日) 13:29 質問[未読]
【59514】Re:アドバンスフィルターの使い方について kanabun 08/12/15(月) 8:33 発言[未読]
【59539】Re:アドバンスフィルターの使い方について フィルター 08/12/17(水) 17:32 お礼[未読]
【59541】Re:アドバンスフィルターの使い方について kanabun 08/12/17(水) 19:22 発言[未読]
【59542】Re:アドバンスフィルターの使い方について kanabun 08/12/17(水) 19:38 発言[未読]
【59553】Re:アドバンスフィルターの使い方について フィルター 08/12/18(木) 14:17 質問[未読]
【59556】Re:アドバンスフィルターの使い方について kanabun 08/12/18(木) 16:13 発言[未読]
【59557】Re:アドバンスフィルターの使い方について フィルター 08/12/18(木) 16:58 質問[未読]
【59558】Re:アドバンスフィルターの使い方について kanabun 08/12/18(木) 17:28 発言[未読]
【59561】Re:アドバンスフィルターの使い方について kanabun 08/12/18(木) 18:44 発言[未読]
【59562】Re:アドバンスフィルターの使い方について フィルター 08/12/18(木) 19:44 質問[未読]
【59565】Re:アドバンスフィルターの使い方について kanabun 08/12/18(木) 21:12 発言[未読]
【59742】Re:アドバンスフィルターの使い方について フィルター 09/1/6(火) 16:15 お礼[未読]

【59463】アドバンスフィルターの使い方について
質問  フィルター  - 08/12/12(金) 10:41 -

引用なし
パスワード
   >▼kanabun さん:
>ご指導、ありがとうございます。
URL見て直しましたがうまく動作しませんでした。また、アドバンスフィルターと言う事でタイトル変更で再度質問いたします。
何度も質問、ご指導すいませんです。
最終的な条件は
列はF・L・R・X・AD・AJの6列で
2行目から500行まで検索対象データが入っています。
検索後リストボックスに表示するようにしています。
”構文”は・・
Private Sub CommandButton42_Click()
  Dim ss As String
  Dim fRange As Range
  Dim cRange As Range
  Dim CopyTo As Range
  Dim s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String
 
  ss = TextBox50.Text
  ss = "*" & ss & "*"
  With Worksheets("DATA")
    Set fRange = .Range("A1").CurrentRegion 'フィルタ範囲
    Set cRange = .Range("AO1") '抽出条件範囲先頭セル
    s1 = .Range("F1").Value   'F列見出し
    s2 = .Range("L1").Value   'L列見出し
    s3 = .Range("R1").Value   'R列見出し
    s4 = .Range("X1").Value   'X列見出し
    s5 = .Range("AD1").Value   'AD列見出し
    s6 = .Range("AJ1").Value   'AJ列見出し
  End With
  If WorksheetFunction.CountIf(fRange.Columns("F:L:R:X:AD:AJ"), ss) > 0 Then
     Set CopyTo = Worksheets("WAREA")
     CopyTo.Parent.UsedRange.ClearContents
     'cRange に抽出条件をセット
     cRange.CurrentRegion.ClearContents
     cRange(1, 1).Value = s1
     cRange(1, 2).Value = s2
     cRange(1, 3).Value = s3
     cRange(1, 4).Value = s4
     cRange(1, 5).Value = s5
     cRange(1, 6).Value = s6
     cRange(2, 1).Value = "'=" & ss
     cRange(3, 2).Value = "'=" & ss
     cRange(4, 3).Value = "'=" & ss
     cRange(5, 4).Value = "'=" & ss
     cRange(6, 5).Value = "'=" & ss
     cRange(7, 6).Value = "'=" & ss
    
     'フィルタオプションによる抽出コピーの実行
     fRange.AdvancedFilter xlFilterCopy, _
       CriteriaRange:=cRange.CurrentRegion, _
        CopyToRange:=CopyTo
  End If


With Worksheets("WAREA")
 IRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
End With

With ListBox1
.ColumnHeads = True
.ColumnCount = 11
.ColumnWidths = "30;80;55;60;60;60;65;45;45;45;25;"
'.Text = "DATA!A2:K500"
.RowSource = "WAREA!A2:K2500"

End With
End Sub
と書きましたが、実行すると、
実行時エラー13 型が一致しませんと表示され
If WorksheetFunction.CountIf(fRange.Columns("F:L:R:X:AD:AJ"), ss) > 0 Thenの部分が黄色くなります。

どの用に対処、修正すればいいでしょうか?重ね重ねすいません。
よろしくご指導お願いいたします。

【59464】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/12(金) 11:49 -

引用なし
パスワード
   ▼フィルター さん:

>と書きましたが、実行すると、
>実行時エラー13 型が一致しませんと表示され
>If WorksheetFunction.CountIf(fRange.Columns("F:L:R:X:AD:AJ"), ss) > 0 Thenの部分が黄色くなります。


その行の意味は "F,L,R,X,AD,AJ" 列に TextBox50の文字列が1つ以上あったら
以下を実行する、というIf文ですね?

で、複数列範囲の指定の仕方が構文エラーになっているわけですね?
AdvancedFilterで抽出の処理は、仮に1つも条件に合う行がなく
抽出されなくてもエラーになるわけではありません。

なので、、その部分を書かないでAdvancedFilter実行して、結果が
1行以上抽出されていたら、その後の処理をつづける、としたら
どうなりますか?

(確認ですが、"F,L,R,X,AD,AJ" 列から 検索する文字列は
 どの列も TextBox50.Text なんですよね? )

Private Sub CommandButton42_Click()
  Dim ss As String
  Dim fRange As Range 'フィルタ範囲(検索範囲 見出し行含む)
  Dim cRange As Range '抽出条件範囲(の先頭セル)
  Dim CopyTo As Range ' 抽出先(別シート)先頭セル

  ss = TextBox50.Text 'この文字列を検索する
  ss = "'=*" & ss & "*"
  With Worksheets("DATA")
    Set fRange = .Range("A1").CurrentRegion 'フィルタ範囲
    Set cRange = .Range("AO1")    '抽出条件範囲先頭セル
  End With
  Set CopyTo = Worksheets("WAREA").Range("A1") 'ここへ抽出する
  CopyTo.Parent.UsedRange.ClearContents

'cRange に抽出条件をセット
  cRange.CurrentRegion.ClearContents
  cRange(1, 1).Value = .Range("F1").Value   'F列見出し
  cRange(1, 2).Value = .Range("L1").Value   'L列見出し
  cRange(1, 3).Value = .Range("R1").Value   'R列見出し
  cRange(1, 4).Value = .Range("X1").Value   'X列見出し
  cRange(1, 5).Value = .Range("AD1").Value   'AD列見出し
  cRange(1, 6).Value = .Range("AJ1").Value   'AJ列見出し
  cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss

'フィルタオプションによる別シートへ抽出の実行
  fRange.AdvancedFilter xlFilterCopy, _
    CriteriaRange:=cRange.CurrentRegion, _
     CopyToRange:=CopyTo
  
'データが1行も抽出されていなければ、Exitする
  Dim ListRange As Range
  With CopyTo.CurrentRegion '抽出データ範囲から
    On Error Resume Next '↓   見出しを除く
    Set ListRange = Intersect(.Cells, .Offset(1))
    On Error GoTo 0
    If ListRange Is Nothing Then Exit Sub
  End With
  
'抽出データをリストボックスにセット
  With ListBox1
    .ColumnHeads = True
    .ColumnCount = ListRange.Columns.Count
    .ColumnWidths = "30;80;55;60;60;60;65;45;45;45;25"
    .RowSource = ListRange.Address(External:=True)
  End With
End Sub

'動作未確認なので 不具合出るかも?
'抽出処理を間違えてたらごめんなさい。

【59469】Re:アドバンスフィルターの使い方について
質問  フィルター  - 08/12/12(金) 15:12 -

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

ご指導ありがとうございます。
早々試験しました。
Textbox50に文字を入れてあいまい検索します。(*ワイルドカード付けて)
エラーが
コンパイルエラー
参照が不正または不完全です

Private Sub CommandButton42_Click()が黄色になり

.Rangeが青い色でした、何度も申し訳ありませんが、ご指導お願いいたします。


>▼フィルター さん:
>
>>と書きましたが、実行すると、
>>実行時エラー13 型が一致しませんと表示され
>>If WorksheetFunction.CountIf(fRange.Columns("F:L:R:X:AD:AJ"), ss) > 0 Thenの部分が黄色くなります。
>
>
>その行の意味は "F,L,R,X,AD,AJ" 列に TextBox50の文字列が1つ以上あったら
>以下を実行する、というIf文ですね?
>
>で、複数列範囲の指定の仕方が構文エラーになっているわけですね?
>AdvancedFilterで抽出の処理は、仮に1つも条件に合う行がなく
>抽出されなくてもエラーになるわけではありません。
>
>なので、、その部分を書かないでAdvancedFilter実行して、結果が
>1行以上抽出されていたら、その後の処理をつづける、としたら
>どうなりますか?
>
>(確認ですが、"F,L,R,X,AD,AJ" 列から 検索する文字列は
> どの列も TextBox50.Text なんですよね? )
>
>Private Sub CommandButton42_Click()
>  Dim ss As String
>  Dim fRange As Range 'フィルタ範囲(検索範囲 見出し行含む)
>  Dim cRange As Range '抽出条件範囲(の先頭セル)
>  Dim CopyTo As Range ' 抽出先(別シート)先頭セル
>
>  ss = TextBox50.Text 'この文字列を検索する
>  ss = "'=*" & ss & "*"
>  With Worksheets("DATA")
>    Set fRange = .Range("A1").CurrentRegion 'フィルタ範囲
>    Set cRange = .Range("AO1")    '抽出条件範囲先頭セル
>  End With
>  Set CopyTo = Worksheets("WAREA").Range("A1") 'ここへ抽出する
>  CopyTo.Parent.UsedRange.ClearContents
>
> 'cRange に抽出条件をセット
>  cRange.CurrentRegion.ClearContents
>  cRange(1, 1).Value = .Range("F1").Value   'F列見出し
>  cRange(1, 2).Value = .Range("L1").Value   'L列見出し
>  cRange(1, 3).Value = .Range("R1").Value   'R列見出し
>  cRange(1, 4).Value = .Range("X1").Value   'X列見出し
>  cRange(1, 5).Value = .Range("AD1").Value   'AD列見出し
>  cRange(1, 6).Value = .Range("AJ1").Value   'AJ列見出し
>  cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
>
> 'フィルタオプションによる別シートへ抽出の実行
>  fRange.AdvancedFilter xlFilterCopy, _
>    CriteriaRange:=cRange.CurrentRegion, _
>     CopyToRange:=CopyTo
>  
> 'データが1行も抽出されていなければ、Exitする
>  Dim ListRange As Range
>  With CopyTo.CurrentRegion '抽出データ範囲から
>    On Error Resume Next '↓   見出しを除く
>    Set ListRange = Intersect(.Cells, .Offset(1))
>    On Error GoTo 0
>    If ListRange Is Nothing Then Exit Sub
>  End With
>  
> '抽出データをリストボックスにセット
>  With ListBox1
>    .ColumnHeads = True
>    .ColumnCount = ListRange.Columns.Count
>    .ColumnWidths = "30;80;55;60;60;60;65;45;45;45;25"
>    .RowSource = ListRange.Address(External:=True)
>  End With
>End Sub
>
>'動作未確認なので 不具合出るかも?
>'抽出処理を間違えてたらごめんなさい。

【59473】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/12(金) 15:43 -

引用なし
パスワード
   ▼フィルター さん:

>エラーが
>コンパイルエラー
>参照が不正または不完全です
>
>Private Sub CommandButton42_Click()が黄色になり
>
>.Rangeが青い色でした、

なぜだか、わかりますか?
。。。。。。。。。。。。。。。。

> .Range
と、Rangeのまえにピリオド(.)が付いていますね?
これは、それ以前に With句を使って 親であるシートを指定していて、
>  With Worksheets("DATA")
.Range の (.)は With句で宣言された Worksheets("DATA") が(.)の前につく
ことを意味しているのに、
修正後の構文では .Range の前に With 句が宣言されていないからです。
 
それらの .Range を
 With Worksheets("DATA")
   :
 End With
ブロックの中に移動してください。。。

>>  With Worksheets("DATA")
>>    Set fRange = .Range("A1").CurrentRegion 'フィルタ範囲
>>    Set cRange = .Range("AO1")    '抽出条件範囲先頭セル
>>    'cRange に抽出条件をセット
>>    cRange.CurrentRegion.ClearContents
>>    cRange(1, 1).Value = .Range("F1").Value   'F列見出し
>>    cRange(1, 2).Value = .Range("L1").Value   'L列見出し
>>    cRange(1, 3).Value = .Range("R1").Value   'R列見出し
>>    cRange(1, 4).Value = .Range("X1").Value   'X列見出し
>>    cRange(1, 5).Value = .Range("AD1").Value   'AD列見出し
>>    cRange(1, 6).Value = .Range("AJ1").Value   'AJ列見出し
>>    cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
>>  End With
>>  Set CopyTo = Worksheets("WAREA").Range("A1") 'ここへ抽出する
>>  CopyTo.Parent.UsedRange.ClearContents
>>
>>
>> 'フィルタオプションによる別シートへ抽出の実行

【59474】Re:アドバンスフィルターの使い方について
お礼  フィルター  - 08/12/12(金) 16:00 -

引用なし
パスワード
   ▼kanabun さん:
早々のご指導ありがとうございます。
これより試してみますので、またうまく動作しないようでしたら
質問いたします。
どうもありがとうございます。
>▼フィルター さん:
>
>>エラーが
>>コンパイルエラー
>>参照が不正または不完全です
>>
>>Private Sub CommandButton42_Click()が黄色になり
>>
>>.Rangeが青い色でした、
>
>なぜだか、わかりますか?
>。。。。。。。。。。。。。。。。
>
>> .Range
>と、Rangeのまえにピリオド(.)が付いていますね?
>これは、それ以前に With句を使って 親であるシートを指定していて、
>>  With Worksheets("DATA")
>.Range の (.)は With句で宣言された Worksheets("DATA") が(.)の前につく
>ことを意味しているのに、
>修正後の構文では .Range の前に With 句が宣言されていないからです。
> 
>それらの .Range を
> With Worksheets("DATA")
>   :
> End With
>ブロックの中に移動してください。。。
>
>>>  With Worksheets("DATA")
>>>    Set fRange = .Range("A1").CurrentRegion 'フィルタ範囲
>>>    Set cRange = .Range("AO1")    '抽出条件範囲先頭セル
>>>    'cRange に抽出条件をセット
>>>    cRange.CurrentRegion.ClearContents
>>>    cRange(1, 1).Value = .Range("F1").Value   'F列見出し
>>>    cRange(1, 2).Value = .Range("L1").Value   'L列見出し
>>>    cRange(1, 3).Value = .Range("R1").Value   'R列見出し
>>>    cRange(1, 4).Value = .Range("X1").Value   'X列見出し
>>>    cRange(1, 5).Value = .Range("AD1").Value   'AD列見出し
>>>    cRange(1, 6).Value = .Range("AJ1").Value   'AJ列見出し
>>>    cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
>>>  End With
>>>  Set CopyTo = Worksheets("WAREA").Range("A1") 'ここへ抽出する
>>>  CopyTo.Parent.UsedRange.ClearContents
>>>
>>>
>>> 'フィルタオプションによる別シートへ抽出の実行

【59491】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/13(土) 10:35 -

引用なし
パスワード
   セル範囲の参照の仕方についての補足ですが、

たとえば
>   With Worksheets("DATA")
>     Set cRange = .Range("AA1")  '抽出条件範囲先頭セル
>     cRange(1, 1).Value = .Range("F1").Value 'F列見出し
>     cRange(1, 2).Value = .Range("L1").Value 'L列見出し
>     cRange(1, 3).Value = .Range("R1").Value 'R列見出し
>     cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
>   End With

と書いたとき、
  cRange(1, 1) という記述は
  cRange.Item(1, 1) を省略して書いたもので、
具体的には Range("AA1").Item(1,1) すなわち [AA1]セルそのもの
のことです。
同じように、
 cRange(1, 2) → Range("AA1").Item(1,2) → [AB1]
 cRange(1, 3) → Range("AA1").Item(1,3) → [AC1]
同じように、
 cRange(1, 0) → Range("AA1").Item(1,0) → [Z1]
 cRange(1, -1) → Range("AA1").Item(1,-1) → [Y1]
となります。

また、
    cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
は、複数セルを相対指定するときによく用いられる記法です。
このばあい、
 cRange.Range("A1") とは cRangeを起点とする"A1"番目の
 単一セル、すなわち cRange.Item(1, 1) と同じです。
 ↑の例では単一セルの指定でしたから、Rangeプロパティを使う
 メリットはどこにもありません。Itemプロパティと同じです。
 ↓あるセル(範囲)を基点として複数セル範囲を指定するとき、
  Rangeプロパティの効用が出てきます。
 Range("AA1").Range("A1:C1") → [AA1:AC1]
 Range("AA1").Range("A1,B2,C3") → [AA1,AB2,AC3]

>     cRange.Range("A2,B3,C4,D5,E6,F7").Value = ss
は、
  cRangeから見て、
  □
  ■
    ■
     ■
       ■
        ■
          ■

の不連続セルに、同一の値を代入しようとしているのがお分かりになるかと
思います。

【59492】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/13(土) 11:35 -

引用なし
パスワード
   こんにちは。

なんだかとんでもない勘違いをしているよな気がしてきました。。。

> 列はF・L・R・X・AD・AJの6列で
> 2行目から500行まで検索対象データが入っています。
> 検索後リストボックスに表示するようにしています。

「DATA」というシートの
F・L・R・X・AD・AJの6列 から、ある文字列が含まれている行を
別シート 「WAREA」 へ抽出すると、
現在のAdvancedFilterを使ったコードでは
元のシートの表がもつ列数だけ抽出転記されます。
元の表が A列から AJ列までだとすると、36列がそっくり別シート
に転記されることになります。

そのことと、ListBoxに表示する列が 11列(A列からK列)だけ
ということの関連が分かりません。

> With ListBox1
>  .ColumnHeads = True
>  .ColumnCount = 11
>  .ColumnWidths = "30;80;55;60;60;60;65;45;45;45;25;"

差支えなければ、元シートの1行目の見出し名を(差し障りのない
例に変えて)紹介いただけませんか?
なんだか
A〜F列
G〜L列
M〜R列
S〜X列
Y〜AD列
AE〜AJ列
6列づつ ブロックでデータが繰り返されて書き込んであり、
F列を検索したときは 抽出行の A〜F列を転記し、
L列を検索したときは 抽出行の G〜L列を転記し、
以下同様にして、
AJ列を検索したときは 抽出行の AE〜AJ列を別シートに行方向に
転記しておいて、これらをリストボックス6列にリスト表示したかったの
かな? とも思えてきましたので。。。

仮にもしそういうことだとすると、残念ながら、今の方法(複数列同時検索)
は使えないことになります。

【59504】Re:アドバンスフィルターの使い方について
質問  pico  - 08/12/14(日) 13:29 -

引用なし
パスワード
   ▼kanabun さん:
一応理解できました。
ただ、
'データが1行も抽出されていなければ、Exitする
  Dim ListRange As Range
  With CopyTo.CurrentRegion '抽出データ範囲から
    On Error Resume Next '↓   見出しを除く
    Set ListRange = Intersect(.Cells, .Offset(1))
    On Error GoTo 0
    If ListRange Is Nothing Then Exit Sub
  End With
下から2行目のコードのイメージは判りますが、このコードでListRangeは何を指すのでしょう?
いつもExitになり、コメントに変更すると動作が繋がりますが・・・・
最終行近くにもListRangeがあるので、どのように理解すると
よいのでしょう。

ListBox1への表示に色々な条件があるかも知れませんが
兎に角11列を先ず表示させれば、っと強引に
コードを書きました。こんな感じでしょうか?
Sheets("WAREA").Activate
Dim myVal As Variant
myVal = Sheets("WAREA"). _
  Range(Cells(1, 6), Cells(Rows.Count, 6).End(xlUp)).Resize(, 30).Value
  With UserForm1
     .ListBox1.ColumnCount = 11
     .ListBox1.ColumnWidths = "30;30;30;30;30;30;50;30;30;30;25"
     .ListBox1.List = myVal
  End With

【59514】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/15(月) 8:33 -

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

>'データが1行も抽出されていなければ、Exitする
>  Dim ListRange As Range
>  With CopyTo.CurrentRegion '抽出データ範囲から
>    On Error Resume Next '↓   見出しを除く
>    Set ListRange = Intersect(.Cells, .Offset(1))
>    On Error GoTo 0
>    If ListRange Is Nothing Then Exit Sub
>  End With
>下から2行目のコードのイメージは判りますが、このコードでListRangeは何を指すのでしょう?

ListRange は、
コメントに書いてあるとおり、
>  With CopyTo.CurrentRegion '抽出データ範囲から
一行目の見出しを除いた範囲を指しています。

>いつもExitになり、コメントに変更すると動作が繋がりますが・・・・

そうですか? 抽出データがあれば Exit は、しませんが。

>最終行近くにもListRangeがあるので、どのように理解すると
>よいのでしょう。

ListBoxのRowSourceプロパティに リスト範囲をセットするために
このようなことをしています。

'抽出データ範囲から
一行目の見出しを除いた範囲を セットすることによって、
リストボックスに見出しを表示することが可能になります。

【59539】Re:アドバンスフィルターの使い方について
お礼  フィルター  - 08/12/17(水) 17:32 -

引用なし
パスワード
   ▼kanabun さん:
遅くなってすいませんです。具体的には
A  B  C D  E  F  G  H   I   J  K  L・・・・
番号 日付 エリア 支店 エンド ID 種別1 種別2 種別3 種別4  エンド ID・・・・
・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
のような配置になっています。ここでE〜Jのパターンが繰り返されます。
この様なパターンでF、L、R、X、AD、、AJの列に格納しているIDをあいまい検索後、
行としてリストボックスに表示させています。なぜ4と言うとA〜Dまでのみ表示させ該当する行を選択後、詳細ボタンを押すことで各、テキストボックスに行のデータを表示させます。
やはりこの様なパターンは無理でしょうか・・・?
ご指導よろしくお願いします。

【59541】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/17(水) 19:22 -

引用なし
パスワード
   ▼フィルター さん:

こんばんは。

>▼kanabun さん:
>遅くなってすいませんです。具体的には
>A  B  C D  E  F  G  H   I   J  K  L・・・・
>番号 日付 エリア 支店 エンド ID 種別1 種別2 種別3 種別4  エンド ID・・・・
>・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
>・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
>・  ・ ・  ・ ・  ・ ・  ・  ・   ・  ・  ・
>のような配置になっています。ここでE〜Jのパターンが繰り返されます。
>この様なパターンでF、L、R、X、AD、、AJの列に格納しているIDをあいまい検索後、
>行としてリストボックスに表示させています。

やはりそういうことでしたか。。。

抽出列が増えた時点で、処理内容を一度確認すべきでした。。

そうなると、AdvancedFilterを使って同時検索抽出する方法では
無理がありますね?

前のスレッドのタイトルどおり、
「オートフィルターの繰り返し」になるような気がします。

Private Sub CommandButton110_Click()
 Dim ss As String
 Dim CopyTo As Range '抽出先
 Dim i As Long, j As Long
 
 ss = "*" & TextBox76.Value & "*"
 With Worksheets("WAREA")
   .UsedRange.ClearContents
   Set CopyTo = .Range("A1")
   j = -1
 End With
 Application.ScreenUpdating = False
 With Worksheets("DATA").Range("A1").CurrentRegion
   For i = 5 To 35 Step 6
     With .Columns(i).Resize(, 5)
       .AutoFilter 2, ss
       If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
        Intersect(.Cells, .Offset(1 + j)).Copy CopyTo
        Set CopyTo = CopyTo.End(xlDown).Offset(1)
        j = 0
       End If
       .AutoFilter
     End With
   Next
 End With
 Application.ScreenUpdating = True
 
 '「WAREA」シートに抽出された
>  エンド ID 種別1 種別2 種別3 種別4
 'をリストボックスのリストにセットする

End Sub

【59542】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/17(水) 19:38 -

引用なし
パスワード
   >▼フィルター さん:

ごめんなさい。次の転記先(CopyTo) を求める方法ですが、
一行しか抽出されなかった時はこれでは 次の転記先が シートの最終行に
行ってしまって、非常にまずかったですね。

>        Intersect(.Cells, .Offset(1 + j)).Copy CopyTo
>        Set CopyTo = CopyTo.End(xlDown).Offset(1)

>        Intersect(.Cells, .Offset(1 + j)).Copy CopyTo
        Set CopyTo = Worksheets("WAREA").Cells(Rows.Count,1) _
         .End(xlUp).Offset(1)
くらいにしておいて、
テストしてみてください。

【59553】Re:アドバンスフィルターの使い方について
質問  フィルター  - 08/12/18(木) 14:17 -

引用なし
パスワード
   ▼kanabun さん:
何度もすいませんです。
次の様にしました。Fは6列目なので5→6AJは36にしてみました。
Private Sub CommandButton42_Click()
 Dim ss As String
 Dim CopyTo As Range '抽出先
 Dim i As Long, j As Long

 ss = "*" & TextBox50.Value & "*"
 With Worksheets("WAREA")
   .UsedRange.ClearContents
   Set CopyTo = .Range("A1")
   j = -1
 End With
 Application.ScreenUpdating = False
 With Worksheets("DATA").Range("A1").CurrentRegion
   For i = 6 To 36 Step 6
     With .Columns(i).Resize(, 5)
       .AutoFilter 2, ss
       If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
        Intersect(.Cells, .Offset(1 + j)).Copy CopyTo
        Set CopyTo = Worksheets("WAREA").Cells(Rows.Count,1) _
         .End(xlUp).Offset(1)
        j = 0
       End If
       .AutoFilter
     End With
   Next
 End With
 Application.ScreenUpdating = True
'抽出データをリストボックスにセット
  With ListBox1
    .ColumnHeads = True
    .ColumnCount = 4
    .ColumnWidths = "25;55;40;60;"
End Sub
で動かしましたが、エラーは出ませんがやはりうまくフィルターされませんでした。
例として、F列(6列目)に入っているデータを検索しましたが、エラーは出ませんでしたが、フィルターされていませんでした。具体的には、F列三島と入っているデータが3行目に入っていますが、これをテキストボックスに*三島*と入れて検索すると、フィルターをうまく通れば3行目のみがリストボックスに表示されますが、その様に動作せず今入っている全データの行が表示されます。
何処が悪いのか分からないので、すいませんがご指導お願いします。

【59556】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/18(木) 16:13 -

引用なし
パスワード
   ▼フィルター さん:

こんにちは〜。

>次の様にしました。Fは6列目なので5→6AJは36にしてみました。

>例として、F列(6列目)に入っているデータを検索しましたが、
> エラーは出ませんでしたが、フィルターされていませんでした。
> 具体的には、F列三島と入っているデータが3行目に入っていますが、
> これをテキストボックスに*三島*と入れて検索すると、
> フィルターをうまく通れば3行目のみがリストボックスに表示されますが、
> その様に動作せず今入っている全データの行が表示されます。

それじゃだめです。
よく読んでみてください。

ぼくは こう書きました。
    ↓

> With Worksheets("DATA").Range("A1").CurrentRegion
>   For i = 5 To 35 Step 6
>     With .Columns(i).Resize(, 5)
>       .AutoFilter 2, ss

これは、
第5列〜第35列目まで 6列おきに、
 指定列から右に全5列の範囲に対して、
  指定範囲の「第2列目」の値が 文字列ss を含むものを抽出する

という命令です。
ですから、最初のフィルタ範囲は 第5列(E列)〜 第9列(I列)までが
最初のフィルタ範囲です。

   E  F ▼   G     H     I    J    K   L ・・・
  エンド ID   種別1   種別2  種別3  種別4

この列範囲の 「第2列目」「ID」列に対して、
言い換えれば、
E列〜I列範囲の 「第2列目」である F列から
> F列三島
> これをテキストボックスに*三島*
を検索するわけです。

※ やばい、
> With .Columns(i).Resize(, 5)
ここは、
 With .Columns(i).Resize(, 6)
でないと、全6列 でなかったですね。すみません。注意力散漫でした。

【59557】Re:アドバンスフィルターの使い方について
質問  フィルター  - 08/12/18(木) 16:58 -

引用なし
パスワード
   ▼kanabun さん:
早々、ありがとうございます。
修正し、実行しましたが、どうもうまくいきません。
現在、行で17行のデータが入っています。
先ほどの三島のデータは1行しか入っていません。
なぜか、1行のみ表示せず、そのままの17行全てが検索後に
表示されてしまいます。
どうすればよいでしょうか・・?
申し訳ありませんがご指導お願いします。

【59558】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/18(木) 17:28 -

引用なし
パスワード
   ▼フィルター さん:

>修正し、実行しましたが、どうもうまくいきません。
>現在、行で17行のデータが入っています。
>先ほどの三島のデータは1行しか入っていません。
>なぜか、1行のみ表示せず、そのままの17行全てが検索後に

あと、ちょっとだと思うんですけどね。。
試しててみてください。

(1)手動で、 E〜I列まで選択して、([E1:I17]が選択された状態で)
2列目(すなわち、F列)を オプションから 「三島」 「を含む」
で、オートフィルタかけるとどうなりますか?
(2)思い通りに1行だけ抽出されたら、
  (1) の操作をマクロ記録してみてください。
  どのように記録されましたか?
(3)マクロコードと これまでの「オートフィルタの繰り返し」マクロとで
  フィルタ条件の書き方に違いはないですか?
  *三島*
  '=*三島*
   ="*三島*"
  とか、Excelのバージョンによって違いがあって、汎用的なのは確か
 最後の書き方だったか? と思いますが、
 いずれにしても、「オートフィルタの繰り返し」マクロ の書き方が
 マクロ記録のとちがっていたら、記録の方に直してください。

(4)そのあとで、画面にワークシートとVBEコード画面の両方が見えるようにしておいて
 直したマクロをステップ実行(ステップイン)して コードを一行実行するごと
 に、ワークシート上の処理がどのように実行されているのか、チェックして
 みてください。

【59561】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/18(木) 18:44 -

引用なし
パスワード
   すみません。訂正です。

>(3)マクロコードと これまでの「オートフィルタの繰り返し」マクロとで
>  フィルタ条件の書き方に違いはないですか?
>  *三島*
>  '=*三島*
>   ="*三島*"
>  とか、Excelのバージョンによって違いがあって、汎用的なのは確か
> 最後の書き方だったか? と思いますが、

適当なこと言ってました。m(__)m
  〜を含む
は どのバージョンでも

"=*〜*"

と記録されました。

【59562】Re:アドバンスフィルターの使い方について
質問  フィルター  - 08/12/18(木) 19:44 -

引用なし
パスワード
   ▼kanabun さん:
>どうもありがとうございます。
ふと考えたのですが、F、L、R、X、AD、AJは数字のデータが入っています。
それ以外は漢字というか文字なので、逆にF〜AJと一気に指定して検索するのは
どうでしょうか・・・?
これなら、列を6本も指定しなくていいのかなと思うのですが
どうでしょうか・・?
よろしくご指導お願いします。

【59565】Re:アドバンスフィルターの使い方について
発言  kanabun  - 08/12/18(木) 21:12 -

引用なし
パスワード
   ▼フィルター さん:
>▼kanabun さん:
>>どうもありがとうございます。
>ふと考えたのですが、F、L、R、X、AD、AJは数字のデータが入っています。
>それ以外は漢字というか文字なので、逆にF〜AJと一気に指定して検索するのは
>どうでしょうか・・・?
>これなら、列を6本も指定しなくていいのかなと思うのですが
>どうでしょうか・・?

どうでしょうかね?
一度、手動操作でやってみたら いががですか?
たとえば、シートの表のF、L、R、X、AD、AJ列が 以下のようだったとして、
ここから、数値が 5 のものを抽出するとして、
リストボックスには どう表示されればいいのですか?

・・・ F ・・・ L・・・ R・・・ X・・・AD・・・AJ・・・
    1    3    5   9   12   15
    3    5    9   12   15    1
    5    9    12   15    1    3
    9    12   15   1    5   15
    2    4    6   10   13   16
    3    5    7   11   12   17
    4    6    8   9    5   18

あ、マクロで 数値を抽出するときは
 Criteria1:=">=5", xlAnd, Criteria2:="<=5"
のようにしないと、うまくいかないと思います。

【59742】Re:アドバンスフィルターの使い方について
お礼  フィルター  - 09/1/6(火) 16:15 -

引用なし
パスワード
   ▼kanabun さん:
大変返事が遅くなりすいませんでした。
最近の情勢で長期の休み期間であったためすいませんでした。
全体的にシステムの構築を再検討します。
お手数をおかけしてすいませんでした。
また、分からない所があれば質問させていただきますので
よろしくお願いします。

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