人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【エクセルの質問です】約3000件の住所録があります。エクセルのデータで、一行につき一人の名前や住所などが入力されています。このデータには、重複が多く、重複を除き、無作為に1000件のデータを抽出したいのですが、どのような方法がベストでしょうか?ご教授下さい。よろしくお願いします。

●質問者: ビギン
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● oil999
●250ポイント

以下のマクロをお試しください。

オリジナルの住所録は、シート[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


2 ● 蝸牛角上争何事
●250ポイント

まず以下の方法にしたがって重複したデータが見えないようにします。
重複データを削除する?フィルタオプション:Excel エクセルの使い方-データベース/検索

次に以下の方法にしたがってデータとして使っていない列にrand関数を入力しその列で並べ替えをします。
先頭から欲しい行数だけを抜き出してください。
ランダムな並べ替え?RAND関数:Excel エクセルの使い方-データベース/検索

重複したデータを完全に削除してしまっても良ろしければ以下のような方法もございます。
Excel2007で重複データを削除する?重複の削除:Excel 2007 エクセル2007の使い方

ご確認ください。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