質問: access クロス集計クエリについて お世話になります。 クロス集計クエリの結果が以下の内容になっているとします。 項目 2013年10月 2014年07月 2014年08月 2014年09月 商品数 100 150 120 130 顧客数 2000 2200 2100 2200 ※2013年11月~2014年6月までのデータ無し 上記クエリで、データの無い期間の商品数及び顧客数を0とし、また見出しも 埋めたいところです。 項目 2013年10月 2013年11月 ・・・2014年08月 2014年09月 商品数 100 0 120 130 顧客数 2000 0 2100 2200 このように表示したい場合、やはり元データにレコードを作成し各数量は0で 登録しなければなりませんでしょうか。 それとも、実際にレコードが無くても、上記表示は可能でしょうか。 ************ 当該クエリの内容は最終的にexcelファイルに貼り付けします。 現状、左詰めで貼り付けられてしまう為、可能であれば1年分の 体裁を整えた状態で貼り付けしたいところです。 ご教示の程、宜しくお願い致します。
回答: excel に出力するという事なので、 クロス集計結果を excel に出力後、整形した方が簡単かと思います。 過去質問で解決したと思われる、見出し転記 & copyfromrecordset した範囲が b4:f6 だった場合の一例です。 定数 xlshifttoright がありますが、access から使うのであれば const xlshifttoright = -4161 と定義しておけばよいと思います。 以下は excel で記述してみたら・・・というものになります。 public sub samp1() dim irows as long, icol as long dim dtl as date, dtc as date dim i as long, j as long with range("b4:f6") irows = .rows.count for icol = .columns.count to 3 step -1 with .cells(1, icol) dtl = cdate(.offset(, -1).value) dtc = cdate(.value) i = datediff("m", dtl, dtc) - 1 if (i > 0) then .resize(irows, i).insert xlshifttoright for j = 1 to i with .offset(, -j) .resize(irows).value = 0 .value = format(dateadd("m", -j, dtc), "yyyy年mm月") end with next end if end with next end with end sub ※ 単純にクロス集計時に盛り込もうとした時には 「列見出し」を設定すればデータの無い月の表示も可能です。 が、表示月の変更があれば修正する必要があります。 流動的に変更する方法もありますが・・・ それは、vba でクロス集計のsqlを再定義するものになります。 ただし、データの無い部分の表示は空欄(空白)になります。 必要そうなら提示しますが、元テーブルの構成等補足してください。 なお、上記記述では、もし右端に罫線とかあった場合はズレて行きます。 そういった場合は、作業用シートに展開処理後、本シートに移すとか・・・ ※ access に記述するのなら、変数 myrs がレコードセットと仮定すると with range("b4:f6") 部分の前に処理を追加します。 b4 から書き出すと仮定した雰囲気は(以下未検証) set myrs = mydb.openrecordset(mysql) with obj.worksheets(シート名) ' .activate with .range("b4") for i = 0 to myrs.fields.count - 1 .offset(,i).value = myrs(i).name next .offset(1).copyfromrecordset myrs with .resize(myrs.recordcount + 1, myrs.fields.count) ' ★ ' ★ 上記処理 end with end with end with