Pamには2列のデータがあります。列Aには、A、B、Cなどの単純な識別子があります。列Bには、一連の整数値があります。

彼女はデータを識別子で並べ替えることができ、次に整数値で並べ替えることができます。ここで、彼女は列Cに、特定の識別子のすべての整数値を連結する数式を作成したいと考えています。したがって、A1:A4にすべて識別子Aが含まれている場合、セルC1で、B1:B4のすべての値を連結し、「11、17、19、25」のようにコンマで除算します。各識別子の行数は異なる可能性があるため、Pamは連結をどのように行うかがわかりません。

これを実現する最も簡単な方法は、ユーザー定義関数として作成できるマクロを使用することです。次に例を示します:

Function CatSame(c As Range) As String     Application.Volatile     sTemp = ""

iCurCol = c.Column     If iCurCol = 3 Then         If c.Row = 1 Then             sLast = ""

Else             sLast = c.Offset(-1, -2)

End If         If c.Offset(0, -2) <> sLast Then             J = 0             Do                 sTemp = sTemp & ", " & c.Offset(J, -1)

J = J + 1             Loop While c.Offset(J, -2) = c.Offset(J - 1, -2)

sTemp = Right(sTemp, Len(sTemp) - 2)

End If     End If     CatSame = sTemp End Function

この関数は基本的に、渡された値(セル参照)を受け取り、セル参照が列Cのものであることを確認します。そうである場合は、列Aの値に基づいて列Bの値の連結を開始します。値が列Aで、その上の行の値と異なる場合は、連結された値の文字列を返します。

識別子が列Aにあり、連結される値が列Bにあるとすると、列Cに次のように配置できます。

=CatSame(C1)

これを必要な限り列Cにコピーすると、Pamが望んでいたものが正確に得られます。

より用途の広い関数は、VLOOKUPのように機能する関数ですが、検索しているものに一致する値の連結リストを返します。次の関数について考えてみます。

Function VLookupAll(vValue, rngAll As Range, _   iCol As Integer, Optional sSep As String = ", ")

Dim rCell As Range     Dim rng As Range     On Error GoTo ErrHandler

Application.Volatile     Set rng = Intersect(rngAll, rngAll.Columns(1))

For Each rCell In rng         If rCell.Value = vValue Then _           VLookupAll = VLookupAll & sSep & _           rCell.Offset(0, iCol).Value     Next rCell

If VLookupAll = "" Then         VLookupAll = CVErr(xlErrNA)

Else         VLookupAll = Right(VLookupAll, Len(VLookupAll) - Len(sSep))

End If ErrHandler:

If Err.Number <> 0 Then VLookupAll = CVErr(xlErrValue)

End Function

この関数は最大4つの引数を取ります。 1つ目は、ルックアップで照合する値です。 Pamのインスタンスでは、これはA、B、Cなどの必要な識別子になります。2番目の引数は、一致を探すセルの範囲です(この場合は列A)。

3番目の引数は(2番目の引数の範囲からの)オフセットです

これは、連結する値を表します。この関数は次のように使用できます:

=VLookupAll("B",A1:A99,1)

値の間に異なる区切り文字を指定する場合は、オプションの4番目の引数を使用して指定できます。たとえば、次の文字列はダッシュで各値を区切ります:

=VLookupAll("B",A1:A99,1,"-")

これまでのソリューションは、マクロの使用に重点を置いてきました。この理由は比較的単純です。Pamが必要とすることを実行できる数式ベースのソリューションはありません。ネストされたIFステートメントを使用して列Aの内容を評価することは、IFステートメントをネストできる深さに制限があるため、うまく機能しません。

連結された値が列Aの識別子の最後のインスタンスにあることを気にしない場合は、数式と中間結果を使用できます。この数式をセルC1に配置することから始めます。

=B1

この数式はセルC2に入力する必要があります:

=IF(A2=A1,C1 & ", " & B2, B2)

この数式を必要な数の行にコピーします。最終的には、列Cの一連の連結値がますます長くなり、各実行で最も長いものが列Aの最後の順次識別子と同じ行になります。次に、列の該当するすべてのセルに次のように入力できます。 D:

=IF(LEN(C2)>LEN(C1),"",C1)

この数式は、列Cの最長の文字列のみを表示します。これは、Pamが最初に必要としたものです。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(9197)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。