はじめに
第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で分析処理を記述することで、データ範囲の変動に強い、柔軟な自動化プロセスを構築できる。
- 二重ループなどのロジックを組むことで、移動平均のような複雑な時系列分析も可能になる。
データから数値を計算するだけでは、その意味を直感的に理解するのは難しい場合があります。次回は、これらの分析結果をグラフとして「見える化」し、一目で傾向がわかるレポートを自動生成する方法を学びます。
コメント