「VLOOKUPでデータを引っ張ってきたけど、合計がうまくいかない…」
「商品マスタから単価を取得して、売上の合計を計算したい」
「複数の表を使って効率よく集計したい」
Excelを使っていると、このような悩みにぶつかる人がとても多いです。特に、売上管理や在庫管理で複数の表を扱うときは、VLOOKUPと合計を組み合わせる場面がよくありますよね。
VLOOKUPは便利な関数ですが、そのままでは複数の値を合計することはできません。しかし、適切な方法を使えば、VLOOKUPと合計処理を効果的に組み合わせることができます。
今回は、初心者でもスッと理解できるように、VLOOKUPでデータを取得してから合計を出す方法をていねいに解説します。また、よくある失敗例や、その対処法についても詳しくお話しするので、ぜひ最後まで読んでください。
VLOOKUPで合計がうまくいかない理由

VLOOKUP関数の基本的な性質
まず最初に、なぜ「VLOOKUPで合計ができない」と感じるのでしょうか。理由はシンプルで、VLOOKUP関数自体は「一つの値」を返す関数だからです。
VLOOKUPの基本動作
VLOOKUPの構文
=VLOOKUP(検索値, 範囲, 列番号, 完全一致)
機能
- 指定した範囲から一致する値を見つける
- その行の指定列の値を返す
- 単一のデータのみを返す
具体的な例
商品マスタテーブル
商品コード | 商品名 | 単価 |
---|---|---|
A001 | りんご | 100 |
A002 | みかん | 80 |
A003 | ぶどう | 200 |
VLOOKUPの使用例
=VLOOKUP("A001", 商品マスタ, 3, FALSE)
結果
- 「A001」の単価「100」が返される
- あくまで1つの値のみ
なぜ合計が必要になるのか
実際のビジネスシーン
売上管理での問題
売上データテーブル
日付 | 商品コード | 数量
2025-01-01 | A001 | 5
2025-01-02 | A001 | 3
2025-01-03 | A002 | 7
求めたい結果
- 各行の売上金額(単価 × 数量)
- 日別・商品別の売上合計
- 全体の売上合計
VLOOKUPだけでは不十分
- 単価は取得できる
- しかし、複数行の合計は別の処理が必要
【方法1】ヘルパー列を使った基本的な解決方法
最もわかりやすいアプローチ
初心者にとって最も理解しやすいのは、ヘルパー列を作って段階的に計算する方法です。
具体的な手順
ステップ1:データの準備
商品マスタ(シート1)
A列 | B列 | C列 |
---|---|---|
商品コード | 商品名 | 単価 |
A001 | りんご | 100 |
A002 | みかん | 80 |
A003 | ぶどう | 200 |
売上データ(シート2)
A列 | B列 | C列 | D列 |
---|---|---|---|
日付 | 商品コード | 数量 | 単価 |
2025-01-01 | A001 | 5 | (VLOOKUPで取得) |
2025-01-02 | A001 | 3 | (VLOOKUPで取得) |
2025-01-03 | A002 | 7 | (VLOOKUPで取得) |
ステップ2:VLOOKUPで単価を取得
D2セルに以下の式を入力:
=VLOOKUP(B2, 商品マスタ!$A$2:$C$4, 3, FALSE)
ステップ3:売上金額を計算
E2セルに以下の式を入力:
=C2*D2
ステップ4:合計を計算
E5セルに以下の式を入力:
=SUM(E2:E4)
完成した表
A列 | B列 | C列 | D列 | E列 |
---|---|---|---|---|
日付 | 商品コード | 数量 | 単価 | 売上金額 |
2025-01-01 | A001 | 5 | 100 | 500 |
2025-01-02 | A001 | 3 | 100 | 300 |
2025-01-03 | A002 | 7 | 80 | 560 |
合計 | 1360 |
この方法のメリット・デメリット
メリット
- 理解しやすい:処理が段階的で分かりやすい
- デバッグしやすい:各ステップの結果を確認できる
- 修正しやすい:問題があった場合の修正が簡単
デメリット
- 列数が増える:ヘルパー列が必要
- ファイルサイズ:データが多いと重くなる
- 見た目:表が複雑に見える
【方法2】SUMPRODUCT関数を使った高度な解決方法

