人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルの関数に関してです。
カラムAに任意の文字列が入っています。
例:1234GGGG
カラムBには、下記のような「*」で区切られた文字列があります。
A*B
A*B*C
A*B*C*D
1*2*3

カラムCにも、下記のように「*」で区切られた文字列があります。
A*B
A*B*C
1*2*3

上記のように、
カラムA カラムB カラムC
1234GGGG A*B 1*2*3
のようになっていた時、「*」を目印にして、
カラムD カラムE
1234GGGG*A 1
1234GGGG*A 2
1234GGGG*A 3
1234GGGG*B 1
1234GGGG*B 2
1234GGGG*B 3
のように並び替えた一覧を表示させる関数をカラムCに
入れたいのです。

また、書ききれなかったので空欄の場合に関して
下のコメント欄も御参照ください。
一番良い回答にはイルカ賞を進呈させて頂きます。
よろしく、お願いいたします。


●質問者: martytaka
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:イルカ賞 エクセル カラム コメント欄 文字列
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● TransFreeBSD
●50ポイント

区切った文字が1文字と仮定すると下記になるかなと思います。

1234GGGGA*B1*2*3=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A1)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A1)-row(A$1))*2,len(C$1)+1)+1,1)
=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A2)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A2)-row(A$1))*2,len(C$1)+1)+1,1)
=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A3)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A3)-row(A$1))*2,len(C$1)+1)+1,1)
=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A4)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A4)-row(A$1))*2,len(C$1)+1)+1,1)
=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A5)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A5)-row(A$1))*2,len(C$1)+1)+1,1)
=A$1&if(isnontext(B$1),"","*"&mid(B$1,int( (row(A6)-row(A$1))*2/max(2,len(C$1)+1))*2+1,1))=mid(C$1,mod( (row(A6)-row(A$1))*2,len(C$1)+1)+1,1)

区切った文字が不定長なら作業用セルか、自作関数が必要になります。

◎質問者からの返答

区切った文字は、最大5文字の英数字です。。

よろしくお願いいたします。


2 ● TransFreeBSD
●50ポイント

取り合えずワーク使ってやるとこんな感じでしょうか。標準の関数だけだとこんなになってしまいます。

1234GGGGA*BC1*12*3=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F1+1), min(index(B:B, F1+2), len(B$1)+2) -index(B:B, F1+1) -1))=mid(C$1, index(C:C, G1+1), min(index(C:C, G1+2), len(C$1)+2) -index(C:C, G1+1) -1)=int( (row(A1) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A1) -row(A$1), match( max(C:C), C:C) -1)+1
11=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F2+1), min(index(B:B, F2+2), len(B$1)+2) -index(B:B, F2+1) -1))=mid(C$1, index(C:C, G2+1), min(index(C:C, G2+2), len(C$1)+2) -index(C:C, G2+1) -1)=int( (row(A2) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A2) -row(A$1), match( max(C:C), C:C) -1)+1
=if(isnumber(find("*", B$1, B2)), find("*", B$1, B2)+1, "")=if(isnumber(find("*", C$1, C2)), find("*", C$1, C2)+1, "")=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F3+1), min(index(B:B, F3+2), len(B$1)+2) -index(B:B, F3+1) -1))=mid(C$1, index(C:C, G3+1), min(index(C:C, G3+2), len(C$1)+2) -index(C:C, G3+1) -1)=int( (row(A3) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A3) -row(A$1), match( max(C:C), C:C) -1)+1
=if(isnumber(find("*", B$1, B3)), find("*", B$1, B3)+1, "")=if(isnumber(find("*", C$1, C3)), find("*", C$1, C3)+1, "")=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F4+1), min(index(B:B, F4+2), len(B$1)+2) -index(B:B, F4+1) -1))=mid(C$1, index(C:C, G4+1), min(index(C:C, G4+2), len(C$1)+2) -index(C:C, G4+1) -1)=int( (row(A4) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A4) -row(A$1), match( max(C:C), C:C) -1)+1
=if(isnumber(find("*", B$1, B4)), find("*", B$1, B4)+1, "")=if(isnumber(find("*", C$1, C4)), find("*", C$1, C4)+1, "")=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F5+1), min(index(B:B, F5+2), len(B$1)+2) -index(B:B, F5+1) -1))=mid(C$1, index(C:C, G5+1), min(index(C:C, G5+2), len(C$1)+2) -index(C:C, G5+1) -1)=int( (row(A5) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A5) -row(A$1), match( max(C:C), C:C) -1)+1
=if(isnumber(find("*", B$1, B5)), find("*", B$1, B5)+1, "")=if(isnumber(find("*", C$1, C5)), find("*", C$1, C5)+1, "")=A$1&if( isnontext(B$1), "", "*"&mid(B$1, index(B:B, F6+1), min(index(B:B, F6+2), len(B$1)+2) -index(B:B, F6+1) -1))=mid(C$1, index(C:C, G6+1), min(index(C:C, G6+2), len(C$1)+2) -index(C:C, G6+1) -1)=int( (row(A6) -row(A$1))/(match( max(C:C), C:C) -1))+1=mod(row(A6) -row(A$1), match( max(C:C), C:C) -1)+1

以下、今試せないので未確認ですがのっけておきます。

ちょっとした関数作ってやればシンプルになります。

1234GGGGA*BC1*12*3=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A1)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A1)-row(A$1),split_len(C$1,"*")))
=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A2)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A2)-row(A$1),split_len(C$1,"*")))
=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A3)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A3)-row(A$1),split_len(C$1,"*")))
=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A4)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A4)-row(A$1),split_len(C$1,"*")))
=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A5)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A5)-row(A$1),split_len(C$1,"*")))
=A$1&if(isnontext(B$1),"","*"&split_get(B$1,"*",int( (row(A6)-row(A$1))/split_len(C$1,"*"))))=split_get(C$1,"*",mod(row(A6)-row(A$1),split_len(C$1,"*")))

自作関数は以下のようなのを作ればOKだと思う。

Function split_get(src, delim, index)
 tmp = Split(src, delim)
 split_get = tmp(index)
End Function

Function split_len(src, delim)
 tmp = Split(src, delim)
 split_len = UBound(tmp)+1
End Function
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