【Access VBA】月別グラフの作成-データのない日も表示する


月別グラフの作成-データのない日も表示する



テーブルの準備

下のような2個のテーブルを用意しました。
「Tサンプル」は生データが入ったテーブルです。
「WTサンプル」はグラフに表示するデータを「Tサンプル」から取り込むためのテーブルです。


フォームの準備

下のような2個のコンボボックスと2個のラベルおよび1個のボタンを配置したフォームを作成しました。

「デザイン」タブの「グラフ」をクリックし、作成したフォームに配置します。

「グラフウィザード」が開くので「テーブル:WTサンプル」を選んで「次へ」をクリックします。

「日付」と「数量」を「選択したフィールド」に移して「次へ」をクリックします。

「縦棒グラフ」を選んで「次へ」をクリックします。

「月ごとの日付」をダブルクリックし、「グループ化の設定」で「日」を選んで「OK」をクリックし、「次へ」をクリックします。

グラフのタイトルを必要に応じて入力し、凡例の表示、非表示を選択し、「完了」をクリックします。

作成したグラフの名前は「chart」としました。


コードの記述

標準モジュールに下記コードを記述します。

Public intYear As Integer
Public intMonth As Integer
Public Sub SetLastDay(ByVal Y As Integer, ByVal M As Integer)
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM WTサンプル"
    DoCmd.RunSQL "INSERT INTO WTサンプル SELECT 日付,数量 FROM Qサンプル"
    DoCmd.SetWarnings True
    Dim i As Integer
    Dim LastDay As Integer
    LastDay = Day(DateSerial(Y, M + 1, 1) - 1)

    Dim w_rs As Recordset
    Set w_rs = CurrentDb.OpenRecordset("WTサンプル", dbOpenDynaset)

    If w_rs.RecordCount <> 0 Then
  For i = Day(DMin("日付", "WTサンプル")) - 1 To 1 Step -1
            w_rs.AddNew
            w_rs![日付] = DateSerial(Y, M, i)
            w_rs![数量] = 0
            w_rs.Update
        Next
        For i = Day(DMax("日付", "WTサンプル")) + 1 To LastDay
            w_rs.AddNew
            w_rs![日付] = DateSerial(Y, M, i)
            w_rs![数量] = 0
            w_rs.Update
        Next
    End If
    w_rs.Close
    Set w_rs = Nothing
End Sub

Public Function GetYear() As Integer
    GetYear = intYear
End Function

Public Function GetMonth() As Integer
    GetMonth = intMonth
End Function

Public Sub SetComboBoxYear(ByVal fm As Form, ByVal strName As String)
    Dim i As Integer
    Dim cb As ComboBox
    Set cb = fm.Controls(strName)
    For i = cb.ListCount - 1 To 0 Step -1
        cb.RemoveItem i
    Next
    For i = Year(Date) To Year(Date) - 3 Step -1
        cb.AddItem i
    Next
End Sub

Public Sub SetComboBoxMonth(ByVal fm As Form, ByVal strName As String)
    Dim i As Integer
    Dim cb As ComboBox
    Set cb = fm.Controls(strName)
    For i = cb.ListCount - 1 To 0 Step -1
        cb.RemoveItem i
    Next
    For i = 1 To 12
        cb.AddItem i
    Next
End Sub

フォームの読み込み時イベントプロシージャに下記コードを記述します。

Private Sub Form_Load()
    Call SetComboBoxYear(Me, "cboYear")
    Call SetComboBoxMonth(Me, "cboMonth")
    cboYear = Year(Date)
    cboMonth = Month(Date)
    btnUpdate_Click
End Sub

ボタンのクリック時イベントプロシージャに下記コードを記述します。

Private Sub btnUpdate_Click()
    intYear = Nz(cboYear)
    intMonth = Nz(cboMonth)
    Call SetLastDay(intYear, intMonth)
    Me.chart.Requery
End Sub


選択クエリの作成

下のような選択クエリを作成します。


グラフオプションの設定

フォームのデザインビューでグラフをダブルクリックするとグラフの編集画面が現れます。
その画面のグラフを右クリックし、「グラフのオプション」を選択します。
「軸」タブの「X/項目軸」で「時系列」を選択するとデータがない日もグラフ表示されます。「項目」を選択するとデータのない日は表示されません。


使用方法

「年」と「月」を選択して「更新」ボタンをクリックするとグラフが表示されます。