• ベストアンサー

Excelでの重複削除なんですが。

VBA、マクロについては勉強し始めたばかりですが、よろしくお願いします。 Excelで、下記のようなデータをソートし、別シートに表示させたいのですが、 条件が、B列でソートを行い、 1、メーカー/年式 型番(abcd/02/AAAA)までが一緒の文字列を検索。 2、別シートに表示させるデータは、一番長いデータで、それ以外は削除。 (担当者が変わり、入力の書式も変わっていたので、同じ商品を違う書式で書いて、重複しているのでそれを1つにまとめたいのです。) A B 1 商品名  メーカー/年式 型番 その他 2 AAAA   abcd/02/AAAA 3 AAAA abcd/02/AAAA/v21 4 AAAA   abcd/02/BBBB/v21 5 BBBB   abcd/05 CCCC(v20) 6 BBBB   abcd/05 CCCC(v20,w00,h00) . . . 1000 XXXX       ↓ (別シート) 1 AAAA abcd/02/AAAA/v21 2 AAAA   abcd/02/BBBB/v21 3 BBBB   abcd/05 CCCC(v20,w00,h00) わかりづらくて申し訳ありませんが、どなたかお知恵をお貸し下さい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#52504
noname#52504
回答No.6

私も当初、規則性が見えないので難しいと考えていたのですが、 「半角スペースと開き丸括弧をスラッシュに置換したときの3つめのスラッシュの直前まで」 という前提が成り立つのであればなんとかなりそうです。 勉強としてではなく実務での課題のようですし、 複数回繰り返す作業でもなさそうなので、 VBAではなく数式による処理で考えさせていただきました。 1.元シートを丸々コピーする。 2.B列を適当な空き列にコピーする。   以下、T列にコピーしたものとします。   A、Bの2列しか使っていないとは限らないと思いましたので。 3.T列の半角スペースと開き丸括弧をスラッシュに置換する。 4.以下の数式を入力してそれぞれ下方にフィル。  U2:=FIND("/",$T2)   ※最初のスラッシュの位置を探します。  V2:=FIND("/",$T2,U2+1)   ※2番目のスラッシュの位置を探します。  W2:=FIND("/",$T2,V2+1)   ※3番目のスラッシュの位置を探します。  X2:=IF(ISERROR(W2),T2,LEFT(T2,W2-1))   ※3番目のスラッシュの直前までの文字列、    3番目のスラッシュが無ければ全体の文字列を返します。  Y2:=LEN(T2)   ※元の表記の文字数を返します。  Z2:=IF(MAX(($X$2:$X$9999=X2)*$Y$2:$Y$9999)=Y2,1,"")   ※同じ形式のもののうち、最も長いものであれば1を、でなければ""を返します。    この数式のみ配列数式です。    通常の数式は、数式を入力した後Enterキーで確定しますが、    これは配列数式なので、CtrlとShiftを押しながらEnterで確定してください。 5.不要な行を削除する。  Z列全体を選択し、編集>ジャンプ>セル選択 で、  [数式]にチェックを入れ、[文字]以外のチェックを外し、OK  1以外のセルが選択されます。  編集>削除>行全体>OK 6.不要な列を削除する。  4の作業列は不要ですので削除してかまいません。 いつもはダミーのデータを作って動作確認するのですが、 今回はダミーを作るのは大変なので、質問文と補足の例のみでチェックしています。 問題があれば補足してください。 余談ですが、こういったトラブルを避けるためにも、 メーカー・年式・型番・その他、それぞれに列を割り当てて別個に入力・管理し、 必要に応じて結合するのが標準的な運用かと思います。 複数の文字列をつないで一つにするのは簡単ですが、 一つの文字列をバラして判断させるとか、判断してバラさせるというのは容易ではありません。 長乱文陳謝

tony99
質問者

お礼

お礼が遅くなり申し訳ありません。 大変参考になりました。 有難うございました。

その他の回答 (5)

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.5

