- ベストアンサー
エクセル 関数 範囲のタイトルを1つのセルに帰す
こんなことをしたいのですが、関数でできますでしょうか? りんご みかん ばなな A子 2 1 0 りんご、みかん B子 0 0 1 ばなな、 C子 1 1 1 りんご、みかん、ばなな D子 0 0 0 E子 0 4 0 みかん ・ ・ X子 例のように、A子~X子までがそれぞれりんご、みかん、ばななを買ったとき、買ったものの名前だけを、それぞれの名前と同じ行で、1つのセルに表示したいのです。果物の種類は10個以下で、どんな順番に記入されてもかまいません。実際はX子以上にたくさんいます。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
質問にある表の場合なら、セルE2に =IF(B2>0,IF(C2>0,IF(D2>0,B$1&"、"&C$1&"、"&D$1,B$1&"、"&C$1),IF(D2>0,B$1&"、"&D$1,B$1)),IF(C2>0,IF(D2>0,C$1&"、"&D$1,C$1),IF(D2>0,D$1,""))) と入力して、下へコピーしてください。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
この課題はVBA向きです。関数では工夫を要するか、相当複雑になります。 例データ A1:D6 ーー りんご みかん ばなな A子 2 1 0 B子 0 0 1 C子 1 1 1 D子 0 0 0 E子 0 4 0 ーーーーーーーーーー Sub test01() d = Range("A65536").End(xlUp).Row MsgBox d For i = 2 To d k = 8 'G列から右へ For j = 2 To 4 'B-D列について If Cells(i, j) <> 0 Then Cells(i, k) = Cells(1, j) '第1行の名称をK列にセット k = k + 1 '1列右へ End If Next j Next i End Sub ーーー 結果 H-J列 りんご みかん ばなな りんご みかん ばなな みかん H列へ文字列として出すことも少々の変更で可能だが。 Sub test02() d = Range("A65536").End(xlUp).Row MsgBox d For i = 2 To d s = "" For j = 2 To 4 'B-D列について If Cells(i, j) <> 0 Then s = s & Cells(1, j) & "," '第1行の名称をつなぐ End If Next j MsgBox s If s <> "" Then Cells(i, "H") = Left(s, Len(s) - 1) End If Next i 結果 りんご,みかん ばなな りんご,みかん,ばなな みかん
お礼
すいません、VBAはまだ初歩の初歩段階なので知識が追いついていません。もう少しVBAに詳しくなってから参考にさせていただきます。 ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
別解です。 最後に余分なカンマがついてしまうのが難です。 (例)りんご,みかん, (取ろうと思えば可能ですが、式が無駄に長くなるのでボツ) =CONCATENATE(IF(B2,B$1 & ",",""),IF(C2,C$1 & ",",""),IF(D2,D$1 & ",",""))
お礼
圧巻です。。。 CONCATENATE、、、知りませんでした。 まだまだ勉強が足りないようです。 ありがとうございました。
補足です。 果物の種類がもっと多い場合には、それらをいくつかのグループに分けて#1のような式を個別に適用し(作業列に)、結果の文字列を & で結合されたらよいでしょう。 あるいは、もっと簡単に、果物ごとに作業列を使って =IF(B2>0,B$1,"") などとして、同様にされてもよいでしょう。
お礼
できれば作業列を使わないでできればと思っていたので・・・。 member_idさまの初めの回答に満足しています。 ありがとうございました。
お礼
できました、できました! やっぱりできる方にはできるものなのですねぇ~! =IF(B2>0, まではなんとなくそんな感じがしたのですが、その後がまったく浮かびませんでした。 ありがとうございました。