[[20050111142557]] 『検索して抜き出した文字列をくっつける。』(プーさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『検索して抜き出した文字列をくっつける。』(プーさん)
いつもお世話になっております。
以下のような文字列のくっつけ方をご存知の方、教えてください。
        A                        B               C
1    ABC                  商品代     ”商品代、保険料”
2   EFZ                   運賃      
3   RET                船代    
4   ABC                  商品代     
5   LEC                  機械代     
6   ABC                  保険料     

A列から”ABC" を検索して、それに該当するB列を抜き出します。
ここでは、A1とA4の”商品代”とA6の”保険料”ですね。
この抜き出した”商品代”と”保険料”を、C1に”商品代、保険料”として表したいと思っています。
ポイントは、ABCの”商品代”という重複を無視することです。
配列数式、CONCATENATEなどいろいろと試みましたが、どうもうまくいきません。
ご存知の方宜しくお願いします。


 多分、こんなことじゃないと思うけど、レスがついていなかったのと
ちょっと息抜きで考えてみました。
D列を作業列に使います。
D1からD6を選択した状態で数式バーに
=IF(MATCH(B1:B6,B1:B6,0)=ROW(B1:B6),B1:B6,"")
と入力してCtrl+Shift+Enterで確定します。
次にC1に
=INDEX(D1:D6,SMALL(IF((A1:A6="ABC")*(D1:D6<>""),ROW(D1:D6)),ROW(A1)))&"、"&
INDEX(D1:D6,SMALL(IF((A1:A6="ABC")*(D1:D6<>""),ROW(D1:D6)),ROW(A2)))
と入力してCtrl+Shift+Enterで確定します。
ABC	商品代	商品代、保険料	商品代
EFZ	運賃		     運賃
RET	船代		     船代
ABC	商品代		
LEC	機械代		     機械代
ABC	保険料		     保険料
するとこんな感じになりました。
今回限定ということで何かの参考になれば幸いです。
ではでは、春はまだまだ遠い。。SoulManでした。
http://ryusendo.no-ip.com/cgi-bin/upload/src/up0207.xls

 朝起きてよく考えたら作業列は不要でしたね(^^;;;
C1に
=INDEX(B1:B6,SMALL(IF((A1:A6="ABC")*(MATCH(B1:B6,B1:B6,0)=ROW(B1:B6)),ROW(A1:A6)),ROW(A1)))&"、"&
INDEX(B1:B6,SMALL(IF((A1:A6="ABC")*(MATCH(B1:B6,B1:B6,0)=ROW(B1:B6)),ROW(A1:A6)),ROW(A2)))
と入力してCtrl+Shift+Enterでどでしょう?
もっと奥がありそうですが、、、
(SoulMan)

 ちょっと遅くなりました。作業列を使う方法で考えました。
作業列(E列)では、検索値(G1セルにABCと入力とします)と合致したB列を表示します。
E1セルに下の式を入れて、E6までコピー
=IF(A1=$G$1,B1,"")
作業列(F列)では、E列で重複するものを除き且つ該当する2番目以降の前に『、』を付けます。
F1セルには、 =E1 とし、F2セルに下の式を入れてF6までコピー
=IF(E2="","",IF(COUNTIF($E$1:E2,E2)=1,IF(COUNTA($F$1:F1)-COUNTIF($F$1:F1,"")>=1,"、"&E2,E2),""))
んでもって、問題はC1セルへの表示ですが、頭とお尻の『"』は、上手く認識してくれませんので、
 (※詳しい理由は、私には分りません。多分文字列として認識しなさい! みたいな感じだと思います。)
『''』=シングル2個で対応しました。
=IF(COUNTIF(A1:A6,G1),CONCATENATE("ここ",F1,F2,F3,F4,F5,F6,"ここ"),"ありませんからー、残念!")
YukiWikiの文字装飾ルールと重なってしまうので、上記の『ここ』の部分は、
実際は『''』に差し替えてください。
(sin)
ちょっと別件:SoulManさん、お久しぶり〜。まだまだ続いてるんですか? ファイト!ですー。

プーさんです。皆さんありがとうございます。
いろいろと考えていただき、ありがとうございました。

 ろくに回答もしてないけど、プーさんちょっとお借りします。
 sinさんへ
頭*〜( ///// )ヽ(゚ロ゚)ノ爆発寸前!?
 って感じです。
 >まだまだ続いてるんですか?
 春は、、まだまだ、、です。。頑張ります。しかし、ワードってむずいですね(^^;;;
 お邪魔しました。m(__)m
(SoulMan) 

プーさんです。たびたびお世話になっております。
前回の質問の内容を少し変えて、再び質問させていただきます。
       A                  B             C                  D
1     ABC                 商品代     ABC            "商品代、保険料"
2   EFZ                  運賃      EFZ           "運賃”
3   LEC                 船代       LEC            "船代、機械代”
4   ABC                  商品代     
5   LEC                  機械代     
6   ABC                  保険料
例えば、上の例のように
A列から文字列を検索、それに対応するB列の文字列を、
C列を参照してD列にくっつけて表示する。
こんなことができる数式ありましょうか?
ちなみにC列はベタ打ちし、D列に入力する数式にどんな
ものがあるかと思っております。  

 只今考え中・・・只今考え中・・・
(sin)


 思い切り作業列を使った方法です(^_^A;
	 A	 B	 C	 D    	 E	 F	 G	 H	 I	 J	 K
  1	ABC	商品代	ABC	"商品代,保険料"	商品代	保険料					"商品代,保険料,,,,"
  2	EFZ	運賃	EFZ	"運賃"  	運賃						"運賃,,,,,"
  3	LEC	船代	LEC	"船代,機械代"	船代	機械代					"船代,機械代,,,,"
  4	ABC	商品代									
  5	LEC	機械代									
  6	ABC	保険料									
 D1=IF(C1="","",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(K1,",,,",""),",,",""),",","",COUNTIF(E1:J1,"?*")))
 E1=IF(SUM(N(($A$1:$A$6=$C1)*(MATCH($B$1:$B$6,$B$1:$B$6,0))=ROW($B$1:$B$6)))<COLUMNS($E1:E1),"",INDEX($B$1:$B$6,SMALL(IF(($A$1:$A$6=$C1)*(MATCH($B$1:$B$6,$B$1:$B$6,0))=ROW($B$1:$B$6),ROW($A$1:$A$6),""),COLUMNS($E1:E1)),1))
 として、Shift+Ctrlキー押しながらEnterキーで確定させて配列数式にしてJ1までコピー
 K1=CONCATENATE("""",E1,",",F1,",",G1,",",H1,",",I1,",",J1,"""")

 項目6つまでしか対応してませんけど_/ ̄|○ il||li
 (川野鮎太郎)

 ユーザー定義関数で作って見ました。
Function MyLOOKUP(adr As Range, rag As Range, colm As Integer) As String
    Dim c As Range
    Dim Myval As String
    Dim i As Long
    Dim flag As Integer

    Application.Volatile

    For Each c In rag
        If adr.Value = c.Value Then
            If Myval = "" Then
                Myval = c.Offset(, colm - 1).Value
            Else
                For i = 1 To Len(Myval)
                    If c.Offset(, colm - 1).Value = _
                        Mid(Myval, i, Len(c.Offset(, colm - 1).Value)) Then
                        flag = 1
                        Exit For
                    Else
                        flag = 0
                    End If
                Next i
                If flag = 0 Then
                    Myval = Myval & "," & c.Offset(, colm - 1).Value
                End If
            End If
        End If
    Next c
    If Myval = "" Then
        MyLOOKUP = "該当なし"
    Else
        MyLOOKUP = """" & Myval & """"
    End If
 End Function
こんなんで、よかったら見てください。
 http://ryusendo.no-ip.com/~ken/cgi-bin/uploader/src/0003.xls
(ケン)

 参りました。。。
私の考え方だと、右方向の配列数式を認識してくれなくなったので、
  ABC                EFZ       LEC
 "商品代、保険料"    "運賃”    "船代、機械代”
   ・         ・     ・
   ・         ・     ・
こんな感じで、下方向への作業展開に変更していただく方向で考えてました。(一応出来ました!)
ただ、ご要望とは違いますので
 お二人さん (むふっ、ここはリンクしてませんよ!) <<< あっと、これは、無視してください、)
に、おんぶにだっこさせていただきます。
しかし、 =""""  これは、知らなかった! ありがたや、ありがたや、、、 (sin)


 えーっと・・
お二人さん (むふっ、ここはリンクしてませんよ!)
 ↑何のことかしら〜〜♪〜〜( ̄ε ̄;;) 

 復活!!! っていうか、SoulManさんと川野鮎太郎さんのとで勉強し直してきました。
そこには、『重大な××』が・・・
F列からL列までを作業列とします。
F1セルに
=A1&"_"&B1   これは、G列〜L列までの計算用の作業用です。
G1セルに
=IF($C1="","",IF(COUNTIF($A$1:$A$6,$C1)=0,"",INDEX($B$1:$B$6,SMALL(IF(($A$1:$A$6=$C1)*(MATCH($F$1:$F$6,$F$1:$F$6,0)=ROW($F$1:$F$6)),ROW($A$1:$A$6)),COLUMN(A1)))))
として、Ctrl+Shift+Enter で確定。
H1セルに
=IF($G1="","",IF(ISNUMBER(SMALL(IF(($A$1:$A$6=$C1)*(MATCH($F$1:$F$6,$F$1:$F$6,0)=ROW($F$1:$F$6)),ROW($A$1:$A$6)),COLUMN(B1))),"、"&INDEX($B$1:$B$6,SMALL(IF(($A$1:$A$6=$C1)*(MATCH($F$1:$F$6,$F$1:$F$6,0)=ROW($F$1:$F$6)),ROW($A$1:$A$6)),COLUMN(B1))),""))
として、Ctrl+Shift+Enter で確定し、これをL1セルまでコピー。
D1セルに
=IF(C1="","",IF(G1="","該当無し",CONCATENATE(""" ",G1,H1,I1,J1,K1,L1," """)))
D1:L1を6行目までコピーして完了!

 『重大な××』について、
 ABC	商品代
 ABC	商品代
 EFZ	商品代
 LEC	商品代
元データをこれで試してください。B列のみのマッチングだと全て 1 になります。
(sin) 


 アイタwΣ(ノ∀`)ペチッ
 上記の私の案はポイッ(。・ω・)σ ⌒* してください。(^_^A;
 (川野鮎太郎)

お返事が遅れて申し訳ありません。sinさま、ケンさま、川野さま、ありがとうございました。

お陰さまですごく助かります。しかし、見事な数式です。ふうむ、私ももっと勉強します。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.