エクセルの関数に関してです。

カラム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に
入れたいのです。

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/19 00:27:31
  • 終了:2011/06/26 00:30:03

回答(2件)

id:TransFreeBSD No.1

TransFreeBSD回答回数667ベストアンサー獲得回数2682011/06/19 14:32:55

ポイント50pt

区切った文字が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)

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

id:martytaka

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

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

2011/06/19 19:22:38
id:TransFreeBSD No.2

TransFreeBSD回答回数667ベストアンサー獲得回数2682011/06/20 00:54:54

ポイント50pt

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

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
  • id:martytaka
    また、カラムBやカラムCが空欄の場合は、下記の要領でお願いいたします。
    カラムA   カラムB  カラムC
    1234GGGG   空欄    1*2
    の場合、
    カラムD  カラムE
    1234GGGG  1
    1234GGGG  2

    カラムA   カラムB  カラムC
    1234GGGG   A*B    空欄
    の場合、
    カラムD   カラムE
    1234GGGG*A  空欄
    1234GGGG*B  空欄

    一番良い回答にはイルカ賞を進呈させて頂きます。
  • id:Mook
    関数でっていうことはマクロ不可ってことかな?
  • id:TransFreeBSD
    カラムBやCの区切った文字(*の間の文字)は、いつも1文字ですか?
  • id:KuroNeko666
    正直なところ、何をやりたいのかその仕様では読み取れず…

    カラムC には、もともと何かで定義された情報が入ってるのに、別な関数を入れていいのですか?

    A1 B1 C1 D1
    1234GGGG A*B 1*2 =A2&"*"&LEFT(B2,SEARCH("~*",B2,1)-1)
    となっているということ?

    関数でできることは "その関数が入ってるセル" に、他のセルやブックから情報をかき集めて処理した情報を "表示する" ことです。
    他のセルに情報を表示させるのは、関数ではできません。
    "並び替えた一覧" を作成するのは、すでにマクロを組まなければできない領域です。

  • id:martytaka
    区切った文字は、最大5文字の英数字です。。
    よろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません