3

これは別の奇妙なものです。

フィルタを使用して1つのシートからデータを取得し、Range.SpecialCells()コピーして貼り付ける適切な行を見つけるメソッドを使用しているこのコードがあります。ただし、Rows().SpecialCells()使用した場合、または行数によって返される範囲の行プロパティを使用した場合SpecialCellsは間違っています。これが私が意味することです:

With Worksheets("ret-" & sNumRet)
    .EnableAutoFilter = True
    .AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
    iLast = Range("C1").End(xlDown).Row
    numRows = .Range("B2:B" & iLast).SpecialCells(xlCellTypeVisible).Cells.Count
End With

このコードは、意味のある数である約8k行を生成します。

With Worksheets("ret-" & sNumRet)
    .EnableAutoFilter = True
    .AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
    iLast = Range("C1").End(xlDown).Row
    numRows = .Rows("2:" & iLast).SpecialCells(xlCellTypeVisible).Rows.Count
End With

結果として4をもたらします。

With Worksheets("ret-" & sNumRet)
    .EnableAutoFilter = True
    .AutoFilter.Range.AutoFilter Field:=3, Criteria1:=sSection
    iLast = Range("C1").End(xlDown).Row
    numRows = .Range("B2:B" & iLast).SpecialCells(xlCellTypeVisible).Rows.Count
End With

また、結果として4が得られます。もちろん、どちらも間違っています。45k行のデータがあり、フィルターを使用して少なくとも数千行が表示されていることがわかります。それらのステートメントの間に私が欠けている意味の違いはありますか?ここでの文脈では、それらはほぼ同等であると思います。

ありがとう !

4

1 に答える 1

6

SpecialCellsこれは、Excel が行をカウントする方法 とは関係ありません。カウントされている範囲内のRows.Count連続するそれぞれのカウントを返します。Areaたとえば、イミディエイト ウィンドウで次のように指定します。

? range("a2:a3,a5:a7").cells.Count

5 を返します

? range("2:3,5:7").rows.Count

2 を返します

? range("2:3,5:7").areas(1).rows.Count

2 を返します

? range("2:3,5:7").areas(2).rows.Count

3 を返します

ご覧のとおり、領域を指定しない場合、最初の領域が返されます。

すべての領域の回答を取得するには、それらをループします。

Sub CountRows()
Dim i As Long
Dim RowTotal As Long

With ActiveSheet.Range("2:3,5:7")
    For i = 1 To .Areas.Count
        RowTotal = RowTotal + .Areas(i).Rows.Count
    Next i
End With
Debug.Print RowTotal
End Sub
于 2012-11-15T15:59:05.010 に答える