- ベストアンサー
Excel:条件付き文字列の結合方法
Excel本当の初心者です。ヘルプなど使って、自分なりにがんばって 考えたのですが、やりたいことがどうしてもできず、お力を貸して ください! やりたいのは、下記の通りです。 Sheet1のような表があります。カテゴリー毎にID が 付いていて、表は20,000行位あります。 同じID(カテゴリー)のものは、C列の商品名を”、”で 結合して、1行にまとめたいのです。 Sheet2のような結果を得たいのです。 Sheet1 A列 B列 C列 ID カテゴリー 商品名 12345 くだもの りんご 12345 くだもの みかん 12345 くだもの イチゴ 67891 野菜 いんげん 23456 お菓子 チョコ 23456 お菓子 お煎餅 Sheet2 A列 B列 C列 ID カテゴリー 商品名 12345 くだもの りんご、みかん、イチゴ 67891 野菜 いんげん 23456 お菓子 チョコ、お煎餅 Sheet1のA列とB列を「フィルタの重複レコードを無視する」を したものをSheet2のA列とB列に貼り付けて、ISNUMBERとFIND を使ってと思ったのですが、Sheet2のC列で商品名の結合を"、 " で結合しようと思ったのですが、重複IDがない物もあれば、 10個も20個もあるものもあるので、CONCATENATEではできなくて... どんな関数を使えば良いのでしょうか? それと、事前にSheet1にフィルタをかけてSheet2に貼り付けたり ぜずに、Sheet2のA列とB列とも関数でやる事はできるのでしょうか? あともうひとつ、教えてただきたい事があります。 いつも一番上の行に式を入れて、下にドラッグすることで 下の行にコピーしているのですが、20,000行もあるので この方法だと大変なので、行数をしていして、コピーする 方法とかあれば教えてください! 一度にいくつもすみませんが、教えてくださると 嬉しいです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#7です。すいません、忘れてました。 >事前にSheet1にフィルタをかけてSheet2に貼り付けたりぜずに、 >Sheet2のA列とB列とも関数でやる事はできるのでしょうか? ●関数によるフィルタ #7の作業列ア(D列)を引き続いて使います。 5.作業列エ [ID別の連番を使って、ID毎に連番を振る] Sheet1!G2:=COUNTIF($D$2:D2,1) 6.ID [自セルの行番号を使って、IDを引く] Sheet2!A2:=OFFSET(Sheet1!$A$1,MATCH(ROW()-1,Sheet1!$G$2:$G$29999,0),) ※自セルが4行目であれば、3番目のIDを探す。 7.カテゴリー [IDを使って、カテゴリーを引く] Sheet2!B2:=VLOOKUP(A2,Sheet1!$A$2:$B$29999,2,0)
その他の回答 (7)
横から失礼します。 作業列を使ってもよければ、数式でもできなくはありませんが、 #4さんがおっしゃるように、20,000行ともなると相当重たい処理になります。 また、数式とはいえ、必ずしも判りやすいとは言えないかもしれません。 私自身マクロによる解決をお奨めしますが、 「内容がわからないものを使うのに抵抗がある」というのもごもっともだと思いますので、 参考までに、数式による解決法を例示します。 以下、2行目からデータが入っているとして、 1.作業列ア [ID別に連番を振る] Sheet1!D2:=COUNTIF($A$2:A2,A2) として下方にフィル。 2.作業列イ [IDと作業列アの連番を連結した検索コードを生成する] Sheet1!E2:=A2&" "&D2 として下方にフィル。 3.作業列ウ [ID毎に、商品名を結合していく] Sheet1!F2:=IF(D2=1,"",OFFSET($F$2,MATCH(A2&" "&(D2-1),$E$2:E2,0)-1,)&"、")&C2 ※そのIDの最初の商品なら、その商品名だけを返す。 そのIDのN番目の商品であれば、検索コードからN-1番目を探して、その作業列ウの値に自分を付け加える。 4.結果列 [ID毎に検索して、作業列ウの最後の値を返す] Sheet2!C2:=VLOOKUP(A2&" "&COUNTIF(Sheet1!$A$2:$A$29999,A2),Sheet1!$E$2:$F$29999,2,0) ※IDの数をカウントして、最後の検索コードを割り出す。 検索コードを検索して、作業列ウの値を返す。
- hiyaku
- ベストアンサー率40% (12/30)
#3のHIYAKUです。 セルの右あるいは左側どちらかに空白セルがなくデータが全て入っているのでしょうか? 通常は空白のセルが無ければWクリックでコピーされますが・・・・
お礼
すみません、空白セルがありました。 その手前まではできていました... よく確認せず、すみません。 これで、20,000行も怖くありません(笑) どうもありがとうございました。
- koko88okok
- ベストアンサー率58% (3839/6543)
#2です。補足に回答します。 > ヘルプや「表示→ツールバー→書式設定」だけ表示させてみたのですが、「名前ボックス」が見つからなくて... 「名前ボックス」とは、新しくExcelを起動したとき、書式設定ツールバーの左端に「A1」と表示されているボックスのことです。 「Excelについて」 http://www.wanichan.com/pc/excel/excel01.htm
お礼
わー、できました。 これでしっかり「名前ボックス」覚えられました。 ありがとうございました!
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 >私がやりたいことは、関数ではできないのでしょうか? 出来るのかも知れませんが、複雑な関数は苦手でして。 更に20,000行というデータ数からすると、複雑な関数を 入れていくと動作が重くなってしまうのでは?と 感じたので、この方法を提示してみました。
お礼
重くなってしまったりするんですね... やりたいことがちゃんとできて嬉しかったです。 教えていただいたプログラムを調べて この行はこんなことをしてるんだーとか ちょっと勉強してみようと思います♪ ありがとうございました!
- hiyaku
- ベストアンサー率40% (12/30)
>あともうひとつ、教えてただきたい事があります。 >いつも一番上の行に式を入れて、下にドラッグすることで >下の行にコピーしているのですが、20,000行もあるので >この方法だと大変なので、行数をしていして、コピーする >方法とかあれば教えてください! 行数指定ではありませんが、沢山の行数がある場合下記の方法があります。 ただ2つの条件がありますが・・・ A.セルの右、あるいは左側どちらかに空白セルがなくデータが全て入っている事 B.コピーする行は、一番下の行までする事 1.コピー元のセルを選択しクリックする 2.マウスをそのセルの右下角にあわせると、マウスが白十字から黒十字に変わる 3.そのままの状態で、Wクリックする 以上 ★もし元データが「数値」でしたら、1つずつ増えますので もう一行だけその下にコピーし、セルを2ケ(2行)選択し上記の方法を実行する。 ★何万行あっても、瞬時にコピーされます。 ★右あるいは左に空白行があれば、そこまでの部分だけにコピーされます。 ★逆に言えば、コピーしたくない行に先に1行だけ空白行を入れてから コピーすると、その行でコピーはストップしますので、後は応用次第です。。。。 お試しあれ~
補足
セルを2行選択して、黒十字の状態でWクリックしたのですが、 何事も起こりません。どうしてか分かりますか??? すみません、丁寧に書いて下さったのに、 理解できていないようで。。。
- koko88okok
- ベストアンサー率58% (3839/6543)
もうひとつの質問だけですが・・・ 1) 元のセルを含めて、コピーしたい範囲を選択します。 2) 「編集」メニュー→「フィル」→「連続データの作成」→「オートフィル」のラジオボタンをオンにして「OK」を押します。 3) オートフィルコピーされます。 多数行の選択方法(2例) 1) 最初のセルをクリックして、スクロール後「Shift」キーを押しながら、最後のセルをクリックします。 2) 最初のセルをクリックして、書式設定ツールバーの「名前ボックス」に最後のセル番号を入力して、「Shift」キーを押しながら「Enter」キーを押します。
補足
回答くださって、ありがとうございます。 書式設定ツールバーの「名前ボックス」というのが分からないのですが... ヘルプや「表示→ツールバー→書式設定」だけ表示させて みたのですが、「名前ボックス」が見つからなくて... すみません、ド素人なので... 教えてくださいませんか?
- n-jun
- ベストアンサー率33% (959/2873)
VBE(Visual Basic Editor/VBエディタ)の画面について http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_vbe.html ・[Alt]+[F11]または[ツール]→[マクロ]→[Visual Basic Editor]を選択します。 ⇒VBE画面を呼び出します。 左側の VBAProject~を右クリック-挿入-標準モジュールで 上から3枚目の画像にある白い画面が出てきたら 下の Sub test() ~ End Sub までをコピー・貼り付ける。 VBE画面を閉じてから、Alt+F8で「マクロ」と言うのが 出てきたら、testを選択してOKを押す。 必ずファイルをコピーしてからテストして下さい。 (物は試しに・・・) Sub test() Dim Dic As Object, key As Variant Dim WS1 As Worksheet, WS2 As Worksheet Dim r As Range, rr As Range Dim st As String Dim v As Variant Set Dic = CreateObject("Scripting.Dictionary") Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Set rr = WS2.Range("A2") With WS1 For Each r In .Range(.[A2], .Cells(Rows.Count, "A").End(xlUp)) st = r.Value & "_" & r.Offset(, 1).Value Dic(st) = Dic(st) & r.Offset(, 2).Value & "、" Next End With With WS2 WS1.Range("A1:C1").Copy WS2.Range("A1") For Each key In Dic.keys v = Split(key, "_") rr.Resize(, 2) = v rr.Offset(, 2).Value = Left(Dic(key), Len(Dic(key)) - 1) Set rr = rr.Offset(1) Next End With End Sub
補足
「実行」ボタン押しただけで、sheet2が できちゃいました。嬉しいです! ありがとうございました。 図々しくさらに、質問良いですか? 私がやりたいことは、関数ではできないのでしょうか? やっぱりマクロでないと... 実は、Excel自体もろくにできず、マクロはやったことが ないので、教えていただいてコピーしたプログラムは 内容がまったく分からずなので、それを使うのがちょっと 抵抗がありまして。 もし可能なら、自分で理解できる方法(関数)などでやりたいなぁと 思ったりしてるのですが。 やっぱり、マクロ勉強しないといけないですかね。
お礼
できました、嬉しいです! ありがとうございました。 自分のなじみのある、関数という形でできて 感激です。でも、マクロのが向いてるというのも 両方やってみて、わかった気がします。 マクロ勉強しようという気になりました。 でも、難しそうですね...