|
▼MIT48 さん:
こんにちは。
> ほかの仕事に追われなかなか手がつけられず返信できませんでした。
> 申し訳ありません・・・
いえいえ、MIT48 さんのペースで大丈夫ですよ^^
>支店は全部ちゃんと表示されました。
この段階ではまだ全支店を表示する処理をしていないので、
今回たまたま元データに
全支店のデータが存在していたのかもしれませんね。
>休日でデータのない日以外クロス集計で表示されるようにでてきました。
>この状態でよろしいでしょうか?
はい、問題ないです。
次にデータのない日を表示する処理を追加します。
クロス集計クエリの列見出しを固定するには
「IN」句を使います。
年月によって31日の処理やうるう年の処理がある為、
こちらも可変にしてあげます。
Sub MakeCrossQuery2()
Dim strSQL As String
Dim strIn As String
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim QD As DAO.QueryDef
Dim MyDate As Date
Dim i As Long
MyDate = #6/21/2010#
'MyDate = CDate(Format(DMin("売上計上日", "売上テーブル"), "@@@@/@@/@@"))
Set DB = CurrentDb
'クエリ Q_Cross の存在チェック
'なかった場合には作成
'あった場合には使いまわし
strSQL = " SELECT * FROM MsysObjects WHERE NAME ='Q_Cross'"
Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
If RS.EOF Then
Set QD = DB.CreateQueryDef("Q_Cross")
Else
Set QD = DB.QueryDefs("Q_Cross")
End If
RS.Close
'クロス集計クエリの作成
strSQL = ""
strSQL = strSQL & " TRANSFORM Count(売上テーブル.伝票番号) AS 伝票番号のカウント "
strSQL = strSQL & " SELECT 売上テーブル.支店コード "
strSQL = strSQL & " FROM 売上テーブル "
strSQL = strSQL & " GROUP BY 売上テーブル.支店コード "
strSQL = strSQL & " PIVOT Right([売上計上日],2) "
'In句の作成
'20日締めなので21日〜20日は固定
Do Until Day(MyDate) = 20
strIn = strIn & ", '" & Day(MyDate) & "'"
MyDate = DateAdd("d", 1, MyDate)
Loop
strSQL = strSQL & "IN (" & Mid(strIn, 2) & ",20);"
QD.SQL = strSQL
QD.Close
MsgBox "クロス集計クエリ作成終了"
End Sub
今回は2010年6月21日〜7月20日までの処理を想定して
> MyDate = #6/21/2010#
としておりますが、
ここの日付を変化させる事で31日が出現したり
2月の処理をプログラム上で操作する事ができます。
売上テーブルの最小の日付を
セットする様なコードでも良いかもしれませんね。
ここまで出来ましたら次は全支店を表示する処理です。
> また自分でもわからないなりにVBAを解読してみたのですが
> どういった仕様になっているのか、よければ教えてください。
解りづらい処理がありましたら
どの箇所をご提示して頂ければ
出来る限り回答させて頂きます。
|
|