0

列の値に基づいて一部のセルをフィルターで除外しようとしていますが、filtermodeをfalseに設定してフィルターの設定を解除しようとしていますが、最初のフィルターアクションが残りのセルを汚染するのではないかと心配しています。

私のselectメソッドは次のようになります。

Function GetRowRange(sheetRange, column, value) As Range
'check for a valid section column
sheetRange.AutoFilterMode = False
sheetRange.UsedRange.AutoFilter Field:=column, Criteria1:=value
Set GetRowRange = sheetRange.UsedRange.SpecialCells(xlCellTypeVisible)
MsgBox ("col:" & column & " val: " & value & " rows:" & GetRowRange.Rows.Count)
sheetRange.AutoFilterMode = False
End Function

そして、msgboxから、最初の行だけが行を返すことがわかります

4

1 に答える 1

3

これはかなり厄介な問題です!:-)

問題は、オートフィルターとを適用した後.SpecialCells(xlCellTypeVisible)、新しいRangeオブジェクトが複数の結合された範囲で構成されていることです。

たとえば、このテーブルをフィルタリングする場合Bここに画像の説明を入力してください

範囲オブジェクトには、それぞれ1x2セルの3つの領域があります。奇妙な理由で、Rows.Countこれらの領域を考慮に入れていないため、 Selection.Rows.Count1は3である必要があります。ただし、Rows列挙をループすると、期待どおりに機能します。

lngCount = 0
For Each r In Selection.Rows
    lngCount = lngCount + 1
Next

これは3を返します。

したがってGetRowRange、正しい範囲が返されますが、.Rows.Countルーチンは間違った結果をもたらします。代わりにこの関数を使用してください:

Function RowCount(rngAreas As Range) As Long
    Dim lngCount As Long
    Dim rng As Range
    For Each rng In rngAreas.Areas
        lngCount = lngCount + rng.Rows.Count
    Next
    RowCount = lngCount
End Function

補足:GetRowRangeテーブルの最初のヘッダー行も常に返されることに注意してください。それに応じてこれを処理してください。

于 2013-02-26T10:05:58.687 に答える