質問です。

エクセルでA列にアドレスのデータがあります。これを重複チェックしてB列に重複がないものは1、重複回数に応じて2,3,4・・・と数字を表示する関数またはマクロをおねがいします。データは5万件くらいあります。できるだけ早い処理時間を希望します。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2011/09/26 16:27:36
  • 終了:2011/09/27 18:09:01

ベストアンサー

id:taknt No.1

きゃづみぃ回答回数13537ベストアンサー獲得回数11982011/09/26 16:34:50

ポイント50pt

たとえば A1でしたら B1に

=COUNTIF(A:A,A1)

とやればいいです。

あとは そのB1をコピーして 行数分 貼り付ければいいですよ。

id:inosisi4141

ありがとうございます。

この関数でデータ5万件で約5分かかりました。もっと早い方法はありますかCPU次第でしょうか

2011/09/26 17:02:02

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13537ベストアンサー獲得回数11982011/09/26 16:34:50ここでベストアンサー

ポイント50pt

たとえば A1でしたら B1に

=COUNTIF(A:A,A1)

とやればいいです。

あとは そのB1をコピーして 行数分 貼り付ければいいですよ。

id:inosisi4141

ありがとうございます。

この関数でデータ5万件で約5分かかりました。もっと早い方法はありますかCPU次第でしょうか

2011/09/26 17:02:02
id:niwa-mikiho No.2

niwa-mikiho回答回数508ベストアンサー獲得回数382011/09/26 18:02:22

ポイント25pt

2列しか無いデータなら、テキストファイルに出力して、

perl であったり、なんらかのスクリプトで処理したのをインポートした方が速いような気がします。


perl だとこんな感じになります。


#!/usr/bin/perl

use strict;

use warnings;

my $file_input = 'all.csv';

my $file_output = 'filtered.csv';


print "Processing ... please wait.\n";

my %address_count = ();

open(my $infh, '<', $file_input);

open(my $outfh, '>', $file_output);

while(my $line = <$infh>){

chomp $line;

# 重複チェックは A 列のみ

my $address = (split(/\t/, $line))[0];

# 重複個数をカウントする

$address_count{$line} = 0 if !exists($address_count{$line});

$address_count{$line}++;

# 書き出し

print $outfh $line, "\t", $address_count{$line}, "\n";

}

close($infh);

close($outfh);



簡易的に用意した240万件の処理に25秒でした。

(core2duo 1.86GHz の環境)

id:inosisi4141

ありがとうございます素人でもうしわけありませんが

これはエクセルで出来るのでしょうか

使い方が良く分からないのですが教えていただけららと思います

2011/09/26 18:36:59
id:Jupiter2100 No.3

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/26 18:06:50

ポイント25pt

マクロでB列が未記入の場合のみ重複チェックするようにしてみました。

B列を「空」にしてから実行してください。

Sub hoge()
Dim i, j, k, n, m, buff(9999) As Long
Dim c0 As Variant

n = Range("A:A").End(xlDown).Row
For i = 1 To n
    'まだ記入されていないなら重複チェック
    If (Cells(i, 2).Value = "") Then
        c0 = Cells(i, 1).Value
        buff(1) = i
        m = 2
        For j = i + 1 To n
            If (Cells(j, 1).Value = c0) Then
                buff(m) = j
                m = m + 1
            End If
        Next j
        '重複回数を記入
        For j = 1 To m - 1
            Cells(buff(j), 2).Value = m - 1
            buff(k) = 0     '初期化
        Next j
    End If
Next i
End Sub
id:inosisi4141

ありがとうございます

1万件で2~3分ですねちょっと時間がかかりすぎるようですね

25000~50000件では無理なかんじです

2011/09/26 18:51:02
  • id:taknt
    これより速いのは 難しいかも。
  • id:inosisi4141
    いま考えたのですが初めにA列をソートさせ大まかに重複しない半分を別シートに切り取り
    2つのsheetを同時に関数処理したら半分の時間ですみました
    たとえばソートしたsheetを3つ4つに分けて(人の手で)同時にマクロで重複チェック処理すると早いでしょうか
    マクロで各sheetのソートが終わったら1つのsheetに合算するマクロがあればよいのですが出来ますか

    関数の場合戻すのに関数を一旦解除する必要がありますのでその分手間がかかるようです。
  • id:inosisi4141
    移動する対象データの列はA列からD列まであります
    (数字を入れる列も含めるB列)
    sheetを2つに分けるだけでも良いです
  • id:taknt
    ソートしたり コピーしたりなんだかんだ やると あまり変わらないか、遅くなるような気がします。

    >移動する対象データの列はA列からD列まであります
    移動する対象データって 何でしょうか?
  • id:inosisi4141
    分ける行数は入力窓があれば手動で入れますソートしたあと画面をみていれますその後マクロ実行する手順でマッチング完了後また一つにする場合の数の基準にもなります
    データは1行目からでAからD列までとします
  • id:inosisi4141
    >移動する対象データの列はA列からD列まであります
    A列はソート対象データでその他データがBCにありますのでそのデータも含め数字を入れる列で合計4列です
  • id:inosisi4141
    出来れば複数ファイルありますので\test\に入れて一度に処理できればだいぶ合理化できそうな気がします。
  • id:inosisi4141
    分割件数の数字はマクロの記述のなかで修正しても良いです
    何件目(数字を入力)で分割して別シートに移動する

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません