[[20080219211825]] 『重複したデータを』(あちゃこ) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『重複したデータを』(あちゃこ)

 A列で重複したデータをB列で重複しなようにしたいのですがどうしたらいですか?
    A           B
 りんご     りんご
 りんご     バナナ
 バナナ     桃
 桃       いちご
 いちご     パイナップル
 バナナ
 桃
 パイナップル
 パイナップル
 いちご

 あちゃこさん、今晩は!
 少し、長くなりましたが一例です

       	[A]     	[B]     
 [1]	りんご	りんご
 [2]	りんご	バナナ
 [3]	バナナ	桃
 [4]	桃	いちご
 [5]	いちご	パイナップル
 [6]	バナナ	
 [7]	桃	
 [8]	パイナップル	
 [9]	パイナップル	
 [10]	いちご	
 [11]		

 B1=IF(SUMPRODUCT(1/COUNTIF($A$1:$A$10,$A$1:$A$10))>=ROW(A1),INDEX($A$1:$A$10,SMALL(IF(MATCH($A$1:$A$10,$A$1:$A$10,0)=ROW($A$1:$A$10),ROW($A$1:$A$10),""),ROW(A1))),"")
 として、Ctrl + Shift + Enter で確定して下さい。
 そして、下行へコピーです。

 あとは、フィルタオプションを使う方法も一案かと。 
     (SS)

 マクロの一例です。 
マクロを実行すると
シート1のデータをシート2に振り分け集積します。
   シート2に並ぶように作ってありますので,どうしてもB列
がよければ,結果をB列にコピーペーストしてください。

   なお,このVBAは類似の  [[20080213140737]] に載せた
 前半だけを利用したものです。
    なお,件数が1万件もあると,処理が遅いと批判もありましたが
  使った評価を聞かせていただけるとありがたいです。

(夕焼)

 Sub test()

 ''''''''''''''''''' A列重複データ抽出整理

 Worksheets(2).Cells(1, 1) = Worksheets(1).Cells(1, 1)
 lastrow1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row

 For i = 2 To lastrow1
   nn = 0
   lastrow2 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row

   For j = 1 To lastrow2

       If Worksheets(2).Cells(j, 1) = Worksheets(1).Cells(i, 1) Then
       Exit For

       Else
       nn = nn + 1
       End If
    Next j

   If nn = lastrow2 Then
   Worksheets(2).Cells(lastrow2 + 1, 1) = Worksheets(1).Cells(i, 1)

   End If

 Next i

 lastrow21 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row

 end sub


 42-3 フィルタオプション(重複しない抽出)
http://www11.plala.or.jp/koma_Excel/contents6/mame6042/mame604203.html
 ”重複するリストは無視する”のチェックを入れることでできるかと。

 夕焼けさん
 > なお,件数が1万件もあると,処理が遅いと批判もありましたが
 > 使った評価を聞かせていただけるとありがたいです。
 質問者さんのデータ数が1万件あるなんて、記載ないとおもいますけど?
 テストをしたければ、
[[20080213140737]] の
 弥太郎さんのコードを参考に擬似データを作成して、ご自身で試してみては?
 その方が時短ですよ。⇒その位のコードなら作成できますよね。
 (元夏バテ)

 (元夏バテ)さん
 >1万件あるなんて、記載ないとおもいますけど?
   それを言うなら,1万件処理を言い出した弥太郎さんや,あなた自身に
 まず言うべきだったのでは? [[20080213140737]] 

 >1万件のデータ処理はよくあるのではないですか?
 (元夏バテ)さん この一文はあなたが実際,[[20080213140737]] で
 書かれている文書です。 元々,件数の記載が無いところに
 1万件という数値を持ち出して,自分たちの優位性を主張したのは
 あなた方自身ではありませんか。(夕焼)

  (あちゃこ)さま 別件で板を汚してすみません。 

 下記コードで比較検討してみました。
数値での比較です。
乱数ですので、夕焼さんのコードでは場合によって結果が異なると思われます。
 
夕焼さん 	206.20秒
フィルタオプション	0.36秒
ディクショナリ	0.05秒
 
(ROUGE)
'----
Sub Haichi()
With Sheets("Sheet1").Range("A1:A10000")
    .Formula = "=ROUND(RAND()*1000,0)"
    .Value = .Value