たったの数百なら重複入れても2000どまりじゃないの? どうせチェックしなきゃいけないんだから。 ルール通りにいかない部分って絶対ありますよ。手入力なんだから。 チェックするついでに修正どってことないと思うけど。 まずは数百(元の件数)がいくつ減るのか確かめては? そこに新たなルールを設けたらさらに幾つとか、あればこれ以上考える限界みたいのもわかりやすくなるだろうし。

tony99
質問者

お礼

>ルール通りにいかない部分って絶対ありますよ。手入力なんだから。 チェックするついでに修正どってことないと思うけど。 確かにそうですね。とりあえず少しずつ減らしていって、そここらまた、絞り込んで減らしていこうと思います。 長々と、有難うございます。

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.4

三つ目の/って5,6にはひとつしかないじゃないですか。 議論する暇に最初に私が示した方法の*を目で追って確認変更していくのが早道では?

tony99
質問者

補足

説明が足りづすいません。 >三つ目の/って5,6にはひとつしかないじゃないですか。 5,6のデータのスペース、括弧、カンマを全て、スラッシュに置換してからという意味だったのですが、説明不足でした。 >議論する暇に最初に私が示した方法の*を目で追って確認変更していくのが早道では? 型番までの文字列の長さは、種類毎に違うので(数百種類あるデータを一種類ごとに指定するイメージ)、左から何文字という指定では、辛いのです。 また、作業時間自体もあまり取れないの(いつもは接客)で、出来れば 短時間でやりたいのです。 個人的なわがままですいません。

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.3

一部を思いつきで出しては修正ではプログラムになんてなりません。 No2さんもおっしゃられる様に型番の切り分けに規則性を見出さなければやりようがありませんが。 例えば補足の件ではカッコ内は比較しないというルールで乗り越えられますがどうせそれだけじゃないんでしょう?

tony99
質問者

補足

またもご回答有難うございます。 >No2さんもおっしゃられる様に型番の切り分けに規則性を見出さなければやりようがありませんが。 見つけられる規則性としては、3つ目のスラッシュの前までか、括弧の前までのデータを比較対象とする位しか見当たらないんです。 3つ目のスラッシュの前までを比較するみたいな事が出来れば、全データの書式をスラッシュ区切りに置換して、出来る? すいません。わかりにくくて。  

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

実例を挙げているので、概略のイメージは良くわかるが、 「メーカー/年式 型番 その他」で本体部分+周縁部に分けるとして、どういう風に(どういうルールで)分けるのか、文章で表現してみてください。 実例はそういう面で正確に伝わらない。 ぷろぐらむは、そういうルール次第なのに、認識不足か、質問にはそれを書いてない。回答者に推測させている。 ーー これを、プログラム化する難易度はそのルール内容次第です。 私の言う本体部分と周辺部を別列に分けてソートするのが、後のロジックが簡単になるように思う。 ソートは本体部分・列(昇順)+周辺部文字桁数・列(降順)ソート。

tony99
質問者

補足

回答有難うございます。 説明が足りずに申し訳ありません。 >「メーカー/年式 型番 その他」で本体部分+周縁部に分けるとして、どういう風に(どういうルールで)分けるのか、文章で表現してみてください ・本体部分  →「メーカー/年式 型番」までをユニーク(重複してない)なデータとして抽出したい。 ・周辺部  →「その他のデータ」型番以降のデータ全て、()内のデータ。 データの例 1、abcd/02/AAAA/v21 →メーカー/年式/型番/その他のデータ 2、abcd/05 CCC(v20,w00,h00) →メーカー/年式 型番 (その他のデータ) ・比較するデータは、本体部分としてそのデータの型番までの文字列の長さは一定ではありません。 ・年式、型番、その他のデータは、"/"区切りのもの(1)と、スペースと括弧(2)でくぎられてるものがあります。 ・欲しいデータは、「メーカー/年式 型番」が同じデータが多数あるので、それを1つにして、それを別シートに表示するのですが、その際に表示するのは「その他のデータ」の中で一番文字数の多いデータにしたい(その他のデータが無いものもあり、それを抽出したくない)のです。 文章で書くのは難しいのですが、これで伝わりますでしょうか?

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.1

