Excel VBA質問箱 IV

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

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


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

【78535】AutoFilterによる 配列を使ったあいまい抽出 めがめが 16/11/1(火) 18:03 質問[未読]
【78536】Re:AutoFilterによる 配列を使ったあいま... マナ 16/11/1(火) 20:37 発言[未読]
【78541】Re:AutoFilterによる 配列を使ったあいま... めがめが 16/11/2(水) 16:53 質問[未読]
【78542】Re:AutoFilterによる 配列を使ったあいま... β 16/11/2(水) 17:05 発言[未読]
【78543】Re:AutoFilterによる 配列を使ったあいま... β 16/11/2(水) 17:08 発言[未読]
【78544】Re:AutoFilterによる 配列を使ったあいま... めがめが 16/11/2(水) 17:29 発言[未読]

【78535】AutoFilterによる 配列を使ったあいまい...
質問  めがめが  - 16/11/1(火) 18:03 -

引用なし
パスワード
   はじめまして。めがめがといいます。
よろしくお願いします。

漫画シートと抽出シートがあり、
抽出シート
    E列    F列    J1=3  
1行目 タイトル タイトル
2行目 *あ*    あ
3行目 *い*    い
4行目 *う*    う
J1は、抽出シートに直接関数を入れて、タイトルを除くタイトルの個数を
CONTA関数で取得し表示しています。
F列にタイトルの一部を入力し、VBAで、抽出する際に、
E列に*を前後につけた物を転機し、それらを配列に格納し、
その配列を使用して、
漫画シートを、あいまい検索をかけています。
配列を使用しているのは、この検索をした後にまた別のマクロを
実行する場合があり、Criteria1をどうしても使用したいからです。
CriteriaRangeで、E列の抽出タイトルの部分を選択して、抽出すると、
オートフィルターの矢印がつかないので、
その後、さらに、他のマクロで、再度別条件で絞り込んいく事ができません。
その為、Criteria1の方を使用しています。ただ、この配列による抽出は、
完全一致などだとうまくいくんですが、
上記のような、あいまい検索の場合、2件までしか正常に作動しません。
*あ*
*い*
まででしたら、それらを配列に格納して、抽出できますが、
*あ*
*い*
*う*
になると、結果は0件で、漫画シートには何も表示されません。
どうしたら、Criteria1の配列を使用した検索で、3件以上のあいまい検索ができますか?または、CriteriaRangeを使用して絞り込んだデータを一旦、目視して、必要な時、別のマクロで別条件でさらに絞り込む事は可能ですか?可能でしたら、
わざわざ、Criteria1の配列による検索などしないのですが。
コードはこういうのを書いています。

Sub 漫画タイトル抽出2()

'一旦 フィルター解除
  If Worksheets("漫画").FilterMode = True Then
   Worksheets("漫画").ShowAllData
  End If
  
 Sheets("抽出").Select
 
'抽出シート 以前のタイトル 事前に一旦クリア

 With Cells(50000, 5)
  '最終行の1つ下の行を取得。これを、最終行のみ取得すると、タイトル列に何も入力されてない場合に、見出しのE1まで消えてしまう。その為.Offset(1,0)が必要
  Worksheets("抽出").Range("E2:E" & .Cells(.Cells.Rows.Count, 1).End(xlUp).Row).Offset(1, 0).ClearContents 'ClearContents 値のみクリア

 End With
'あいまい検索の為に、作業列に*つけてタイトル結合
  Dim endRow_F As Long

endRow_F = Cells(Rows.Count, "F").End(xlUp).Row

For i = 2 To endRow_F
 
    Cells(i, "E").Value = "*" + Cells(i, "F").Value + "*"
Next i

'検索 抽出

Dim cnt_code As Integer
  
Sheets("抽出").Select
'エクセルのJ1に設定してあるコードのカウント数を取得
   cnt_code = Range("J1").Value - 1
  
     Dim code() As String
     Dim fRng As Range
'動的配列の個数をここで設定
 
  If cnt_code >= 0 Then
   ReDim code(cnt_code)
   End If
  
   
   For i = 0 To cnt_code '抽出isbn
         code(i) = Range("E2").Offset(i, 0).Value '*タイトル 配列に格納
   MsgBox "code" & i & "=" & code(i)
   Next i
 
