Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
グラフの範囲指定
投稿日時: 18/09/09 12:33:52
投稿者: さー

お世話になります。
 
テーブルに登録したデータベースから、範囲を指定して抽出し、レポートに
積上棒グラフを作成したいです。
テーブル
No. 日にち  分類
1 2013/4/1 りんご
2 2013/4/9  みかん
3 2013/5/2  りんご
・・・・
2000 2018/9/9 バナナ
 
グラフ
横軸  2017年9月 2017年10月・・・2018/9月(直近13ヶ月分)
縦軸  りんご2個、みかん1個、バナナ1個
 
横軸を月単位にすることはできました。直近13ヶ月を表す抽出条件を
教えてください。
 
よろしくお願いいたします。
 

回答
投稿日時: 18/09/14 15:10:02
投稿者: sk

引用:
テーブルに登録したデータベースから、範囲を指定して抽出し、
レポートに積上棒グラフを作成したいです。

引用:
横軸  2017年9月 2017年10月・・・2018/9月(直近13ヶ月分)

引用:
直近13ヶ月を表す抽出条件

[日にち]に対する Where 条件として、
以下のような式を設定なさればよろしい
のではないでしょうか。
 
-----------------------------------------------------------
 
Between DateSerial(Year(Date()),Month(Date())-12,1)
    And DateSerial(Year(Date()),Month(Date())+1,0)
 
-----------------------------------------------------------

投稿日時: 18/09/18 21:45:22
投稿者: さー

sk様
 
回答をいただきまして、ありがとうございます。
折角回答していただいたのですが、質問文が言葉足らずに
なっていましたので、追加で質問させてください。
 
テーブル(データベース)
日にち列のデータ型:日付型
 
テーブルに登録したデータベースからレポートにグラフを
出力する際に、クエリ内にあるコンボボックスを使用して
います。
月:Format([日時],"yyyy\年mm\月")
 
追加質問
グラフの横軸をクエリ内にあるコンボボックス
の年月から過去13ヶ月分
に限定する方法がわかり
ましたら、教えていただけますでしょうか?
例)
コンボボックスで2018年7月を選択した場合
レポートグラフの横軸:2017年7月〜2018年7月
 
コンボボックスで2018年8月を選択した場合
レポートグラフの横軸:2017年8月〜2018年8月
 
となるようにしたいです。
よろしくお願いいたします。
 

回答
投稿日時: 18/09/19 09:53:27
投稿者: sk

引用:
テーブルに登録したデータベースからレポートにグラフを
出力する際に、クエリ内にあるコンボボックスを使用して
います。
月:Format([日時],"yyyy\年mm\月")

引用:
グラフの横軸をクエリ内にあるコンボボックス
の年月から過去13ヶ月分に限定する方法

フォーム内にある非連結コンボボックスでは?
 
引用:
Between DateSerial(Year(Date()),Month(Date())-12,1)
    And DateSerial(Year(Date()),Month(Date())+1,0)

Between DateSerial(Year([Forms]![フォーム名]![コンボボックス名]),
                   Month([Forms]![フォーム名]![コンボボックス名])-12,
                   1)
    And DateSerial(Year([Forms]![フォーム名]![コンボボックス名]),
                   Month([Forms]![フォーム名]![コンボボックス名])+1,
                   0)
 
---------------------------------------------------------------------
 
また、グラフの値集合ソースがクロス集計クエリである場合は、
更に上記のパラメータを明示的に定義して下さい。

投稿日時: 18/09/19 20:50:46
投稿者: さー

sk様
 
お世話になります。回答ありがとうございます。
 
フォーム内にある非連結コンボボックスでは?
→ご指摘の通り、フォーム内の誤りでした。
 
グラフの横軸は、
Between "2017年8月" And "2018年8月"
と直接入力するとグラフの横軸の範囲が指定できる状態です。
 
"2017年8月"をフォーム内非連結コンボボックスで選択した日時よりも1年前
"2018年8月"をフォーム内非連結コンボボックスで選択した日時
にしたいです。
 
フォーム内の非連結コンボボックスは、
月:Format([日時],"yyyy\年mm\月")
と設定しています。
 
