vote up 2 vote down star
1

I have an Excel spreadsheet with thousands of rows. I want to select every 7th row from that spreadsheet. (By "select," I mean delete all of the other rows, or copy the selected rows into a new worksheet.)

What's the easiest way to do that in Excel 2003?

See also: Select each nth row in Numbers

flag

Doesn't this question belong on SO? – Jim G. Nov 12 at 14:47
I don't think so. Some of the answers involve macros, but the question itself isn't programming-related. – Patrick McElhaney Nov 12 at 15:04

3 Answers

vote up 3 vote down check
  1. Insert a column
  2. In first row insert formula =MOD(ROW(),7)
  3. Copy down
  4. Copy/paste special/values
  5. Data/Filter out the ones you want (0 or 6, probably)
  6. Delete the rest of the rows Remove filter Delete column
link|flag
Not a bad solution. I like my macros so that's my first choice, but this could also work with a bit of effort. – Randolph Potter Nov 11 at 22:30
1  
=MOD(ROW(),7) you need that second argument. – dkusleika Nov 11 at 22:48
1  
+1 Good answer. I prefer a no macro solution when it is possible. – DaveParillo Nov 12 at 0:43
This answer suffers from the "single line-feed doesn't do anything" feature of Markdown. Can anyone format it properly? – djeidot Nov 12 at 14:54
Okay, I fixed it (and included the missing ,7 from MOD. Sorry! – tpierzina Nov 12 at 20:15
vote up 3 vote down

Really just finishing the idea Randolph Potter started....

For the record, I don't thing you could ever come up with this by recording. macro record is a good way to familiarize yourself with the Excel Object Model, but a not very good way to write reusable functions.

Option Explicit

'A simple test that copies every 7th row from the active sheet to a new sheet.
Sub SimpleTest()
    Dim r As Range
    Dim ws As Worksheet

    Set r = GetEveryNthRow(7)
    If Not r Is Nothing Then
        Set ws = Worksheets.Add(Before:=Sheets(1))

        r.Copy ws.Range("A1")
    Else
        MsgBox "Nothing came back from GetEveryNthRow"
    End If
    Set ws = Nothing
    Set r = Nothing
End Sub

'
Function GetEveryNthRow(ByVal NthRow As Long) As Range
    Dim keepRows As Range
    Dim r As Range

    If NthRow > 0 Then
        Set keepRows = Rows(1)
        For Each r In ActiveSheet.UsedRange.Rows
            If (r.Row Mod NthRow) = 0 Then
                Set keepRows = Union(keepRows, Rows(r.Row))
            End If
        Next r
        Set GetEveryNthRow = keepRows
    Else
        MsgBox "The row multiple provided must be greater than 0"
    End If

    Set keepRows = Nothing
End Function
link|flag
With you on the reusable notion. – Randolph Potter Nov 12 at 7:11
vote up 2 vote down

Personally, I'd record a macro to do the first three or four lines (at 7-row increments, of course), and copy the lines to a new sheet. Then I'd edit the macro to use a loop that counts to the number of populated rows in the sheet, with a step of 7.

Pseudo-code example:

Dim i as Integer

For i = 1 To 1000 Step 7
    'Add current row to selection
    ...
Next i

'Copy the selected rows to new sheet
...
link|flag
If you do use a macro, try going backward <code><pre>Sub delrows() Dim i As Long For i = 988 To 1 Step -7 Sheet1.Cells(i, 1).Offset(1, 0).Resize(6).EntireRow.Delete Next i End Sub</pre></code> If you delete rows, it the loop won't go crazy. – dkusleika Nov 11 at 22:52
He's not deleting, just adding a row to a range object (implied in the comment) – DaveParillo Nov 12 at 0:06
He says "by select, I mean delete all the other rows..." – dkusleika Nov 12 at 15:58

Your Answer

Get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.