2017-02-01 23 views
3

私はそうのようなデータシートを持っている:Excel:すべての一致する値を検索し、コンマ区切りのリストに入れますか?

Col A Col B Col C Column D Col E Column F  Col G Col H  Col I Col J  Col K  
          1234    Supplier 1 
          2222    Supplier 2 
          3333    Supplier 2 
          4444    Supplier 1 

私はまた別のシートに

Home sheet: 

Column B 
Supplier 1 <-- Values Produced From Index Match Formula 
Supplier 2 

を持って、私は上の供給者名欄D、データシート、から項目番号のすべてを一覧表示したいですホームシートが一致します。私はVBAでユーザー定義関数を使用して、これをやっている現時点で

Home sheet:  

Column B   Column C 
Supplier 1  1234, 4444 
Supplier 2  2222, 3333 

はしかし、私はそうのようなカンマ区切りリストで、一つのセルに一致する項目番号のすべてを配置します:

Function SingleCellExtract(LookupValue As String, LookupRange As Range, ColumnNumber As Integer, Char As String) 
'Updateby20150824 
    Dim I As Long 
    Dim xRet As String 
    For I = 1 To LookupRange.Columns(1).Cells.Count 
     If LookupRange.Cells(I, 1) = LookupValue Then 
      If xRet = "" Then 
       xRet = LookupRange.Cells(I, ColumnNumber) & Char 
      Else 
       xRet = xRet & "" & LookupRange.Cells(I, ColumnNumber) & Char 
      End If 
     End If 
    Next 
    SingleCellExtract = Left(xRet, Len(xRet) - 1) 
End Function 

そして結果を取得するには、次の式を使用して:

=SingleCellExtract(B14,Data!F:F,-1,",") 

ティしかし、私は500行以上のデータを持っており、この方法は計算に約10分以上かかり、時にはシートがクラッシュすることもあります。

誰かが私にこれを行うより良い方法を教えてください。

答えて

2

即時改善ではなく、各チェックのためのセルを参照するよりも、配列にデータを置くために、次のようになります。

Function SingleCellExtract(LookupValue As String, LookupRange As Range, LookupCol As Long, ReturnCol As Long, Char As String) 
'Updateby20150824 
    Dim varTMP As Variant, I As Long 
    varTMP = LookupRange 
    Dim xRet As String 
    For I = 1 To UBound(varTMP, 1) 
     If varTMP(I, LookupCol) = LookupValue Then 
      If xRet = "" Then 
       xRet = varTMP(I, ReturnCol) 
      Else 
       xRet = xRet & Char & varTMP(I, ReturnCol) 
      End If 
     End If 
    Next 
    SingleCellExtract = xRet 
End Function 

私はまた、LEN /左の必要性を回避するために、あなたの戻りラインとxRetロジックを修正しました。

私はここにそれが行く、私の解決策は、あなたに興味がある願っています
+0

これは最初のセルでのみ動作するように思われますが、#VALUEエラーを表示する列の下にある他のすべてのセルが表示されます – user7415328

+0

それは私の最後のテストでは問題ありませんが、既存の関数は、ルックアップ列がソースデータの最初の列であることを期待しています。私はルックアップとカラムのパラメータを返す答えを編集しました。この修正された関数は、与えられたデータ構造に対して完全に機能します。 (http://i.imgur.com/TmTea9d.png) – Zerk

+0

私は何をしているのか分かりませんが、それは単に私のためにはうまくいかないでしょう。それは#Valueと言い続ける。私はExcelを再起動しました、私は細胞が計算していることを確認しました。それがあなたのために働くなら、なぜ私にとってはうまくいかないのか分かりません。それが差をつけているなら、私が使っているのはそれだから、Excel 2013を使っていますか? – user7415328

0

: あなたが使用している2つの列でソートしてデータであれば、それはこのようなものになります。

SupplierID Text 
1   Foo 
1   Bar 
1   FooBar 
2   Foo 
2   Bar 
2   FooBar 

を今ちょうどこの数式を追加Result列に:

SupplierID Text Result 
1   Foo  Foo 
1   Bar  Foo, Bar 
1   FooBar Foo, Bar, FooBar 
2   Foo  Foo 
2   Bar  Foo, Bar 
2   FooBar Foo, Bar, FooBar 

=IF(A2<>A1,B2,CONCATENATE(C1,", ",B2)) 

これは、このような出力を作成します。

最後に、すべての列に同じテキストをコピーすることができます。 私はこれが助けてくれることを願っています!

関連する問題