たびたびの質問で申し訳ありませんが、よろしくお願いいたします。
 

回答
投稿日時: 18/09/20 09:02:45
投稿者: sk

引用:
"2017年8月"をフォーム内非連結コンボボックスで選択した日時よりも1年前、
"2018年8月"をフォーム内非連結コンボボックスで選択した日時
にしたいです。

既に回答したのですが、何か問題が生じたのでしょうか。

回答
投稿日時: 18/09/20 09:43:09
投稿者: Suzu

引用:
Between "2017年8月" And "2018年8月"

これは、文字列型のフィールドに対しての条件
つまりは、
引用:
月:Format([日時],"yyyy\年mm\月")

のフィールドに対しての条件ですよね。
 
skさんの回答の 値は、どんなデータ型を返すのか考えてみましょう。

投稿日時: 18/09/20 21:01:45
投稿者: さー

sk様 Suzu様
 
お世話になります。
回答をいただきましてありがとうございます。
 

引用:
既に回答したのですが、何か問題が生じたのでしょうか。

教えていただいた式を参考にチャレンジしてみたのですが、
うまくいきませんでした。
範囲が限定されず、全部の年月が表示されてしまいます。
 
引用:
skさんの回答の値は、どんなデータ型を返すのか考えてみましょう。

sk様に教えていただいたのはDateSerial関数なので、日付型、
私がやりたいのは、Formatなので文字列、
ここまでは理解できました。
 
しかし、まず、Between "2016年12月" And [Forms]![フォーム名]![コンボボックス名]
のようにAndの後ろのみをフォーム内の非連結コンボボックスで選択したものを
選べるように入れてみましたが、"2016年12月"しか抽出できませんでした。
文字列型の場合は、Formsの前に何か関数等を入れる必要があるのでしょうか?
 
よろしくお願いいたします。

回答
投稿日時: 18/09/21 09:53:11
投稿者: sk

さー さんの引用:
sk様に教えていただいたのはDateSerial関数なので、日付型、
私がやりたいのは、Formatなので文字列、
ここまでは理解できました。

「抽出条件を設定する日付/時刻型のフィールド」と
「 Format 関数を用いている演算フィールド」
(グラフの項目軸とするフィールド)は別ですよ。
 
さー さんの引用:
日にち列のデータ型:日付型

sk さんの引用:
[日にち]に対する Where 条件として、
以下のような式を設定なさればよろしい
のではないでしょうか。

sk さんの引用:
Between DateSerial(Year([Forms]![フォーム名]![コンボボックス名]),
                   Month([Forms]![フォーム名]![コンボボックス名])-12,
                   1)
    And DateSerial(Year([Forms]![フォーム名]![コンボボックス名]),
                   Month([Forms]![フォーム名]![コンボボックス名])+1,
                   0)

sk さんの引用:
また、グラフの値集合ソースがクロス集計クエリである場合は、
更に上記のパラメータを明示的に定義して下さい。

具体的にどのように設定してよいのか
よく分からないようなのであれば、
 
・レポート上のグラフの値集合ソースとして
 設定しているクエリの SQL ビュー
 (もしくは SQL ステートメント)の内容
 
・抽出条件を指定するための非連結コンボボックスの名前、
 及びそのコンボボックスを配置しているフォームの名前。
 
以上を明記されることをお奨めします。

投稿日時: 18/09/21 22:57:29
投稿者: さー

sk様
 
お世話になります。回答ありがとうございます。
 

引用:
「抽出条件を設定する日付/時刻型のフィールド」と
「Format 関数を用いている演算フィールド」
(グラフの項目軸とするフィールド)は別ですよ。

別なのですか・・!? グラフにはどちらか片方しか設定できない
と勘違いをしていました。
日時(データベースの日にちに該当する部分が実際には日時でした)
に対するWhere条件として式を定義してみましたが、該当範囲が抽出
できませんでした。(グラフに何も表示されなくなってしまいます)
 
引用:
抽出条件を指定するための非連結コンボボックスの名前
及びそのコンボボックスを配置しているフォームの名前

下記になります。
テーブル名        :データベース
フォームの名前      :集計範囲
非連結コンボボックスの名前:年月
 
