はじめに
第4回では外部ファイルからデータをExcelシートに取り込む方法を学び、分析のための準備が整いました。ここからはいよいよ、取り込んだデータを使って意味のある情報を引き出す「データ分析」の領域に踏み込みます。
今回は、データ分析の基本である基本的な統計量の計算と、時系列分析の代表格である移動平均の算出をVBAで自動化する方法をマスターします。これらの分析は、材料データの品質評価や株価のトレンド分析など、様々な場面で応用できます。
1. なぜ分析をVBAで行うのか?
ExcelにはAVERAGEやMAXといった便利なワークシート関数が既に備わっています。それでもVBAで分析処理を記述するメリットは大きいのです。
- プロセスの自動化: データ取り込み → データ整形 → 分析 → レポート作成という一連の流れを完全に自動化できる。
- 複雑なロジック: ワークシート関数だけでは表現が難しい、複雑な条件や独自の計算式を組み込める。
- 大量データの処理: 分析対象のデータ範囲が毎回変わるような場合でも、VBAなら動的に範囲を特定して分析を実行できる。
2. 基本的な統計量の計算
まずは、指定した範囲のデータから最大値、最小値、平均値、標準偏差を計算するコードを作成してみましょう。ここでは、Excelのワークシート関数をVBAから呼び出すWorksheetFunctionオブジェクトを利用するのが最も簡単で効率的です。
例:A列に並んだ材料強度データの統計量を計算する
Sub CalculateStatistics()
Dim targetRange As Range
Dim lastRow As Long
' 分析対象の範囲を動的に取得
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Set targetRange = Range("A1:A" & lastRow)
' WorksheetFunctionオブジェクトを使って計算
Dim maxValue As Double
Dim minValue As Double
Dim avgValue As Double
Dim stdevValue As Double
maxValue = WorksheetFunction.Max(targetRange)
minValue = WorksheetFunction.Min(targetRange)
avgValue = WorksheetFunction.Average(targetRange)
stdevValue = WorksheetFunction.StDev(targetRange) ' サンプル標準偏差
' 結果をC列とD列に出力
Range("C1").Value = "最大値"
Range("D1").Value = maxValue
Range("C2").Value = "最小値"
Range("D2").Value = minValue
Range("C3").Value = "平均値"
Range("D3").Value = avgValue
Range("C4").Value = "標準偏差"
Range("D4").Value = stdevValue
MsgBox "統計量の計算が完了しました。"
End Sub
Set targetRange = ...:Rangeのようなオブジェクト型の変数に値を設定する場合は、Setキーワードを使います。WorksheetFunction.Max(targetRange): VBAの中からExcelのMAX関数を呼び出しています。AVERAGEやSTDEVなども同様に利用できます。
3. 移動平均の計算 – 時系列データのトレンドを読む
移動平均は、株価や売上といった時系列データの大まかなトレンドを把握するために用いられる、最もポピュラーな分析手法の一つです。過去N日間のデータの平均値を、日付を一つずつずらしながら計算していきます。
例:B列の株価(終値)から、5日単純移動平均(5MA)を計算し、C列に出力する
Sub CalculateMovingAverage()
Dim lastRow As Long
Dim i As Long
Dim period As Integer
Dim sumPrice As Double
' 移動平均の期間を設定
period = 5
' B列の最終行を取得
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
' 移動平均を計算できる最初の行から最終行までループ
' (5日移動平均なので、5行目からスタート)
For i = period To lastRow
' 合計値を初期化
sumPrice = 0
' 直近period日間の株価を合計するためのミニループ
Dim j As Integer
For j = 0 To period - 1
' i行目からj行遡ったセルの値を合計
sumPrice = sumPrice + Cells(i - j, "B").Value
Next j
' 合計を期間で割り、移動平均をC列に書き出す
Cells(i, "C").Value = sumPrice / period
Next i
' C列のヘッダーを設定
Range("C1").Value = period & "日移動平均"
MsgBox "移動平均の計算が完了しました。"
End Sub
このコードは、ループの中にさらにループが入る「二重ループ」構造になっています。
- 外側のループ (
For i = ...): 移動平均を計算する対象の行を、上から下へ一つずつずらしていきます。 - 内側のループ (
For j = ...): 各行で、移動平均の計算対象となる過去N日間のデータを合計するために使います。
このロジックを理解すれば、様々な期間の移動平均や、加重移動平均(直近の価格に重みをつける)といった、より高度な分析にも応用できます。
まとめ
今回は、VBAを使って本格的なデータ分析を行う第一歩を踏み出しました。
WorksheetFunctionオブジェクトを使えば、Excelの強力な関数をVBAから簡単に利用できる。- VBAで分析処理を記述することで、データ範囲の変動に強い、柔軟な自動化プロセスを構築できる。
- 二重ループなどのロジックを組むことで、移動平均のような複雑な時系列分析も可能になる。
データから数値を計算するだけでは、その意味を直感的に理解するのは難しい場合があります。次回は、これらの分析結果をグラフとして「見える化」し、一目で傾向がわかるレポートを自動生成する方法を学びます。
コメント