Thanks to both Tom and visdev1.
Tom, I implemented yours and it works well. It taught me "Union" and "Is Nothing." I just made one small change so if the range is not empty, the deletion runs.
For those interested in a snippet, here's the revised code to "Delete all rows except the Nth one":
Sub proDeleteRows()
'Note that the variables used to determine "varNthKeep" are designed for numerical simulation in this example, but varNthKeep could be assigned whatever way works best for your application.
Application.StatusBar = "Now Deleting Rows."
Dim varRecordInterval As Double 'Interval to Keep data (i.e. every 5 seconds)
Dim varTimeStep As Double 'Timestep used in the simulation
Dim varLastRow As Integer
varLastRow = 'Assign this somehow.
Dim varNthKeep As Integer 'Variable to store the "row keeping" interval
varNthKeep = varRecordInterval / varTimeStep ' Calculates N
Dim varNthCounter As Integer ' Counter used in For Loop
varNthCounter = 1
Dim varDeleteRange As Range
'Select the last row of the simulation and temporarily paste its values
'into row 3 so this last row is not lost during the deletion.
Rows(varLastRow).Select
Selection.Copy
Rows(3).Select
Selection.PasteSpecial Paste:=xlPasteValues
Dim i As Integer 'Counter for the FOR Loop, initialized at 6 (the first non-zero data row)
i = 6
Dim k As Integer 'Counts number of data rows remaining after deletion
k = 0
For i = 6 To varLastRow 'Loop from row 6 (first non-zero entry) to where the data should end, plus a buffer to handle any remainder from the division.
If varNthCounter <> varNthKeep Then ' Check to see if the counter is on N
'If not, then this is a row to delete.
If varDeleteRange Is Nothing Then 'If the range is still empty (first i row)
Set varDeleteRange = Rows(i) 'Give the range a value
Else
Set varDeleteRange = Union(varDeleteRange, Rows(i)) 'Add this row to the range
End If
varNthCounter = varNthCounter + 1 'Increment the NthCounter
ElseIf varNthCounter = varNthKeep And Cells(k + 1, 1) <> "" Then 'If it is on an N row and this is not the last row:
k = k + 1 'Don't mark for deletion, just increment the "number of data rows still left after deletion" counter
varNthCounter = 1 'Reset the N counter, and allow the loop to go to the next row.
End If
Next
If Not varDeleteRange Is Nothing Then
varDeleteRange.Delete
End If
'Paste that original last data row onto the end of the new data.
Rows(3).Select
Selection.Cut
Rows(k + 6).Select
ActiveSheet.Paste
End Sub
visdev, your method also looks like it would work if looped properly, and Union was used like in Tom's code. The trick is skipping every Nth row in the deletion. I especially like using String as opposed to Range. (Range variables look gigantic and confusing in the watch window.)
Thanks again!
Bookmarks