0

50000行を超えるExcelシートを512回フィルタリングする必要があります。現在、次のコードを使用しています。

Do While Not IsEmpty(ActiveCell.value)

        Worksheets("Sheet1").Activate
        filtro = ActiveCell.value

        Sheets("Sheet2").Select
        Range("D1").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$I$" & lastRow("D")).AutoFilter Field:=4, Criteria1:=filtro

        Range("A1").Select

        Do While Not IsEmpty(ActiveCell.value)

            Do

                ActiveCell.offset(1, 0).Select
                oProgress.Increase 1

            Loop While ActiveCell.EntireRow.Hidden = True

                Call functio ' this function do something with the actual row

        Loop

    Loop

問題は、50000行X 512回の分析に非常に時間がかかることです!、行をフィルタリングして一時シートにコピーし、そこで値を確認する方がよいのではないかと考えていました。

Active行は関数readValuesによって処理されます

4

3 に答える 3

2

この質問に対する他のポスターのように、私はフィルタリング512時間について本当に懐疑的です!ただし、絶対に必要だと言うので、以下のコードを参照してください。それでもあなたのニーズに基づいてクリーンアップできると思いますが、より大きな範囲を見ずに言うのは難しいです。ただし、現在よりも効率的な場所に移動できるはずです。

私はすべての仮定にコメントしようとしましたが、さらに説明が必要な場合はご連絡ください。

Sub FilterAll512()

Dim wks1 As Worksheet
Set wks1 = Sheets(1)

Dim rng512 As Range, cel As Range
Set rng512 = wks1.Range("A1:A512") '-> say your filter values are in this range, adjust if needed

Dim wks2 As Worksheet
Set wks2 = Sheets(2)

For Each cel In rng512

    With wks2

        Dim rngFound As Range
        Set rngFound = .Columns(4).Find(cel.Text, LookIn:=xlWhole) ' -> make sure value is there to be filtered on

        If rngFound Then

                .UsedRange.AutoFilter 4, cel.Text '-> assumes upper left most cell is A1

                Dim rngSearch As Range, rngCel As Range
                '-> assumes upper left most cell is A1 and row 1 has headers
                Set rngSearch = Intersect(.UsedRange, .UsedRange.Offset(1), .Columns(4).EntireColumn).SpecialCells(xlCellTypeVisible)

                For Each rngCell In rngSearch

                    oProgress.Increase 1 '-> i don't know what this does, but it doesn't look very efficient, see notes below

                    Call functio

                Next

                '-> perhaps above you are just counting rows?
                    'if so, you can use rngSearch.Rows.Count to get a total count
                    'or you can use rngCell.Row to get the current row



        End If 'iF rngFound Then

    End With ' With wks2

Next 'For Each cel In rng512

Set rngCell = Nothing
Set rngSearch = Nothing
Set rngFound = Nothing
Set cel = Nothing
Set rng512 = Nothing
Set wks2 = Nothing
Set wk1 = Nothing

End Sub
于 2012-10-08T15:19:22.297 に答える
0

Excelにはフィルタリングツールが組み込まれています(ほとんどの人は、Excelの非常に基本的な機能として説明します)。また、500,000行をループする必要があったとしても、これはおそらく最悪(最も遅い)で最も奇妙な方法の1つです。

Do                 
    ActiveCell.offset(1, 0).Select 
Loop While ActiveCell.EntireRow.Hidden = True 

Range()。SortとRange()。AutoFilterを調べることができます。これらは正しい方法です。幸運を。

于 2012-10-08T14:16:11.247 に答える
-1

何ができるかという考えは、すべての行番号または行番号の範囲を計算してから、次のようなコードを適用することです。

rowNumbers = "1:3,10:10,30:50"
Range(rowNumbers).EntireRow.Hidden = True
于 2012-10-08T12:06:35.423 に答える