1

スプレッドシートで列「I」を通過し、今から90日以内に有効期限がないすべての行を削除する方程式を実行しようとしています...つまり、スプレッドシートを次のようにフォーマットしようとしています今後 90 日以内に有効期限が切れるすべてのリストを教えてください。星を置いた行は、方程式を挿入するのが難しい場所です。数式を挿入する方法がわかりませんが、セル自体で実行された場合、次のようになります =IF(AND(I11-900),1,0)=1. Q11 をどのように変更すれば、式を実行すると、I 11 だけでなく I 列のすべてのセルに適用されるようになります。

Sub DeleteNow()


Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow As Long
Dim CalcMode As Long
Dim ViewMode As Long


With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With

With Sheets("Copy")
    .Select
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    .DisplayPageBreaks = False
    Firstrow = .UsedRange.Cells(1).Row
    Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row
    For Lrow = Lastrow To Firstrow Step -1
        With .Cells(Lrow, "I")

            If Not IsError(.Value) Then

                If ******************** Then .EntireRow.Delete

            End If

        End With

    Next Lrow


End With

ActiveWindow.View = ViewMode
With Application
    .ScreenUpdating = True
    .Calculation = CalcMode
End With

End Sub
4

3 に答える 3

3

現時点では XL を持っていないので、構文エラーが発生する可能性がありますが、これは非常に簡単で、理解と更新が非常に簡単なはずです。私はコードのコアを構築しただけで、すべてのApplicationレベルのものを省略していることに注意してください。

With Sheets("Copy")

    '.Select -> no need to select anything, you can work right with the object
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    .DisplayPageBreaks = False

    Dim myCol as Integer
    myCol = 9

    'the below assumes your data sets starts in column A and you want to filter on column I
    .UsedRange.AutoFilter myCol, xlLast90Days 'this "xlLast90Days" is most likely not right, but if you do it manually while recording a macro, you will get the correct syntax

     Dim rngDelete as Range
     On Error Resume Next 'in case there are no visible cells
     Set rngDelete = Intersect(.UsedRange, .UsedRange.Offset(1), .Columns(myCol)).SpecialCells(xlCellTypeVisible) 'assumes first row of usedrange is header row

     'if there are values over 90 delete them
     If not rngDelete is Nothing Then rngDelete.EntireRow.Delete

End With
于 2012-12-18T20:52:16.297 に答える
2
Sub deleteRowsWithDateNotIn90Days()
Dim lastRow As Integer
Dim firstRow As Integer
Dim ctr As Integer

Dim currentCell As Range
Dim valueOfIColumn
Dim isWithin90Days As Boolean

lastRow = 17
firstRow = 1

Application.ScreenUpdating = False
With Sheets("Copy")
    For ctr = lastRow To firstRow Step -1
        Set currentCell = .Cells(ctr, 9)
        valueOfIColumn = currentCell.Value
        isWithin90Days = valueOfIColumn >= Date And valueOfIColumn <= (Date + 90)

        If Not isWithin90Days Then
            Debug.Print "deleting row of cell " + currentCell.Address
            currentCell.EntireRow.Delete
        End If
    Next
End With
Application.ScreenUpdating = True
End Sub

編集:始めるための基礎としてこれを使用してください。
マクロレコーダで生成された不要なコードを削除できます。

于 2012-12-18T18:55:32.503 に答える
0

あなたがやりたいことは、For Next ループを For Each ループに変更することだと思います。そうすれば、配列からすべての要素を取り出して変更し、元に戻すことができます。そのようです:

'Psuedo code for learing, won't work if used.
Dim gRange as Range 'Generic
Dim testRange as Range

Set testRange = Worksheets("This").Range("Test Column")

For Each gRange in testRange
    If(moreThan90Days)
        gRange.EntireRow.Delete
    End If
Next gRange

さらに詳しい説明が必要な場合は、For Next ループで簡単に Google 検索を行うと、おそらく探しているものが見つかるでしょう。

于 2012-12-18T18:50:56.713 に答える