C2に =IF(LEFT(B2,12)=LEFT(B3,12),"*","") を入れて下方向にオートフィルすると 削除したいものに*が入るのが確認できたら 列をコピーして値貼り付けしてC列で並べ替えすれば まとめて削除できるかと。

tony99
質問者

補足

回答有難うございます。 先ほどの質問で、こちらで説明不足だったのですが、 対象となるセルは、比較する文字列の長さが商品によって違うので、文字数を指定するやり方だと、チェックしなくてよい、その他もみることになりまたも重複をおこすので、無理なんです。 (型番までの文字列の長さは一定ではない。)  A       B 1 商品名  メーカー/年式 型番 その他 2 AAAA    abcd/02/AAAA 3 AAAA    abcd/02/AAAA/v21 4 AAAA   abcd/02/BBBB/v21 5 CC   abcd/05 CC(v20) 6 CC   abcd/05 CC(v19,w00,h00)        ↓ 1 AAAA    abcd/02/AAAA/v21 2 AAAA   abcd/02/BBBB/v21 3 CC    abcd/05 CC(v19,w00,h00) もし他のやり方がわかれば、教えてください。

関連するQ&A

  • excel 記入文字列の集計

    よろしくお願いします。 入力用シートのある列で文字列の記入が合った時に、集計用シートにその文字列を集計していくようにしたいのです。 例:入力用シート  行数 :集計列 1  :aaaa 2  :記入なし   3  :bbbb 4  :記入なし 5  :記入なし 6  :cccc 集計用シート 行数 :集計列 1  :aaaa   2  :bbbb 3  :cccc よろしくお願いします。

  • [Excel]重複データの一方のセルが持つ値を一方の空白セルに反映させたい

    A列にある7000件ほどのデータの中から重複データのみを抽出し、 重複データの一方がB列に持つ値を、もう一方のデータのB列の空白セルに反映させたいのですが、方法はありますでしょうか? 「COUNTIF」を使って重複データの抽出はできますが、一方が持つデータをもう一方の空白に反映させることができません。 手作業では期限に間に合わない可能性がみえて焦っております。 恐縮ですがご教授いただけますでしょうか。 (例) [処理前] A列:B列:C列 1111:AAAA:aaaa 2222:BBBB:bbbb 3333:CCCC:cccc 1111:    :dddd 2222:    :eeee [処理後] A列:B列 1111:AAAA:aaaa 1111:AAAA:dddd 2222:BBBB:bbbb 2222:BBBB:eeee

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • エクセルで重複しているデータの抽出のしかたを教えてください。

    エクセルで重複しているデータを抽出したいのですが・・。なにぶん初心者なもので簡単な方法があればよいのですが・・。 A列に日付 B列に企業名このデータが300件ほどあります。  Å列      B列 1月 1日    AAAA社 1月 4日   BBBB社 1月 8日   CCCC社 2月 1日   BBBB社 2月20日    DDDD社 3月 2日   AAAA社 と、あるとしてB列の企業名が重複しているものを抽出したいのですが・・・。この場合 AAAA社とBBBB社ですが。 これを簡単に抽出する方法はないでしょうか? 教えてください お願いいたします。

  • 他シートのある列を検索して一致したらセルに色をつける方法

    次のような処理がしたいのですが、Excelの数式に詳しい方、ご教示お願いします。 次の3つのシートが一つのBOOKにあるとします。 ■Sheet1 1列目 AAAA BBBB CCCC : ■Sheet2 1列目 BBBB : ■Sheet3 1列目 AAAA CCCC : Sheet1の一列目にあるデータについて、Sheet2あるいはSheet3の1列目を検索し一致するものがあれば、Sheet1の一列目の各セルに色をつけるという処理をしたいです。 できれば、Sheet2に一致した場合と、Sheet3に一致した場合とで、色を変えたいです。 よろしくお願いします。

  • 用意したセルをランダムに差し込んでいく

    シート名『差し込むセル』に用意したセルをA列に並べています。(数十個) その用意したセルを、別シートの指定した語句があるセルの下に差し込んでいきたいです。 『指定した語句』は、 </h2> です。 別シート:A列24行以降のセルに</h2>があればその下に、 用意したセルをランダムに差し込んでいきたいです。 (別シートのA列24行~の横にずっと続いているので、それらにもランダムに差し込んでいきたいです) シート名『差し込むセル』 A列: AAAA BBBB CCCC DDDD EEEE FFFF GGGG 別シート A列24行以降のセル(B列24行以降~のセル) </h2> ああああ いいいい うううう </h2> ええええ おおおお かかかか きききき </h2> くくくく けけけけ </h2> ここここ シート名『差し込むセル』のA列のセルを </h2>の下に、ランダムに差し込んでいく ↓ </h2> BBBB ああああ いいいい うううう </h2> FFFF ええええ おおおお かかかか きききき </h2> AAAA くくくく けけけけ </h2> CCCC ここここ というように、差し込んでいきたいです。 ※ランダムに差し込むセルは被りなし これは、どのような記述でできるようになるでしょうか? よろしくお願いいたします。

  • エクセルについて

    エクセルを使って、たとえば aaaa bbbb(BBBB) cccc eeee (EEEE) とある文字列から( )を取り除き、 aaaa bbbb cccc eeee と表示させたいのですが、( )を含んだものについてはこの部分を取り、意図する通りに表示させることはできますが、( )が付いていないものに対して同じ処理を行うと#VALUEと出てうまくいきません。 この処理をどのようにして良いかなかなか思いつきません。 ちなみに表示の方法は search関数で ( 位置を探し、その後mid関数で ( の一つ左側まで表示させています。 bbbb(BBBB)→ bbbb   何か良い方法はないでしょうか。 よろしくお願いします。

  • A列にあったものには1、C列にあったものには2

    シート1の内容をVBAをつかってシート2のようにしたいです。 つまり、シート1の2行目以降のデータをシート2のB列につなげて、 A列には シート1の1行目に記載している番号をふっていきます。 もともとA列にあったものには1、C列にあったものには2、E列にあったものには3と振りたいのですが、どのようにマクロを書けばいいでしょうか? [Sheet1]   A  B  C  D  E 1 1  2  3 2 aa aaa aaaa 3 bb bbb bbbb 4 cc cccc 5  dddd ----------------------------- [Sheet2] A B 1 1 aa 2 1 bb 3 1 cc 4 2 aaa 5 2 bbb 6 3 aaaa 7 3 bbbb 8 3 cccc 9 3 dddd

  • シート1とシート2のデータ一致 抽出方法

    エクセルのデータ抽出でお知恵をお貸し下さい。 シート1 A列  B列     C列 品名  製品番号  数量 AA    1AAAA    200 BB    1BBBB    250 CC    1CCCC    300 シート2 A列   B列     C列 品名  製品番号   数量 AA    1AAAA   200 BB    1BBBB   250 AB    AAAA    500 CC    1CCCC   300 上記のようなシートがあります。 内容は同じなのですが、シート2にはシート1にはない品名、製品番号、数量が含まれます。 シート1の品名、製品番号、数量がすべて一致するものをシート3へ抽出し、 一致しなかったデータ(シート1にはなく、シート2にあるものを含め)をシート4へ抽出したいのですが 何か良い方法はないでしょうか??

  • グループ単位で空白行を挿入するVB

    下記の様に番号順にまとまったデータがある場合に その番号が違う番号になった時に空白行を1行挿入したいのですが 良い方法があればご教授下さい。 お願い致します。 <<例>> (実行前)  番号 DATA1 DATA2 1  1  aaaa bbbb 2  1  aaaa cccc 3  2  bbbb bbbb 4  3  cccc bbbb (実行後) 1  1  aaaa bbbb 2  1  aaaa cccc 3  2  bbbb bbbb 4  3  cccc bbbb 以上です。

専門家に質問してみよう