• ベストアンサー

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行もあるので この方法だと大変なので、行数をしていして、コピーする 方法とかあれば教えてください! 一度にいくつもすみませんが、教えてくださると 嬉しいです。

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

  • ベストアンサー
noname#52504
noname#52504
回答No.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)

ranrinrun
質問者

お礼

できました、嬉しいです! ありがとうございました。 自分のなじみのある、関数という形でできて 感激です。でも、マクロのが向いてるというのも 両方やってみて、わかった気がします。 マクロ勉強しようという気になりました。 でも、難しそうですね...

その他の回答 (7)

noname#52504
noname#52504
回答No.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)
回答No.6

#3のHIYAKUです。 セルの右あるいは左側どちらかに空白セルがなくデータが全て入っているのでしょうか? 通常は空白のセルが無ければWクリックでコピーされますが・・・・

ranrinrun
質問者

お礼

すみません、空白セルがありました。 その手前まではできていました... よく確認せず、すみません。 これで、20,000行も怖くありません(笑) どうもありがとうございました。

  • koko88okok
  • ベストアンサー率58% (3839/6543)
回答No.5

#2です。補足に回答します。 > ヘルプや「表示→ツールバー→書式設定」だけ表示させてみたのですが、「名前ボックス」が見つからなくて... 「名前ボックス」とは、新しくExcelを起動したとき、書式設定ツールバーの左端に「A1」と表示されているボックスのことです。 「Excelについて」 http://www.wanichan.com/pc/excel/excel01.htm

ranrinrun
質問者

お礼

わー、できました。 これでしっかり「名前ボックス」覚えられました。 ありがとうございました!

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

ANo.1です。 >私がやりたいことは、関数ではできないのでしょうか? 出来るのかも知れませんが、複雑な関数は苦手でして。 更に20,000行というデータ数からすると、複雑な関数を 入れていくと動作が重くなってしまうのでは?と 感じたので、この方法を提示してみました。

ranrinrun
質問者

お礼

重くなってしまったりするんですね... やりたいことがちゃんとできて嬉しかったです。 教えていただいたプログラムを調べて この行はこんなことをしてるんだーとか ちょっと勉強してみようと思います♪ ありがとうございました!

  • hiyaku
  • ベストアンサー率40% (12/30)
回答No.3

>あともうひとつ、教えてただきたい事があります。 >いつも一番上の行に式を入れて、下にドラッグすることで >下の行にコピーしているのですが、20,000行もあるので >この方法だと大変なので、行数をしていして、コピーする >方法とかあれば教えてください! 行数指定ではありませんが、沢山の行数がある場合下記の方法があります。 ただ2つの条件がありますが・・・ A.セルの右、あるいは左側どちらかに空白セルがなくデータが全て入っている事 B.コピーする行は、一番下の行までする事 1.コピー元のセルを選択しクリックする 2.マウスをそのセルの右下角にあわせると、マウスが白十字から黒十字に変わる 3.そのままの状態で、Wクリックする   以上 ★もし元データが「数値」でしたら、1つずつ増えますので もう一行だけその下にコピーし、セルを2ケ(2行)選択し上記の方法を実行する。 ★何万行あっても、瞬時にコピーされます。 ★右あるいは左に空白行があれば、そこまでの部分だけにコピーされます。 ★逆に言えば、コピーしたくない行に先に1行だけ空白行を入れてから コピーすると、その行でコピーはストップしますので、後は応用次第です。。。。 お試しあれ~

ranrinrun
質問者

補足

セルを2行選択して、黒十字の状態でWクリックしたのですが、 何事も起こりません。どうしてか分かりますか??? すみません、丁寧に書いて下さったのに、 理解できていないようで。。。

  • koko88okok
  • ベストアンサー率58% (3839/6543)
回答No.2