引用:
パラメータを明示的に定義してください。

ごめんなさい。何を明示すればよいのかわかりません。
 
引用:
レポート上のグラフの値集合ソースとして
設定しているクエリの SQL ビュー

下記の通りです。(検討違いなことを記載していたらご指摘ください。)
TRANFORM Count([データベース].分類) As 分類のカウント
SELECT ([Format([日時],"yyyy\年mm\月")) AS 式1
From データベース
GROUP BY (Format([日時],"yyyy\年mm\月"))
ORDER BY Switch ([分類]="りんご",1,[分類]="みかん",2,[分類]="バナナ",3, ...実際は11まであります)
PIVOT Switch ([分類]="りんご",1,[分類]="みかん",2,[分類]="バナナ",3, ...実際は11まであります);
 
SQL上に直接入力したのではなく、クエリビルダーにて入力しました。
               列1           列2           列3
フィールド   式1:(Format[日時],"yyyy\年mm\月)  Switch([分類])   分類のカウント
テーブル                                データベース
集計      グループ化             グループ化     カウント
行列の入れ替え 行見出し              列見出し      値
並び替え                      昇順
※抽出条件とまたははすべて空欄です。
 
現在は横軸の年月が全範囲になってしまうので、列4にフォーム内の非連結コンボボックスで
指定した年月から13ヶ月前までに限定する式を入力したいと思っています。
 
よろしくお願いいたします。

回答
投稿日時: 18/09/25 11:10:18
投稿者: sk

引用:
テーブル名        :データベース
フォームの名前      :集計範囲
非連結コンボボックスの名前:年月

引用:
TRANFORM Count([データベース].分類) As 分類のカウント
SELECT ([Format([日時],"yyyy\年mm\月")) AS 式1
From データベース
GROUP BY (Format([日時],"yyyy\年mm\月"))
ORDER BY Switch ([分類]="りんご",1,[分類]="みかん",2,[分類]="バナナ",3, ...実際は11まであります)
PIVOT Switch ([分類]="りんご",1,[分類]="みかん",2,[分類]="バナナ",3, ...実際は11まであります);

仮に、列見出しとして[分類]の値をそのまま使用する
(Switch 関数を用いない)場合は、次のようなクエリを
グラフの値集合ソースとなさればよろしいでしょう。
 
( SQL ビュー)
---------------------------------------------------------------
PARAMETERS [Forms]![集計範囲]![年月] DateTime;
TRANSFORM Count([データベース].[分類]) AS 分類のカウント 
SELECT Format([データベース].[日時],"yyyy\年mm\月") AS 年月
FROM [データベース] 
WHERE [データベース].[日時] Between DateSerial(Year([Forms]![集計範囲]![年月]),
                                               Month([Forms]![集計範囲]![年月])-12,
                                               1) 
                                And DateSerial(Year([Forms]![集計範囲]![年月]),
                                               Month([Forms]![集計範囲]![年月])+1,
                                               0) 
GROUP BY Format([データベース].[日時],"yyyy\年mm\月")
PIVOT [データベース].[分類];
---------------------------------------------------------------
 
引用:
SQL上に直接入力したのではなく、クエリビルダーにて入力しました。

更に SQL ビューからデザインビューに切り替え、デザイングリッドに
どのような抽出条件が設定されたかをご確認されるとよいでしょう。
 
引用:
ごめんなさい。何を明示すればよいのかわかりません。

このクエリにおけるパラメータの定義内容については、
[デザイン]タブ -> [表示/非表示]グループ -> [パラメータ]を
開いてご確認下さい。
 
(列見出しが可変であるクロス集計クエリにおいて、
パラメータを使用する場合、パラメータを明示的に
定義する必要があります)
 
引用:
Switch ([分類]="りんご",1,[分類]="みかん",2,[分類]="バナナ",3, ...実際は11まであります)

この式については、Switch 関数によって値の変換を行なうのではなく、
[分類マスタ]に相当するテーブルを別途用意しておき、[データベース]を
主テーブルとして外部結合し、[分類マスタ]から[番号]を参照する
ようになさった方がよいと思います。

トピックに返信