Sheets("漫画").Select
 
If cnt_code >= 0 Then
  Range("A1:L1").AutoFilter field:=12, Criteria1:=code, Operator:=xlFilterValues
End If
End Sub

【78536】Re:AutoFilterによる 配列を使ったあい...
発言  マナ  - 16/11/1(火) 20:37 -

引用なし
パスワード
   ▼めがめが さん:
フィルターオプション(詳細設定)を使いましょう。
使ったことがないなら、まずは手作業で可能かどうか確認してみるとよいです。

【78541】Re:AutoFilterによる 配列を使ったあい...
質問  めがめが  - 16/11/2(水) 16:53 -

引用なし
パスワード
   ▼マナ さん:
>▼めがめが さん:
>フィルターオプション(詳細設定)を使いましょう。
>使ったことがないなら、まずは手作業で可能かどうか確認してみるとよいです。
ご回答ありがとうございます。

フィルターオプションというのは、
VBAを使用しないで、
エクセルにそなわっているフィルターオプションですか?
それとも、AdvancedFilterの事ですか?

ですが、このAdvancedFilterは、CriteriaRangeによる指定しかできず、
あいまい検索を配列格納しての抽出ができません。
CriteriaRangeで指定する範囲の検索キーに、「*あ*」などと検索キーを入力して3つ以上検索はできます。が、それは、最初の質問でも書きましたが、
AutoFilter fieldのCriteriaRangeを使用した場合も同様にできます。

ただ、
AdvancedFilterにしろ、AutoFilterにしろ、CriteriaRangeを使用して検索をすると、
その抽出された結果を自分で確認し、

再度、他のマクロの別条件でさらに、絞り込みをかけると、一旦フィルターが解除されてしまい、絞り込みができません。

VBAの仕様上なのか、どういうわけか、AutoFilterのCriteria1による抽出の場合、抽出された結果を再度別条件でさらに絞り込みができます。

ですが、最初の質問でも書きましたが、AutoFilterのCriteria1の場合
あいまいなキー「*あ*」「*い*」と2つまでならできますが、
「*あ*」「*い*」「*う*」と3つになるとできません。
抽出結果が0件で、フィルターの矢印しかでなくなります。

【78542】Re:AutoFilterによる 配列を使ったあい...
発言  β  - 16/11/2(水) 17:05 -

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


>フィルターオプションというのは、
>VBAを使用しないで、
>エクセルにそなわっているフィルターオプションですか?
>それとも、AdvancedFilterの事ですか?
>

両方ともフィルターオプションです。
VBAで実行する場合は AdvancedFilterというメソッドになるだけです。

オートフィルターも、VBAで実行する場合は AutoFilterメソッドになりますよね。

フィルターオプションは、名前の通り Advanced です。
オートフィルターより、さらにきめの細かなAndやOrの抽出条件設定ができますし
必要列のみ抜出ということも、いとも簡単にできますし、
最初から別シートに抜き出すことも、いとも簡単にできます。

【78543】Re:AutoFilterによる 配列を使ったあい...
発言  β  - 16/11/2(水) 17:08 -

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

>ですが、このAdvancedFilterは、CriteriaRangeによる指定しかできず、
>あいまい検索を配列格納しての抽出ができません。

はい。配列化したものに限らず、

オートフィルターは検索条件をコード上で規定する。
フィルターオプションは検索条件欄に記載してそれを指定する。

という仕様ですから。
配列内にある検索条件を検索欄に落とし込んで実行すればいいだけのことです。

【78544】Re:AutoFilterによる 配列を使ったあい...
発言  めがめが  - 16/11/2(水) 17:29 -

引用なし
パスワード
   tree=75645
に、フィルターオプションを使用した方法の回答がありました。
試しましたが、やはり、フィルターオプションでは、
さらに、絞り込みができません。

また別サイトに、
完全一致なら、xlFilterValues で、いくつでも配列指定ができますが、含まない や ワイルドカードには3つ以上対応していませんというような記述がありました。やはり、VBAの仕様上無理のようです。

絞り込んだデータを、別シートにコピー貼り付けして、それをさらに絞り込みなどして、必要なデータを抽出したいと思います。ありがとうございました。

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