• ベストアンサー

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/17069)
回答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