配列計算による効率的な処理
SUMPRODUCT関数は、配列同士を掛け合わせて合計する関数です。条件付きの合計計算に非常に効果的です。
基本的な構文
=SUMPRODUCT(配列1, 配列2, ...)
条件付き合計での活用
例:特定の商品コードの売上合計
=SUMPRODUCT((売上データ!B:B="A001")*(売上データ!C:C)*
(VLOOKUP(売上データ!B:B,商品マスタ!A:C,3,FALSE)))
式の解説
(売上データ!B:B="A001")
:条件(TRUE/FALSE → 1/0)売上データ!C:C
:数量VLOOKUP(...)
:各行の単価を取得- これらを掛け合わせて合計
実践的な活用例
複数条件での合計
特定期間の特定商品の売上合計
=SUMPRODUCT((売上データ!A:A>=DATE(2025,1,1))*
(売上データ!A:A<=DATE(2025,1,31))*
(売上データ!B:B="A001")*
(売上データ!C:C)*
(VLOOKUP(売上データ!B:B,商品マスタ!A:C,3,FALSE)))
動的な条件での合計
セル参照を使った動的な条件
=SUMPRODUCT((売上データ!B:B=F1)*
(売上データ!C:C)*
(VLOOKUP(売上データ!B:B,商品マスタ!A:C,3,FALSE)))
F1セルの値を変更するだけで、異なる商品の合計が計算されます。
SUMPRODUCTの注意点
パフォーマンスの考慮
大量データでの処理
- 全列参照(A:A)は避ける
- 必要最小限の範囲を指定
- 例:
A2:A1000
のように範囲を限定
最適化された例
=SUMPRODUCT((売上データ!B2:B1000="A001")*
(売上データ!C2:C1000)*
(VLOOKUP(売上データ!B2:B1000,商品マスタ!A:C,3,FALSE)))
【方法3】SUMIFS関数を使った条件付き合計
直接的な条件合計アプローチ
VLOOKUPを使わずに、SUMIFS関数で直接条件付き合計を行う方法もあります。
基本的な構文
=SUMIFS(合計範囲, 条件範囲1, 条件1, 条件範囲2, 条件2, ...)
実践的な活用
前提:売上データに単価列が既に存在する場合
A列 | B列 | C列 | D列 |
---|---|---|---|
日付 | 商品コード | 数量 | 売上金額 |
2025-01-01 | A001 | 5 | 500 |
2025-01-02 | A001 | 3 | 300 |
2025-01-03 | A002 | 7 | 560 |
特定商品の売上合計
=SUMIFS(D:D, B:B, "A001")
特定期間の特定商品の売上合計
=SUMIFS(D:D, B:B, "A001", A:A, ">=2025-01-01", A:A, "<=2025-01-31")
SUMIFSとVLOOKUPの組み合わせ
計算列なしでの実装
売上データに単価列がない場合、配列数式を使って実現できます:
=SUMPRODUCT(SUMIFS(売上データ!C:C, 売上データ!B:B, 商品マスタ!A:A)*
商品マスタ!C:C)
この式は複雑ですが、以下の処理を行います:
- 各商品の数量合計を計算
- 対応する単価を掛け合わせ
- 全体を合計
【方法4】ピボットテーブルを使った集計

