導入
業務で大量のデータから「特定の条件に一致するデータの最大値」を探すことはよくあります。Excelの関数であるDMAX関数を使えば簡単に算出できますが、実務では「ボタン一つで集計を実行したい」「レポートとして自動出力したい」といったニーズが多くあります。今回は、ExcelのDMAX関数をVBAで制御し、柔軟に最大値を抽出する方法を解説します。この技術をマスターすることで、手動操作を減らし、ミスを防ぐ仕組みを構築できます。
基礎知識
DMAX関数は、データベース機能を持つ範囲内から、指定した条件に合致するレコードの中で、特定のフィールド(列)の最大値を返す関数です。
VBAからこの関数を利用するには、WorksheetFunctionオブジェクトを使用します。VBAで扱う際は、以下の3つの要素を正確に指定することがポイントです。
1. Database: 項目名を含むデータ範囲全体
2. Field: 抽出したい数値が入っている列の項目名(または列番号)
3. Criteria: 条件となる項目名と値がセットになったセル範囲
実装/解決策
VBAでDMAX関数を呼び出す際は、`Application.WorksheetFunction.DMax(Database, Field, Criteria)`という構文を使用します。
実務で最も重要なのは、データ範囲や条件範囲を可変にすることです。データが増減しても対応できるよう、CurrentRegionプロパティを使用して範囲を自動取得するのが賢いやり方です。
サンプルプログラム
以下のコードは、シート上の「データ範囲」と「条件範囲」を指定して最大値を取得する実用的な例です。
Sub GetMaxByCondition()
Dim ws As Worksheet
Dim dbRange As Range
Dim criteriaRange As Range
Dim result As Double
Set ws = ThisWorkbook.Sheets(“Sheet1”)
‘ 1. データベース範囲の設定(A4セルから始まる連続するデータ範囲)
Set dbRange = ws.Range(“A4”).CurrentRegion
‘ 2. 条件範囲の設定(G18からG19に条件が記載されていると想定)
Set criteriaRange = ws.Range(“G18:G19”)
‘ 3. DMAX関数を実行し、結果をセルJ19に出力
‘ 第2引数にはフィールド名(例:”個数”)または列番号(例:5)を指定
On Error Resume Next ‘ エラー回避(該当データがない場合など)
result = Application.WorksheetFunction.DMax(dbRange, “個数”, criteriaRange)
If Err.Number = 0 Then
ws.Range(“J19”).Value = result
Else
ws.Range(“J19”).Value = “該当なし”
End If
On Error GoTo 0
End Sub
応用・注意点
現場での運用で最も陥りやすいバグは、「条件範囲の項目名がデータ範囲の項目名と一致していない」というケースです。全角・半角の微妙な違いや、不要なスペースが入っているだけで関数は正しく値を返しません。
また、DMAX関数で該当するデータが見つからない場合、VBAでは実行時エラーが発生することがあります。上記のサンプルコードのように、On Error Resume Nextでエラーを制御するか、事前にCountIf関数などで条件合致データが存在するか確認する処理を入れると、より堅牢なプログラムになります。ぜひ、ご自身の業務環境に合わせて調整してみてください。