End With
End Sub
 
Sub 夕焼()
Dim lastrow1 As Long, lastrow2 As Long, lastrow21 As Long
Dim i As Long, nn As Long, j As Long
Dim tmr As Double
Sheets("Sheet1").Range("B:B").ClearContents
tmr = Timer
Worksheets(2).Cells(1, 1) = Worksheets(1).Cells(1, 1)
lastrow1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastrow1
    nn = 0
    lastrow2 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row
    For j = 1 To lastrow2
        If Worksheets(2).Cells(j, 1) = Worksheets(1).Cells(i, 1) Then
            Exit For
        Else
            nn = nn + 1
        End If
    Next j
    If nn = lastrow2 Then
        Worksheets(2).Cells(lastrow2 + 1, 1) = Worksheets(1).Cells(i, 1)
    End If
Next i
lastrow21 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row
With Sheets("Sheet2").Range("A:A")
    .Copy Sheets("Sheet1").Range("B1")
    .ClearContents
End With
tmr = Timer - tmr
With Sheets("Sheet1")
    .Range("E1").Value = "夕焼"
    .Range("F1").Value = Format(tmr, "#,##0.00") & "秒"
End With
End Sub
 
Sub フィルタオプション()
Dim tmr As Single
tmr = Timer
With Sheets("Sheet1")
    .Range("C:C").ClearContents
    .Range("A1").Insert xlDown
    .Range("A1").Value = "見出し"
    .Range("A1").CurrentRegion.Resize(, 1).AdvancedFilter _
        xlFilterCopy, , .Range("C1"), True
    .Range("A1").Delete xlUp
    .Range("C1").Delete xlUp
    tmr = Timer - tmr
    .Range("E2").Value = "フィルタオプション"
    .Range("F2").Value = Format(tmr, "#,##0.00") & "秒"
End With
End Sub
 
Sub ディクショナリ()
Dim dic As Object, tbl, i As Long
Dim tmr As Single
tmr = Timer
Sheets("Sheet1").Range("D:D").ClearContents
tbl = Sheets("Sheet1").Range("A1").CurrentRegion.Resize(, 1).Value
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(tbl, 1)
        If Not .Exists(tbl(i, 1)) Then .Add tbl(i, 1), Empty
    Next
    Sheets("Sheet1").Range("D1").Resize(.Count).Value = _
        Application.Transpose(.keys)
End With
tmr = Timer - tmr
With Sheets("Sheet1")
    .Range("E3").Value = "ディクショナリ"
    .Range("F3").Value = Format(tmr, "#,##0.00") & "秒"
End With
End Sub


(ROUGE)さん

 比較データありがとうございます。
   件数はいくらだったのでしょうか。 1万件ですか?
  「夕焼」私のものでも3分ちょっとで処理できたんですね。
     結構いいですね。一息ついて待つにちょうどいい具合のようですね。
  (自己満足)

   時間比較はビリですが,窓の外の雪景色でも眺めて
  待つことで我慢が出来る範囲ですね。
  (最近はせっかちで そうでもないかも?)

   (ROUGE)さん
   皮肉に聞こえるかもしれませんが,1秒・2秒・・・ 数分早くても
    大した問題ではないではないですか。
         競技ならいざしらず。  ・・・・負け惜しみ と思ってください。

  (夕焼)


 夕焼氏は「EXCELに時間のかかる処理をさせつつその間に一服⇒それをゆとりといふ」というスタンス。
 他の方はとっとと計算終わらせてそれから一服。
 ま、捉え方の違いですな。 

 自分は後者。   (to-risugari)

 ほんの蛇足

  何も口実もないのに,一服しているのってきついですよ。
  今計算中ですから,先に進めず少し待っています。と口実を付けて一服
     (夕焼)

 夕焼けさん
 >>1万件あるなんて、記載ないとおもいますけど?
 この件と、
 >>1万件のデータ処理はよくあるのではないですか?
 >(元夏バテ)さん この一文はあなたが実際,[[20080213140737]] で
 >書かれている文書です。
 この件では、質問者さんは違いますよね。(リンクがうまく動いてないですけど)

 なんで2つの質問を混ぜる必要があるのですか?

 >  それを言うなら,1万件処理を言い出した弥太郎さんや,あなた自身に
 >まず言うべきだったのでは? [[20080213140737]]
 ・・・しなくても、ほぼ結果は見えているので私はしないだけです。

 それで
 >夕焼けさん
 >> なお,件数が1万件もあると,処理が遅いと批判もありましたが
 >> 使った評価を聞かせていただけるとありがたいです。
 >質問者さんのデータ数が1万件あるなんて、記載ないとおもいますけど?
 このように申し上げ、質問者さんに評価を聞くよりも、まずご自身で試されては?と
 言う意味で発言してます。

 私が1万件のデータを処理するのなら、配列・Dictionaryオブジェクトなど、処理時間優先で
 コード作成を行ないます。
 のんびり待っているなんて事できませんし、そうならないような方法があるなら他の方の回答等を
 参考にスキルアップを心掛けます。
 (元夏バテ)

 話を整理しましょう。

 「1万件あるとは記載ない」というようなことを,今回(あちゃこ)さんの板で
