1

オンラインとここで検索しましたが、法案に適合し、機能していると思われるものが見つかりません。動作するコードがいくつかありますが、行を削除すると範囲の長さが変わるため、削除するすべての行をキャッチできないため、何度か実行することになります。これは素晴らしいことではありません...だから私はmこのスレッドで推奨されているように、オートフィルターアプローチを試しています。

いくつかの列があるスプレッドシートがあり、そのうちの1つは「コスト」です。'cost'列(列9、場合によっては10、したがって下の' find'ビット)を調べて、コストが0である行を削除する必要があります。

以下は私がこれまでに書いたコードです、どんな助けでも非常に、非常にありがたいです!!!!

--編集3:さらにいくつかのコード変更が行われました...新しいコードは以下のとおりです。

Sub RemoveRows()
    Dim cell As Range
    Dim lastRow As Long
    Dim lastColumn As Integer
    Dim criteraColumn As Integer
    Dim criteriaRange As Range

    lastRow = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
    lastColumn = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    Rows(1).EntireRow.Select
    criteriaColumn = Selection.Find(What:="Cost", After:=ActiveCell, LookIn:= _
                        xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
                        xlNext, MatchCase:=False, SearchFormat:=False).Column
    Set criteriaRange = Range("A1", Cells(lastRow, lastColumn))

    criteriaRange.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00"
    AutoFilter.Range.Delete
    ActiveSheet.AutoFilterMode = False
End Sub

これを実行すると、正しい範囲と正しい列にフィルターが適用されます。次に、その行に適用される「ランタイムエラー '424':オブジェクトが必要です」というエラーメッセージが表示されますAutoFilter.Range.Delete。これで「end」または「debug」を押してスプレッドシートを見ると、フィルターが正しい列に適用され、正しいオプション(£0.00)がチェックされていますが、結果は返されません(実行する必要があることはわかっています)将来この状況が発生した場合のエラー処理がいくつかありますが、現時点では、このフィルターによって少なくとも10行が返されるはずです)。スプレッドシートのフィルター設定で手動で[OK]を押すと(変更せずに!)、10個の結果が正しく表示されるので、プログラムでこれを行ったときになぜ表示されないのかわかりません。

必要に応じてスプレッドシートの例を提供してください、これは本当に私を混乱させます!!

スプレッドシートはここにあります

4

4 に答える 4

5

Excelオートフィルターを使用して行を削除できるはずです。

Cells.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00"
ActiveSheet.AutoFilter.Range.Offset(1).Delete
ActiveSheet.ShowAllData

これにより、cost = 0でフィルタリングされ、フィルターに一致するすべての行が削除されます。

演算子は自動的に等しいので、パラメータとして「=£0.00」は必要ありません。

ActiveSheet for AutoFilterに追加して、見つからないオブジェクトを削除しました。オフセットを使用すると、ヘッダーが削除されません。

于 2012-07-19T13:55:06.017 に答える
2

パフォーマンス上の理由から、別の方法でそれを行います(行ごとの読み取りと削除は遅い)。以前にも同様の質問に答えましたが、あなたの投稿にも当てはまると思います。

私があなたにできることを提案します:

  • シートを1行ずつ読み取る代わりに、範囲全体を1回配列にロードします。
  • 行ごとに削除する代わりに、必要な値をメモリ内の2番目の配列に転送します。
  • 必要なデータが揃ったら、oRange.clearcontentsを適用して現在の範囲をクリアします。
  • oRange = vArrayを適用して、データの新しい配列をシートに表示します。

データの読み取り/変換はメモリ内で実行され、読み取りと書き込みは1回だけ実行されます。

このスレッドには、私が以前に書いたコードがあります 。VBAコードの実行は、何度も繰り返すと遅くなります。

これがあなたを助けることができるかどうか、またはあなたがより具体的な情報/コードを受け取りたいかどうか私に知らせてください。

于 2012-07-19T13:50:56.817 に答える
1

Excelでは、行を削除するとデフォルトで行が自動的に1つ上に移動するため、実行する必要があるのは範囲を逆方向に移動することです。

交換:

   For Each cell In criteriaRange.Cells
        If cell.Value = 0 Then
            cell.EntireRow.Delete
        End If
    Next cell

と:

Dim i As Integer

For i = criteriaRange.Rows.Count To 1 Step -1
    If criteriaRange.Cells(i) = 0 Then
        criteriaRange.Cells(i).EntireRow.Delete
    End If
Next

また、ScreenUpdatingマクロのメソッドには影響しません。基本的に、マクロが実行するすべてのアクションで「画面のちらつき」をオフにし、ユーザーエクスペリエンスのためにマクロをより高速かつスムーズに実行できるようにします。

于 2012-07-19T13:50:36.453 に答える
0

行を削除するたびに、列の先頭に戻るか、カウントから1を引くことができるようにすることができます。いずれにせよ、行をスキップすることはありません。実際のコードを提供しますが、VBAを初めて使用するため、その方法がよくわかりません。

于 2012-07-19T13:44:46.393 に答える