This routine will randomly select rows from the filtered list. See attached spreadsheet for an example.
Sub test()
Dim dataRange As Range, extraColumn As Range
Dim destRange As Range
Dim critRange As Range
Dim sampleSize As Long
Rem set-up variables
With ThisWorkbook.Sheets("Data")
With Range(.Cells(1, .Columns.Count).End(xlToLeft), .Cells(.Rows.Count, 1).End(xlUp))
Set extraColumn = .Offset(0, .Columns.Count).Resize(, 1)
extraColumn.EntireColumn.Insert
Set extraColumn = .Offset(0, .Columns.Count).Resize(, 1)
Set dataRange = Application.Union(extraColumn, .Cells)
End With
End With
With ThisWorkbook.Sheets("Audit")
Set critRange = .Range("A1:A2")
Set destRange = .Range("A4").Resize(1, dataRange.Columns.Count)
destRange.Resize(.Rows.Count - 4, dataRange.Columns.Count).ClearContents
End With
sampleSize = Val(CStr(critRange.Offset(1, 1).Range("A1").Value))
With extraColumn
.FormulaR1C1 = "=ROW()"
.Value = .Value
.Cells(1, 1).Value = "From Data! row number"
End With
Rem filtered data to Audit sheet
dataRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=critRange, _
CopyToRange:=destRange, Unique:=False
extraColumn.EntireColumn.Delete shift:=xlToLeft
Rem select Random rows
With destRange
With Range(.Cells(2, .Columns.Count), .Parent.Cells(Parent.Rows.Count, 1).End(xlUp))
If sampleSize < .Rows.Count Then
.Offset(0, .Columns.Count).Resize(, 1).FormulaR1C1() = "=RAND()"
With .Resize(, .Columns.Count + 1)
.Sort Key1:=.Cells(1, .Columns.Count), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
.Offset(0, .Columns.Count).Resize(, 1).ClearContents
.Offset(sampleSize, 0).ClearContents
With .Resize(sampleSize, .Columns.Count)
.Sort Key1:=.Cells(1, .Columns.Count), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End If
End With
End With
destRange.Parent.Activate
Application.Goto destRange.Range("A1")
End Sub
Bookmarks