述べています。
  それであるなら,(クロ)さんの板(駅名の件)で,弥太郎さんが同じように
 記載されていない 1万件について,話を持ち出したときに同じ指摘をせずに
 それどころか,あなたは便乗して,
 >>1万件のデータ処理はよくあるのではないですか?
  今回と矛盾するような話をしているではないかということです。
(今回私に向って言ったように,1万件なんて書いてないよと弥太郎さんに言うべきだったということです。)

 早い・遅いの論議でなく,1万件の話に持っていったのはだれかという話です。
  板がちがいますが,どうして,(クロ)さんの板と今回の板で言うことが矛盾
 しているかとういことを言いたかったのです。2枚舌は信用されませんよ。
(夕焼)

 クロさんの駅名の件については、夕焼けさんももちろん検索されたかも知れませんが、
 駅名は約1万件近くあるようです。JR・その他含め。
 >2000件,500件など
 といった範囲ではありません。
 ・・・現在廃線等により激減してその位しかないと夕焼けさんの検索結果で仰るのなら、
 その点については訂正致します。
 (元夏バテ)

 >>2000件,500件など
 >といった範囲ではありません。
 もっとも、駅の範囲を”首都圏”とかに限定しているのなら、別ですけど。

 それに、駅名1万件と、1万件のデータ処理とは必ず同じではないですよ。
 1万件分の電話番号・住所・名前・部品名等々色々あります。
 駅名に限定するする事ではないでしょう。
 (元夏バテ)

 これは夕焼けさんの手法をそのまま変数に置き換えただけのマクロです。
 こんな単純な作業ですとDictionaryを用いなくても変数同士のやりとりだけで耐えうる
 処理時間で済むように思えます。
 ただ私どものデータ量は膨大ですので、夕焼けさんのようなおもちゃサイズのマクロは
 とても使えたものではありません。

 Sub 焼けクソ()
    'Dim lastrow1 As Long, lastrow2 As Long, lastrow21 As Long
    Dim i As Long, t As Long, j As Long, Flg As Boolean
    Dim tmr As Double, Adata, Bdata
    Sheets("Sheet1").Range("B:B").ClearContents
    tmr = Timer
    'Worksheets(2).Cells(1, 1) = Worksheets(1).Cells(1, 1)
    'lastrow1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
    Adata = Range("A1", Range("A" & Rows.Count).End(xlUp))
    ReDim Bdata(1 To UBound(Adata), 1 To 1)
    t = 1
    Bdata(t, 1) = Adata(1, 1)
    For i = 2 To UBound(Adata, 1) 'lastrow1
        Flg = False
        For j = 1 To t
            If Adata(i, 1) = Bdata(j, 1) Then
                Flg = True: Exit For
            End If
        Next j
        If Not Flg Then
            t = t + 1
            Bdata(t, 1) = Adata(i, 1)
        End If
    Next i
    Range("B1").Resize(t) = Bdata
    tmr = Timer - tmr
    Range("E1").Value = "焼けクソ"
    Range("F1").Value = Format(tmr, "#,##0.00") & "秒"

 End Sub

     (ひまなPG)


 夕焼けさん
 > 話を整理しましょう。
 と言う事でしたので、回答をつけています。

 コメントお願いします。
 その後は、こちらからのコメントは控えておきます。
 別スレにおいても、コメントするだけ意味ないし、スキルアップの参考にならないし。
 (元夏バテ)

 >コメントお願いします。
  ということなので,・・・書きました。

  繰り返しになりますが, 
 件数の数値が実際(駅名などが)いくつあるかということや処理が速い・遅いを
