キャシーは、倉庫内のすべての部品の情報を含むワークシートを持っています。このシートでは、部品番号は12345 XXXの形式で列Aに示されています。ここで、XXXはロケーションコードを表します。つまり、同じ部品番号のワークシートに複数のエントリを含めることができますが、各エントリはその部品の異なる場所を表します。キャシーは、ロケーションコードに関係なく、各部品番号に関連付けられた値を合計する式を必要としています。したがって、彼女は部品12345 ABC、12345 DEF、12345GHIなどに関連する数量列を合計する方法が必要です。

彼女は、ロケーションコードを別の列に分割せずにこれを行う方法を必要としています。

希望する答えを得る方法は複数あります。このヒントの例のために、部品番号が列Aにあり(キャシーが示したように)、各部品の数量が列Bにあると仮定します。これらの数量を合計する必要があるのは、列Aの各セルにあるものの一部。さらに、セルD2に必要な部品番号(ロケーションコードを除く)を入力できます。

最初の解決策は、次のようにSUMPRODUCT関数を使用することです。

=SUMPRODUCT(--(VALUE(LEFT(A2:A49,FIND(" ",A2:A49)))=D2),B2:B49)

この式は、A2:A49の範囲の値をチェックします。この範囲が実際のデータの範囲を反映していることを確認する必要があります。 (A:AとB:Bのように)列AとBのすべてを参照するように数式を一般化すると、数式を列の空のセルに適用しようとするため、#VALUEエラーが発生します。 。

次のような配列数式を使用すると、同様の結果を得ることができます。

=SUM(B:B*(LEFT(A2:A49,5)=TEXT(D2,"@")))

繰り返しになりますが、これは配列数式であるため、Shift + Ctrl + Enterを押して入力する必要があります。また、この式は、比較のためにD2の値をテキストに変換することにも注意してください。前の式では、列Aから選択された部分文字列がVALUE関数を使用して数値に変換されたため、これは実行されませんでした。

DSUM関数を使用して、作業式を作成することもできます。部品番号(列A)のセルA1に列ヘッダーがあると仮定します。

この列ヘッダー(「部品番号」など)をワークシートの別のセル(セルD1など)にコピーします。セルD2に、ロケーションコードなしで部品番号を入力し、その後にアスタリスクを入力します。たとえば、セルD2に「12345 *」(引用符なし)を入力できます。その仕様を設定すると、次の式を使用できます。

=DSUM($A$1:$B$49,$B$1,D1:D2)

この数式は、セルD2の指定(文字12345の後に何かが続く)を、列Bの値を合計するキーとして使用します。

最後に、セルD2にDSUMアプローチで使用したものと同じ仕様がある場合は、次のように非常に単純なSUMIF関数を使用できます。

=SUMIF(A:A,D2,B:B)

このアプローチでは、数式で列範囲全体(A:AおよびB:B)を使用できることに注意してください。

部品番号(列A)の形式が希望どおりに一貫していない場合は、ユーザー定義関数を作成して数量を検索する方がよい場合があります。たとえば、部品番号が常に同じ長さであるとは限らない場合、または部品番号に数字と文字またはダッシュの両方を含めることができる場合は、UDFが最適です。次の例はうまく機能します。値に少なくとも1つのスペースが存在することをキー入力します。 (キャシーは、スペースが部品番号をロケーションコードから分離していることを示しました。)

Function AddPrtQty(ByVal Parts As Range, PartsQty As Range, _   FindPart As Variant) As Long     Dim Pos As Integer     Dim Pos2 As Integer     Dim i As Long     Dim tmp As String     Dim tmpSum As Long     Dim PC As Long

PC = Parts.Count     If PartsQty.Count <> PC Then         MsgBox "Parts and PartsQty must be the same length", vbCritical         Exit Function     End If

For i = 1 To PC         Pos = InStr(1, Parts(i), " ")

Pos2 = InStr(Pos + 1, Parts(i), " ")



If Pos2 > Pos And Len(Parts(i)) > Pos + 1 Then             tmp = CStr(Trim(Left(Parts(i), Pos2 - 1)))

ElseIf Pos > 0 And Len(Parts(i)) > 0 Then             tmp = CStr(Trim(Left(Parts(i), Pos - 1)))

End If

If CStr(Trim(tmp)) = CStr(Trim(FindPart)) Then             tmpSum = tmpSum + PartStock(i)

End If     Next i

AddPrtQty = tmpSum End Function

この関数を使用するには、ワークシートで2つの範囲と必要な部品番号を使用して関数を呼び出します。

=AddPrtQty(A2:A49,B2:B49,"GB7-QWY2")

注:

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

link:/ excelribbon-ExcelTipsMacros [ここをクリックして、新しいブラウザタブでその特別なページを開きます]

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

このヒント(11469)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。

Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります:

link:/ excel-Summing_Based_on_Part_of_the_Information_in_a_Cell [セル内の情報の一部に基づく合計]