- ベストアンサー
ExcelVBA Filter関数について
- ExcelVBAのFilter関数について詳しく教えてください。
- Filter関数はobject、特にレンジobjectには使えないのでしょうか?使えない場合、同様の用途の他の関数はありますか?
- ExcelVBAのFilter関数についてご教示ください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ヘルプでは Filter(sourcesrray, match[, include[, compare]]) sourcearray 必ず指定します。検索先の 1 次元配列の文字列を指定します。 match 必ず指定します。検索する文字列を指定します。 include (True) の場合、配列の各要素の文字列の中で、match が含まれる配列のサブセットを返します。 (False) の場合、配列の各要素の文字列の中で、match が含まれない配列のサブセットを返します。 つまり、sourcesrrayは1次元配列です。rangeは直接利用できません。 例示頂いたコードでやりたい事が読み切れませんが、 近い処理としては以下でしょうか? Sub TEST() Dim ランゲ() As String Dim カウンターI As Long Dim 項目() As String Dim 項目数 As Integer カウンターI = 0 With Sheets("Sheet1") '1次元配列のサイズを決定 ReDim ランゲ(.Range("A1:A40").rows.Count) 'Rangeを1次元配列にコピー Dim i As Long For i = 1 To .Range("A1:A40").rows.Count ランゲ(i) = .Range("A1:A40").Cells(i, 1) Next Do カウンターI = カウンターI + 1 項目 = Filter(ランゲ, .Range("A1:A40").Cells(カウンターI, 1), False) 項目数 = UBound(項目) Debug.Print "行="; カウンターI; ",項目数="; 項目数 Loop Until 項目数 = -1 End With End Sub .Range("A1:J40")の場合は2次元配列になるので そのままでは利用できませし、sourcearray が1次元であれば、戻り値も1次元の配列になります。 ヘルプでは、 引数 sourcearray 内で引数 match に一致する文字列がなかった場合は、Filter 関数は空の配列を返します。 引数 sourcearray が Null 値であるか、1 次元配列でない場合は、エラーになります。 Range.AutoFilter を使う場合は以下 Option Explicit Option Base 1 Public Sub TestFilter() 'CellのFilterを利用する場合 Dim rng As Range Dim ランゲ() As String Dim cnt As Long Dim row As Long Set rng = ActiveSheet.Range("A1:J41") row = 1 '2行目からFilter Do row = row + 1 'A列の1行目の値から順にFilterを設定する Dim match As String match = rng.Cells(row, 1).Value rng.AutoFilter Field:=1, Criteria1:=match 'Filterの対象Cellを取得 cnt = 0 Dim i As Integer For i = 2 To rng.rows.Count If rng.rows(i).Height > 0 And _ rng.Cells(i, 1) <> Empty Then 'Filterで選択されてる場合 '空白Cellは除く cnt = cnt + 1 ReDim ランゲ(cnt) ランゲ(cnt) = rng.Cells(i, 1) End If Next '結果の確認 Debug.Print "行="; row; ",項目数="; UBound(ランゲ) Loop Until cnt = 0 End Sub 例示のコードが読み切れないのでやりたい事と相違する可能性があります。 意図しない回答であれば、スルーでお願いします。
お礼
有り難うございます。
補足
失礼しました、 誤記があります。 With文の直下 ランゲに値を入れているところですが、 入れる値が.VALUEになってますが間違いです。 これにともない 行頭にSET文を追加してお読みくだされば幸いです。 済みません、 あと、説明も不足ですよね 例文は目録を作る目的のものです。 で、前提として レンジ範囲の全てに 何らか、任意の文字列が入っていて、 これらは全くバラバラな訳ではない。 と、します。 (※注:カレントレギオンなどで 範囲内、空セルなしにできますね。) この時、 何種類あるかは、解らない訳ですが 少なくとも、1つデータが入っていれば それが1つ目の種類を形成するので、 読み替えると「空データがない」 と、なる前提より、 最初に読めるデータは、必ず1種類の種目に含まれる と、断定できます。 そこでこれを「第1種類目」とし、 同種のものをFilterで削除 この事により、 オブジェクトが空になってない限り 「更に種類が含まれる」 と、言うことなので、 再度行う。 と、こう言う考えで書いたものです。 幾段ものふしだらをお詫びします。