以下のマクロをお試しください。
オリジナルの住所録は、シート[Sheet1]のA列に名前が、B列に住所があるとします。
ランダムに抽出した結果は、シート[Sheet2]のA列とB列に代入します。
名前と住所の両方が重複しているデータは抽出しないようにしてあります。
なお、もしオリジナルの3000件から重複分を除いて1000件未満になっていると、このマクロは無限ループに陥ってしまいます。計算に時間がかかりすぎるようでしたら、ESCキーをクリックしてマクロを中断してください。
Option Explicit Private SourSheet As String, DestSheet As String, Nums As Long 'メインプログラム Sub main() SourSheet = "Sheet1" 'オリジナルのシート名 DestSheet = "Sheet2" '抽出先のシート名 Nums = 1000 '抽出件数 Dim name As String, address As String Dim maxrow As Long, i As Long, r As Long maxrow = Worksheets(SourSheet).Range("A1").End(xlDown).Row Call makeDestSheet i = 0 While (i < Nums) r = Round(Rnd() * maxrow, 0) If (r = 0) Then r = 1 name = Worksheets(SourSheet).Cells(r, 1).Value address = Worksheets(SourSheet).Cells(r, 2).Value If (isDup(name, address, i) = False) Then i = i + 1 Call addItem(name, address, i) End If Wend End Sub '重複しているかどうか Function isDup(name As String, address As String, n As Long) As Boolean Dim i As Long isDup = False For i = 1 To n If (Worksheets(DestSheet).Cells(i, 1) = name And Worksheets(DestSheet).Cells(i, 2) = address) Then isDup = True i = n + 1 End If Next i End Function '1行追加 Sub addItem(name As String, address As String, n As Long) Worksheets(DestSheet).Cells(n, 1).Value = name Worksheets(DestSheet).Cells(n, 2).Value = address End Sub 'データシート作成 Private Sub makeDestSheet() Dim ws As Worksheet Dim flag As Boolean flag = False For Each ws In Worksheets If ws.name = DestSheet Then flag = True Next ws If (flag = True) Then Worksheets(DestSheet).Cells.Clear Else Set ws = Worksheets.Add ws.name = DestSheet End If End Sub
まず以下の方法にしたがって重複したデータが見えないようにします。
重複データを削除する?フィルタオプション:Excel エクセルの使い方-データベース/検索
次に以下の方法にしたがってデータとして使っていない列にrand関数を入力しその列で並べ替えをします。
先頭から欲しい行数だけを抜き出してください。
ランダムな並べ替え?RAND関数:Excel エクセルの使い方-データベース/検索
重複したデータを完全に削除してしまっても良ろしければ以下のような方法もございます。
Excel2007で重複データを削除する?重複の削除:Excel 2007 エクセル2007の使い方
ご確認ください。