GUI操作による効率的な集計
データが大量にある場合、ピボットテーブルが最も効率的な解決方法です。
基本的な手順
ステップ1:データの準備
- 売上データと商品マスタを結合
- PowerQueryやVLOOKUPで事前に単価を取得
ステップ2:ピボットテーブルの作成
- データ範囲を選択
- 「挿入」→「ピボットテーブル」
- 適切なフィールドを配置
ステップ3:フィールドの設定
- 行:商品コード、日付
- 値:売上金額(合計)
- フィルター:期間、カテゴリなど
高度な集計機能
計算フィールドの追加
売上金額 = 数量 * 単価
グループ化機能
- 日付の月別集計
- 商品カテゴリ別集計
- 地域別集計
ピボットテーブルのメリット
操作性
- ドラッグアンドドロップで簡単操作
- フィルター機能で柔軟な分析
- グラフ作成も同時に可能
性能
- 大量データでも高速処理
- メモリ効率が良い
- 自動更新機能
【実践編】業務での具体的な活用例
売上管理システム
月次売上レポート
データ構造
商品マスタ
商品コード | 商品名 | カテゴリ | 単価 | 原価 |
---|---|---|---|---|
A001 | りんご | 果物 | 100 | 60 |
A002 | みかん | 果物 | 80 | 50 |
B001 | 牛肉 | 肉類 | 500 | 300 |
売上データ
日付 | 商品コード | 数量 | 営業担当 | 地域 |
---|---|---|---|---|
2025-01-01 | A001 | 5 | 田中 | 東京 |
2025-01-02 | A001 | 3 | 佐藤 | 大阪 |
2025-01-03 | B001 | 2 | 田中 | 東京 |
集計式の例
商品別売上合計
=SUMPRODUCT((売上データ!B:B=商品マスタ!A2)*
(売上データ!C:C)*
(商品マスタ!D2))
地域別売上合計
=SUMIFS(売上金額, 地域, "東京")
営業担当別売上合計
=SUMIFS(売上金額, 営業担当, "田中")
在庫管理システム
在庫評価額の計算
在庫データ
商品コード | 在庫数 | 最終入荷日 | 保管場所 |
---|---|---|---|
A001 | 50 | 2025-01-01 | 倉庫A |
A002 | 30 | 2025-01-02 | 倉庫B |
B001 | 10 | 2025-01-03 | 倉庫A |
在庫評価額の計算
=SUMPRODUCT((在庫データ!A:A=商品マスタ!A:A)*
(在庫データ!B:B)*
(商品マスタ!E:E))
場所別在庫評価
倉庫A の在庫評価額
=SUMPRODUCT((在庫データ!D:D="倉庫A")*
(在庫データ!B:B)*
(VLOOKUP(在庫データ!A:A,商品マスタ!A:E,5,FALSE)))
購買管理システム
発注金額の計算
発注データ
発注日 | 商品コード | 発注数 | 仕入先 | 納期 |
---|---|---|---|---|
2025-01-01 | A001 | 100 | 農園A | 2025-01-03 |
2025-01-02 | A002 | 80 | 農園B | 2025-01-04 |
2025-01-03 | B001 | 20 | 牧場C | 2025-01-05 |
発注金額の計算
=SUMPRODUCT((発注データ!B:B=商品マスタ!A:A)*
(発注データ!C:C)*
(商品マスタ!E:E))
仕入先別発注金額
=SUMIFS(発注金額, 仕入先, "農園A")
【エラー対処法】よくある問題と解決策