もうひとつの質問だけですが・・・ 1) 元のセルを含めて、コピーしたい範囲を選択します。 2) 「編集」メニュー→「フィル」→「連続データの作成」→「オートフィル」のラジオボタンをオンにして「OK」を押します。 3) オートフィルコピーされます。 多数行の選択方法(2例) 1) 最初のセルをクリックして、スクロール後「Shift」キーを押しながら、最後のセルをクリックします。 2) 最初のセルをクリックして、書式設定ツールバーの「名前ボックス」に最後のセル番号を入力して、「Shift」キーを押しながら「Enter」キーを押します。

ranrinrun
質問者

補足

回答くださって、ありがとうございます。 書式設定ツールバーの「名前ボックス」というのが分からないのですが... ヘルプや「表示→ツールバー→書式設定」だけ表示させて みたのですが、「名前ボックス」が見つからなくて... すみません、ド素人なので... 教えてくださいませんか?

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

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

ranrinrun
質問者

補足

「実行」ボタン押しただけで、sheet2が できちゃいました。嬉しいです! ありがとうございました。 図々しくさらに、質問良いですか? 私がやりたいことは、関数ではできないのでしょうか? やっぱりマクロでないと...  実は、Excel自体もろくにできず、マクロはやったことが ないので、教えていただいてコピーしたプログラムは 内容がまったく分からずなので、それを使うのがちょっと 抵抗がありまして。 もし可能なら、自分で理解できる方法(関数)などでやりたいなぁと 思ったりしてるのですが。 やっぱり、マクロ勉強しないといけないですかね。

