[[20170325113109]] 『複数列で重複しないデータを抽出する関数』(もか) ページの最後に飛ぶ

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

 

『複数列で重複しないデータを抽出する関数』(もか)

Excelには『重複の削除』という機能がありますが、これはデータが一列の場合の時でないと使えません。

A列に
1 2 2 3 4 5 7 8

B列に
3 4 5 6 7 8 9 1

と、入っている時に、C列に
1 2 3 4 5 7 8 6 9

を関数を使用して表示させることはできないでしょうか?

※データ数が日々異なるので、A:A、B:Bを範囲指定して検索したいです。
※C列に表示されるデータの順序は問いません。
※作業列を使用しても構いません。
※C列には空白行が無いように表示したいです。

よろしくお願いします。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 データが「数値」なら、順番に並べればいいと思います。

 (1) C1セル =MIN(A:B)

 (2) C2セル =IF(C1="","",IFERROR(SMALL(A:B,COUNTIF(A:B,"<="&C1)+1),""))
   下にコピー

 <結果図>
  行  _A_  _B_  _C_
   1    1    3    0
   2    2    4    1
   3    2    5    2
   4    3    6    3
   5    4    7    4
   6    5    8    5
   7    7    9    6
   8    8    1    7
   9         0  7.5
  10       7.5    8
  11              9

(半平太) 2017/03/25(土) 12:50


半平太さま
早速の回答ありがとうございます。
ただ、データは数値ではなく、文字と数値と記号の組み合わせとなっています。
(もか) 2017/03/25(土) 14:42

 >ただ、データは数値ではなく、文字と数値と記号の組み合わせとなっています。

 具体的なサンプルを提示してください。(また勘違いするといけないので)

(半平太) 2017/03/25(土) 15:58


 そもそも、

 >これはデータが一列の場合の時でないと使えません。 

 ここの認識に疑問。
 まぁ、データ見てみないとですが。
(コナミ) 2017/03/25(土) 19:23

具体的なサンプルは、職務上の情報となるため、申し訳ありませんが提示できません・・・。

また、『重複の削除』については、実際にデータが入っている範囲や列を指定して行ってみたのですが、
重複の値があるにも関わらず「重複がない」と返されてしまったり、「削除されました」と表示されるにも関わらず、実際セルに入っている数値は何も変わらないという結果でした。
(複数列を1列にまとめれば、『重複の削除』が使用できるのですが、先ほど申し上げましたように、それぞれの列に表示される値が日々異なるため、複数列のデータを一列にまとめる作業を省きたいと考えています。)
(もか) 2017/03/26(日) 00:15


 別に本当のデータをそのまま出すのではなく、数値なら数値、文字列なら文字列で
 架空のデータに置き換えたらいいんですよ。
 最初みたいに、実際は数値・文字列・記号の組み合わせなのに数値だけで
 例を出されると使える式や方法が変わってきてしまうので。
 例えば、「25X-A」みたいに最初が数値2桁で文字列と文字列をハイフンでつないで
 いるとか、規則性があるならそれを説明していくつか例をだしてもらえば
 回答側もそれに沿って考えられます。
(コナミ) 2017/03/26(日) 06:43

 「全て文字型」で「中間に空白セルが無い状態のデータ」で数式を考えてみましたが、
  それでもかなり面倒でした。(私の能力では)

  数百行程度なら多分大丈夫だと思いますが、
  データ量が多くなると重くてしょうがなくなるかも知れません。(単なる勘ですけど)

 「データ数が日々異なる」と言っても、実際、最多でどのくらいの行数になるのか、その目安が知りたい。

  ・・と言うかマクロで処理すれば、幾らあっても造作ないことなんですけど、その選択肢はないのですか?

(半平太) 2017/03/26(日) 10:17


ご助言、ありがとうございます。
データ例は以下のようになります。(@はランダムな英文字です)
@@-123@@-45@
@3-135-7@
@@56-@@678-@
@1@-45@-2@3

※英文字と数字が「-(ハイフン)」で繋げられています。
※桁数はデータにより異なり、各データに入るハイフンの数もデータ毎に異なります。
※データ内の英文字と数字の並びは、データにより異なり、ランダムです。
(英文字○個、ハイフン、数字○個、ハイフン・・・というような規則性はありません。)
※データの頭は必ず英文字です。

可能であれば、関数を使用したいです。
データの数は、各列で30行〜40行程度の場合が多いです。

よろしくお願いします。

(もか) 2017/03/26(日) 10:36


 >データの数は、各列で30行〜40行程度の場合が多いです。

 これなら、A列の分をD列の1〜100行、B列の分をD列の101〜200行に(数式で)転記すれば簡単にできそう。

 ちょっと待っていてください。

(半平太) 2017/03/26(日) 11:30


 (1) C1セル =INDEX(D:D,SMALL(INDEX((MATCH(D$1:D$200,D$1:D$200,0)<>ROW(Z$1:Z$200))*1000+ROW(Z$1:Z$200),0),ROW(Z1)))&""
 (2) D1セル =IF(INDEX(A:B,ROW()-100*(100<ROW()),1+(100<ROW()))&""="",D$1,INDEX(A:B,ROW()-100*(100<ROW()),1+(100<ROW()))&"")

 それぞれ、下にフィルコピー

 <結果図>
  行  __A__  __B__  __C__  __D__
   1  A-001  Z-1    A-001  A-001
   2  A-002  Z-2    A-002  A-002
   3  A-003  A-002  A-003  A-003
   4  A-004  A-003  A-004  A-004
   5  A-002  A-004  A-007  A-002
   6  A-003  A-002  A-008  A-003
   7  A-007  Z-7    a-98   A-007
   8  A-008  Z-1    Z-200  A-008
   9  a-98   Z-9    Z-1    a-98 
  10  Z-200  Z-10   Z-2    Z-200
  11         z-200  Z-7    A-001
  12                Z-9    A-001
  13                Z-10   A-001
  14                       A-001
  :  :   : :   :
              200行下まで

(半平太) 2017/03/26(日) 11:49


お礼が遅くなり、申し訳ありませんでした。
お教えいただいた方法で試してみます!
ありがとうございました!!
(もか) 2017/03/28(火) 08:10

 関数は素人ですが、2列限定なら

 C1 : =IF(ROW(A1)<=COUNTA(A:A)+COUNTA(B:B),IF(ROW(A1)<=COUNTA(A:A),A1,INDEX(B:B,ROW(A1)-COUNTA(A:A))),"")
 これを下にフィルコピーした上で、C列を値変換し重複の削除を行ってもできました。

 並び順は、よくわからないので必要なら並び替え操作。

(β) 2017/03/28(火) 09:17


コメント返信:

[ 一覧(最新更新順) ]


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