#N/Aエラーの対処
原因と症状
主な原因
- 検索値が見つからない
- 表記の違い(全角/半角、スペースなど)
- データ型の不一致(文字列/数値)
症状
=VLOOKUP("A001", 商品マスタ, 3, FALSE)
→ #N/A
解決方法
方法1:IFERROR関数を使用
=IFERROR(VLOOKUP("A001", 商品マスタ, 3, FALSE), 0)
方法2:IF関数とISERROR関数を組み合わせ
=IF(ISERROR(VLOOKUP("A001", 商品マスタ, 3, FALSE)),
"該当なし",
VLOOKUP("A001", 商品マスタ, 3, FALSE))
方法3:XLOOKUP関数を使用(Office 365)
=XLOOKUP("A001", 商品マスタ!A:A, 商品マスタ!C:C, 0)
数値が合計されない問題
原因
文字列として保存された数値
- VLOOKUPで取得した値が文字列形式
- 見た目は数値だが、実際は文字列
解決方法
方法1:VALUE関数で変換
=VALUE(VLOOKUP(B2, 商品マスタ, 3, FALSE))
方法2:数値との演算で強制変換
=VLOOKUP(B2, 商品マスタ, 3, FALSE) * 1
方法3:データ型の統一
=--VLOOKUP(B2, 商品マスタ, 3, FALSE)
パフォーマンスの問題
大量データでの処理速度
問題
- 数万行のデータでVLOOKUPが遅い
- 複雑な数式でExcelが固まる
解決方法
方法1:INDEX/MATCH関数を使用
=INDEX(商品マスタ!C:C, MATCH(B2, 商品マスタ!A:A, 0))
方法2:範囲を限定
=VLOOKUP(B2, 商品マスタ!$A$2:$C$1000, 3, FALSE)
方法3:計算方法を手動に設定
- 「数式」→「計算方法」→「手動」
- 必要時にF9で計算実行
列番号の間違い
よくある間違い
範囲と列番号の不一致
=VLOOKUP(A2, B:D, 4, FALSE) # エラー:範囲はB:D(3列)なのに列番号4
正しい例
=VLOOKUP(A2, B:D, 3, FALSE) # 正しい:3列目(D列)を取得
解決方法
方法1:COLUMN関数を使用
=VLOOKUP(A2, B:D, COLUMN(D1)-COLUMN(B1)+1, FALSE)
方法2:名前付き範囲を使用
=VLOOKUP(A2, 商品マスタ, 3, FALSE)
【応用テクニック】さらなる活用方法
動的な範囲での処理
OFFSET関数との組み合わせ
動的に拡張する範囲
=VLOOKUP(A2,
OFFSET(商品マスタ!A1, 0, 0, COUNTA(商品マスタ!A:A), 3),
3, FALSE)
テーブル機能の活用
構造化参照での記述
=VLOOKUP(A2, 商品マスタ[#All], 3, FALSE)
複数シートでの処理
3D参照の活用
複数シートのデータを統合
=SUMPRODUCT(SUMIF(INDIRECT("シート"&{1;2;3}&"!B:B"), A2,
INDIRECT("シート"&{1;2;3}&"!C:C")))
配列数式での処理
一度に複数の処理を実行
{=SUM(IF(商品マスタ!A:A=売上データ!B:B,
商品マスタ!C:C*売上データ!C:C, 0))}
Power Queryとの連携
高度なデータ処理
複数テーブルの結合
- 「データ」→「データの取得」
- 「テーブルの結合」を選択
- 結合条件を設定
- 必要な列のみを抽出
メリット
- 大量データの高速処理
- 複雑な変換処理
- 自動更新機能
【VBA活用】マクロによる自動化

基本的なVLOOKUP処理
Sub VLOOKUPWithSum()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
' VLOOKUPで単価を取得
ws.Cells(i, 4).Formula = "=VLOOKUP(" & ws.Cells(i, 2).Address & _
",商品マスタ!A:C,3,FALSE)"
' 売上金額を計算
ws.Cells(i, 5).Formula = "=" & ws.Cells(i, 3).Address & _
"*" & ws.Cells(i, 4).Address
Next i
' 合計を計算
ws.Cells(lastRow + 1, 5).Formula = "=SUM(E2:E" & lastRow & ")"
End Sub
エラーハンドリング付きの処理
Sub SafeVLOOKUPWithSum()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
' エラーハンドリング付きVLOOKUP
ws.Cells(i, 4).Formula = "=IFERROR(VLOOKUP(" & ws.Cells(i, 2).Address & _
",商品マスタ!A:C,3,FALSE),0)"
' 売上金額を計算(単価が0でない場合のみ)
ws.Cells(i, 5).Formula = "=IF(" & ws.Cells(i, 4).Address & _
">0," & ws.Cells(i, 3).Address & _
"*" & ws.Cells(i, 4).Address & ",0)"
Next i
' 合計を計算
ws.Cells(lastRow + 1, 5).Formula = "=SUM(E2:E" & lastRow & ")"
MsgBox "処理が完了しました"
End Sub
条件付き集計の自動化
Sub ConditionalSumWithVLOOKUP()
Dim ws As Worksheet
Dim result As Double
Dim criteria As String
Set ws = ActiveSheet
criteria = InputBox("集計する商品コードを入力してください")
' SUMPRODUCT相当の処理をVBAで実装
result = Application.WorksheetFunction.SumProduct( _
(ws.Range("B:B") = criteria) * _
ws.Range("C:C") * _
Application.WorksheetFunction.IfError( _
Application.WorksheetFunction.VLookup( _
ws.Range("B:B"), _
Sheets("商品マスタ").Range("A:C"), _
3, False), 0))
MsgBox "商品コード " & criteria & " の売上合計:" & result
End Sub
まとめ
VLOOKUPと合計を組み合わせる方法は、データの規模や複雑さに応じて最適な手法を選択することが重要です。
方法別の選択指針
小規模データ(100行以下)
- ヘルパー列方式:最も理解しやすい
- 直感的な操作で初心者におすすめ
- デバッグが容易
中規模データ(1000行以下)
- SUMPRODUCT方式:効率的で柔軟
- 複雑な条件に対応可能
- 一つの数式で完結
大規模データ(1000行以上)
- ピボットテーブル:最も高速
- GUI操作で使いやすい
- 動的な分析が可能
実装時のポイント
エラー対策
- IFERROR関数でエラー処理
- データ型の統一を意識
- 範囲指定の正確性を確認
パフォーマンス対策
- 必要最小限の範囲を指定
- 計算方法の最適化を検討
- インデックス関数の活用
メンテナンス性
- 名前付き範囲の活用
- 構造化参照の使用
- コメントの記載
コメント