関連するQ&A

  • Excel 文字列の結合について

    いつもお世話になってます。 Win2000 Office2000です。 文字列を結合するのに=A1&A2などで結合できますが片方が空白だった場合に空白を返すことは可能でしょうか? 正確には2行目が入ってたり入ってなかったりしてるので     A列   B列   C列 1行目 りんご イチゴ  桃 2行目 赤い       甘い これで=A1&A2と入れて他もフィルドラッグでやると 別シートA1:りんご赤い 別シートA2:イチゴ0 別シートA3:桃甘い これで「イチゴ0」となってますが空白にしたいのです。 探し方が悪かったのか過去ログで見つからず、お知恵を拝借できたらと思います。 よろしくお願い致します。

  • Excel2002 条件によりセルの文字色を変える

    Excel2002について質問させていただきます。 たとえば2つのシートがあります。・・・  Sheet1         Sheet2 A列  B列      A列   B列   商品 在庫      商品  在庫    A   ●       A    1    B   ●       B    2     C   ●       C    1 Sheet1のB列在庫の文字色を、Sheet2のB列在庫の値により色を変えたいのですが、1は青、2は赤 のように・・。 希望としてはマクロで行いたいのですが、可能でしょうか? よろしくお願いいたします。

  • Excelでの文字列抽出

    Excelで文字列の抽出とそれを並べる方法を教えてください。 関数だけを用いて実現できるのか、マクロを使わなければできないのかも分かりません。 この関数をこの様に使えばよいというのを教えていただけると幸いです。 やりたいことは、下記条件で、シート2のB列にシート1のG列~P列までに登録されている担当者名に該当するB列の店名を4店まで抽出したいのです。 分かりづらくて申し訳ございませんが、よろしくお願い致します。 ------------------------ シートが2枚(シート1/シート2)あります。 シート1  B列は4行毎に結合されており、店名が登録されています。  G列~P列までは1行目は担当者名、2,3,4行目は補足情報が登録されています。  シート2  A列に担当者名が入っています。(4行毎に結合しています)  B列にA列の担当者名に該当する、シート1の店名を4店まで登録したい。

  • Excel2007のマクロで文字列を結合

    Excel2007のマクロで文字列を結合したいのですがうまくいきません。 1、セルA1からU1までデータが1つずつ入ってます。 2、1のデータを3列ずつ結合してA3からG3にコピー。 例えば、セルA1あ、B1い、C1う、D1え、E1お、F1か、ならセルA3あいう、セルB3えおか、のようにマクロで一機にできるソースをお願いします。

  • Excel:シート間参照し置換したい

    初心者です。異なるシート間における表を参照し、置換の ような事がしたいのですが、VLOOKUPが使えるのでしょうか? やりたいのは、下記の通りです。 Sheet1のような表があります。 Sheet2のA列を参照し、Sheet1のB列を変換し、 Sheet3のような結果を得たいのです。 近似値もできるみたいなのでVLOOKUPを使おうと 思ったのですが、「含む」は論理値でどう指定すればいいか 分からず困っています。 そもそもVLOOKUPでできるかも疑問ですし... 教えてください、よろしくお願いします。 Sheet1 A列     B列         12345    りんご、みかん、イチゴ 67891    いんげん 23456    チョコ、あめ 67890    みかん、りんご 56789    あめ Sheet2 A列     B列 りんご    くだもの みかん    くだもの いちご    くだもの いんげん   野菜 チョコ    おかし あめ     おかし Sheet3 A列     B列         12345    くだもの 67891    野菜 23456    おかし 67890    くだもの 56789    おかし

  • Excel2007のVBAで文字列を結合

    Excel2007のマクロで文字列を結合したいのですがうまくいきません。 下記がお題になります 1、セルA1からU1までデータが1つずつ入ってます。 2、1のデータを3列ずつ結合してA3からG3にコピー。 例えば、セルA1あ、B1い、C1う、D1え、E1お、F1か、ならセルA3あいう、セルB3えおか、のようにマクロで一機にできるソースをお願いします。

  • Excel文字列の結合に条件式を付けたい

    エクセルで複数セルの文字列を1つに結合する際、条件を満たすものだけを結合して表示することはできないでしょうか。 <添付画像の例> A2:E2のうち1行目に「1」が付いたものだけを結合させ、セルG2に「あうお」と表示させたい

  • EXELで文字列の結合はどのように

    EXELで文字列の結合方法を教えてください。 A列にある文字列とB列にある文字列を結合したものをC列に入れたいのです。 例えば、A列「JAS」、B列「-123」で、C列「JAS-123」 というようにです。 よろしくお願いします。

  • 結合した文字列をファイル名に使えない

    Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

  • Excel2003の条件付き書式について

    お世話になります。 条件付書式で下記のようなことが可能か、可能であれば設定方法をご教授お願いします。 【シート1】(単価リスト)※単価の昇順で並べ替えています。    A     B     C       D    E 1 レベル  単価  カテゴリー  商品名  在庫 2   1     5      AAA     りんご   ● 3   2     7      BBB     みかん 4   3     8     CCC     いちご 5   2     8     DDD     か き   【シート2】(各商品に必要な材料表)※材料名の昇順で並べ替えされています。     A       B     C 1 カテゴリー  商品名   材料 2  BBB     みかん  オレンジ 3  DDD     か き   オレンジ 4  CCC     いちご   赤 3  AAA     りんご    赤  4  BBB     みかん   黄 5  AAA     りんご    黒 6  AAA     りんご    白  上記のような同じBOOK内の2枚のシートで商品名をキーとして 【シート1】のE列「在庫」に「●」が入っている商品の場合 【シート2】の商品名セルが塗りつぶされるようにしたいのです。 【シート2】には、1つの商品に対して必要な材料すべてが行を変えて記入されているため、同じ商品名が複数あります。 たとえばりんごの場合 【シート1】のE列「在庫」に「●」が入っているので【シート2】の商品名「りんご」 のセル(B3、B5、B6)はすべて塗りつぶされる。 (他の商品は「在庫」に「●」が入っていないので【シート2】の商品名セルは塗りつぶしなしのまま) 条件付き書式の「数式で」で検索する関数と「●」が入っている場合は FLASEとなるようIF関数の組み合わせを条件1と条件2に指定して試してみたのですが 上手くいきませんでした。 説明が足りなかったり、分かりにくければ補足させていただきますので宜しくお願いします。

専門家に質問してみよう