「整理しましょう」と言っているわけではありません。

 元々,両質問に件数の話がなかったところに,駅の時は件数論議に賛成されていて
今回は「1万件あるなんて記載ないよ」いうような話をもちだされ,件数論議を否定されましたが
,両者の意見(考え)の違いに,私は疑問を感じているので,整理して伝えたかったということです。
 (夕焼)


 夕焼けさん、最後のコメントご容赦願います。

 ようはデータ量が元々どのくらいか不明であって、双方の考え方の相違により
 矛盾した(2枚舌?)となったようであると、認識しました。

 データ量に対しての処理時間は、確かに半年前の私なら夕焼けさん同様
 セルに書き出しながら行なっていました。
 そして半年間のここでのやり取りを見て、配列やDictionaryオブジェクト等を勉強しました。

 更にスピード化を測るかどうかについては質問された側の判断であり、
 私が夕焼けさんに云々言うべきではなかったですね。すいませんでした。
 (元夏バテ)

 >私が夕焼けさんに云々言うべきではなかったですね。
 あたしゃそうは思いまへん。
 あちゃこはんがご近所で、その御方に指南するなら変数の宣言も不要でっしゃろし、動
 きの遅いおもちゃマクロ(あ、これ、それがしの言葉とちゃいまっせぇ^^)でもよろ
 しいんでっしゃろけど、ここに訪れる御方は数知れず居てまっしゃろし、そのうちの
 何百、いや、何千?、もっと多くて何万人? かがそれぞれご自分に適応したマクロ
 をお探しになってらっしゃるかもしれまへん。
 回答する側に立つもんは、すべからくその不特定多数の方々を視野に入れた回答を書き
 込む義務が有ると思いますワ。
 あたしゃたまたま別スレで10000のデータを取り上げましたけど、今日日そんな数
 少ないデータでもたついとったら鼻先でせせら笑われまっせ。^^
          (弥太郎)


 弥太郎さん、ありがとうございます。

 私としては、弥太郎さん始めいろんな方のコードを参考にさせて頂きながら、
 よりスムーズに短時間で処理が行えるようなスキルアップを目指していきます。
 今後とも参考にさせて頂きたいと願いつつ、ここでの発言を終わります。
 (元夏バテ)

 >今日日そんな数 少ないデータでもたついとったら鼻先でせせら笑われまっせ。

 私の個人的な見解としては,前も書いたかもしれませんが,そもそもEXCEL
なんてものは,個人のノート代わり程度の計算表ソフトでしかないと思っています。
  電卓代わり,ノート代わり程度の,パーソナルな道具的な使い方しかしていません。
一個一個,手作業(マクロを使わない)で行う代わり,マクロで処理すれば少し
便利だなという程度で利用しています。10個,100個の処理だから,数分でマクロを作って
利用しようというところです。元々,膨大なデータ処理・管理ををEXCELで管理・処理するような
使い方を考えていません。
 「私どものデータ量は膨大ですので」「そんな数 少ないデータで」というところに
そもそも,EXCELごときを使っていることがおかしくなります。
 きちっとデータベース管理して処理するのであれば,EXCELなどといわず
それなりの専用ソフトを開発・発注して使っているのが普通と思います。
  EXCELしかなく我慢して使っているのかわかりませんがそのような,
使い方されるところは,やはり何とかEXCELで処理速度を上げる努力が
必要ですね。頑張ってEXCELを使ってください。(夕焼)

 >  私の個人的な見解としては,前も書いたかもしれませんが,そもそもEXCEL
 > なんてものは,個人のノート代わり程度の計算表ソフトでしかないと思っています
 それが笑われるわけなんだけどね...
 エクセルファイルのやり取りのほうが便利だから使用するわけ。
 各社間で共有できる専用データベースでもない限り...
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.