Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1468 / 2272 ツリー ←次へ | 前へ→

【6875】2年分の検索方法は? わん 05/11/30(水) 12:41 質問[未読]
【6877】Re:2年分の検索方法は? 小僧 05/11/30(水) 13:44 回答[未読]
【6878】Re:2年分の検索方法は? わん 05/11/30(水) 14:26 質問[未読]
【6881】Re:2年分の検索方法は? 小僧 05/11/30(水) 14:57 発言[未読]
【6882】Re:2年分の検索方法は? わん 05/11/30(水) 15:57 質問[未読]
【6885】Re:2年分の検索方法は? 小僧 05/11/30(水) 16:21 発言[未読]
【6896】Re:2年分の検索方法は? わん 05/12/3(土) 14:57 質問[未読]
【6897】Re:2年分の検索方法は? わん 05/12/3(土) 18:36 発言[未読]
【6900】Re:2年分の検索方法は? 小僧 05/12/5(月) 9:52 発言[未読]
【6903】Re:2年分の検索方法は? わん 05/12/5(月) 13:06 発言[未読]
【6906】Re:2年分の検索方法は? 小僧 05/12/5(月) 14:26 発言[未読]
【6908】Re:2年分の検索方法は? わん 05/12/5(月) 15:04 発言[未読]
【6911】Re:2年分の検索方法は? 小僧 05/12/5(月) 17:51 発言[未読]
【6934】Re:2年分の検索方法は? わん 05/12/8(木) 13:47 質問[未読]
【6935】Re:2年分の検索方法は? 小僧 05/12/8(木) 13:58 発言[未読]
【6952】Re:2年分の検索方法は? わん 05/12/10(土) 12:21 お礼[未読]
【6957】Re:2年分の検索方法は? わん 05/12/12(月) 16:41 お礼[未読]
【6961】Re:2年分の検索方法は? わん 05/12/13(火) 11:26 質問[未読]
【6962】Re:2年分の検索方法は? 小僧 05/12/13(火) 13:15 発言[未読]
【6964】Re:2年分の検索方法は? わん 05/12/13(火) 14:21 発言[未読]
【6966】Re:2年分の検索方法は? 小僧 05/12/13(火) 15:17 発言[未読]
【6968】Re:2年分の検索方法は? わん 05/12/13(火) 16:36 発言[未読]
【6967】Re:2年分の検索方法は? 小僧 05/12/13(火) 15:21 回答[未読]
【7022】Re:2年分の検索方法は? わん 05/12/28(水) 1:48 お礼[未読]

【6875】2年分の検索方法は?
質問  わん  - 05/11/30(水) 12:41 -

引用なし
パスワード
   いつもお世話になってます。
久しぶりの質問です。
フォームのコンボ検索で2年分のデータを
表示させるにはどうしたらよいのでしょうか?

Access2000、OS:XP


 テーブルI
  ID   オートナンバー
  日付  日付型
  名前  テキスト
  結果1 数値型
  結果2 数値型

 テーブルI データ
  ID     日付      名前   結果1  結果2
   1   2000年1月1日   A    130000  235
   2   2000年2月1日   B    180000  285
   3   2001年1月1日   A    200000  300
   4   2001年2月1日   B    100000  185
   5   2002年1月1日   C    170000  275
   6   2002年2月1日   C    250000  335
   7   2003年1月1日   A    100000  185
   8   2004年1月1日   B    150000  260
   9   2004年2月1日   C    190000  290
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・

 フォーム
  comb年
  txt年
  txt名前
  txt結果1
  txt結果2

comb年で指定した年の結果を各テキストに表示させることはできるのですが、
以下のようにcomb年で指定した前年の結果も表示させたいと考えています。

  現在   →  修正後     
  comb年     comb年
  txt年      txt年
  txt名前     txt名前 
  txt結果1    txt結果1
  txt結果2    txt結果2
           txt結果1前年←追加
           txt結果2前年←追加

どのようにしたら良いでしょうか?
どなたか教えて下さい。
宜しくお願い致します。

【6877】Re:2年分の検索方法は?
回答  小僧  - 05/11/30(水) 13:44 -

引用なし
パスワード
   ▼わん さん:
お久し振りです。

>フォームのコンボ検索で2年分のデータを
>表示させるにはどうしたらよいのでしょうか?

仕組みは同じですが、2通りの方法を考えてみました。

1) クエリによる操作

SELECT Year([日付]) AS 年,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
DLookUp("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1,
DLookUp("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI;

こちらのクエリを基にフォームを作る。


2) フォームによる操作

txt結果1前年 の「コントロールソース」を

=DLookUp("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'")

のようにする。(1行で記述して下さい。)


ご提示のデータのように抜けてしまっている年があると空白で表示されます。

【6878】Re:2年分の検索方法は?
質問  わん  - 05/11/30(水) 14:26 -

引用なし
パスワード
   小僧さんお久しぶりです。
今回も宜しくお願いします。

早速のご返答ありがとうございます。
両方とものやり方はわかりました。

ですが、私の説明不足のために問題が発生しました。
実は、現在はフォーム(単票フォーム)の結果1、結果2の各テキストは、
名前及び年月日による縦累計をコントロールソース内にて計算させています。
(クエリによる縦累計の方法がわからなかったため)

そこで、テーブルIの結果1・結果2の縦累計のクエリを作成し、
累計結果を単票フォームでコンボ検索により、
年別(月別)に指定年・指定年前年の累計結果のみを
表示させるようにしたいと思います。

ですので、
クエリによる結果1・結果2の縦累計のSQLを教えていただきたいと思います。
宜しくお願い致します。

【6881】Re:2年分の検索方法は?
発言  小僧  - 05/11/30(水) 14:57 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

ちょっとまだ状況が解りかねるのですが、
年、名前ごとの結果1、結果2 の合計を出すのでしょうか。

先ほどのDLookUp関数でなく、DSum関数を使ってみました。

SELECT Year([日付]) AS 年,
テーブルI.名前,
Sum(テーブルI.結果1) AS 結果1の合計,
Sum(テーブルI.結果2) AS 結果2の合計,
DSum("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1,
DSum("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI
GROUP BY Year([日付]),
テーブルI.名前,
DSum("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'"),
DSum("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'");

こんな感じの結果で良いでしょうか…。

【6882】Re:2年分の検索方法は?
質問  わん  - 05/11/30(水) 15:57 -

引用なし
パスワード
   いつもありがとうございます。

ご指示頂いた以下のSQLを貼り付けましたがうまくいきません。

>SELECT Year([日付]) AS 年,
>テーブルI.名前,
>Sum(テーブルI.結果1) AS 結果1の合計,
>Sum(テーブルI.結果2) AS 結果2の合計,
>DSum("結果1","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1,
>DSum("結果2","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果2
>FROM テーブルI
>GROUP BY Year([日付]),
>テーブルI.名前,
>DSum("結果1","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'"),
>DSum("結果2","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'");
>

集計関数の一部として指定された式‘名前’を含んでいないクエリを実行しようとしました。

とエラーがでました。これはどういう意味なのでしょう?
宜しくお願い致します。

【6885】Re:2年分の検索方法は?
発言  小僧  - 05/11/30(水) 16:21 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

こちらの環境(Ac2002、WinXP)ではうまく行ったのですが…。
おまじない程度ですが、名前 → [テーブルI].[名前] と変更するとどうでしょうか。

SELECT Year([日付]) AS 年,
テーブルI.名前,
Sum(テーブルI.結果1) AS 結果1の合計,
Sum(テーブルI.結果2) AS 結果2の合計,
DSum("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND [テーブルI].[名前] = '" & [名前] & "'") AS 前年結果1,
DSum("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND [テーブルI].[名前] = '" & [名前] & "'") AS 前年結果2
FROM テーブルI
GROUP BY Year([日付]),
テーブルI.名前,
DSum("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND [テーブルI].[名前] = '" & [名前] & "'"),
DSum("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND [テーブルI].[名前] = '" & [名前] & "'");

【6896】Re:2年分の検索方法は?
質問  わん  - 05/12/3(土) 14:57 -

引用なし
パスワード
   出張に行っていたもので返信が遅くなって申し訳ありません。

教えて頂いた事全て試してみたのですが上手く動作しませんでした。
正確に状況説明ができていなかったようなのでもう一度説明しなおします。


 テーブルI
  ID   オートナンバー
  日付  日付型
  名前  テキスト
  結果1 数値型
  結果2 数値型

 テーブルI データ
  ID     日付      名前   結果1  結果2
   1   2000年1月1日   A    130000  235
   2   2000年2月1日   B    180000  285
   3   2001年1月1日   A    200000  300
   4   2001年2月1日   B    100000  185
   5   2002年1月1日   C    170000  275
   6   2002年2月1日   C    250000  335
   7   2003年1月1日   A    100000  185
   8   2004年1月1日   B    150000  260
   9   2004年2月1日   C    190000  290
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・
   ・      ・      ・      ・    ・

 フォーム     コントロールソース/イベント
  comb年       :非連結、
   集合値ソース:SELECT Left(クエリ.日付,4) FROM クエリ4 GROUP BY Left(クエリ.日付,4);
  txt年        :日付
  txt名前       :名前
  txt結果1      :Sum([結果1])
  txt結果2      :Sum([結果2])
  txt結果1前年
  txt結果2前年
  cmd検索      :クリック時 イベントプロシージャ
   ↑抜けていました。申し訳ありません。

尚、テーブルからクエリを作成し、クエリを元にフォームを作成しています。
以下クエリのSQLです。
SELECT テーブルI.日付, テーブルI.名前,
テーブルI.結果1, テーブルI.結果2
FROM テーブルI;

comb年により年数を選択し、cmd検索により実行。
txt結果1、txt結果2に選択年度累計表示。
ここまではできているのですが、
txt結果1前年、txt結果2前年に選択年の前年累計を
表示させたいと思っております。

今まで教えて頂いたことをヒントに
自分でもチャレンジ中ですが宜しくお願い致します。

説明足らずで申し訳ありません。
教えて頂くのに状況を上手く説明するのは難しいものですね。

【6897】Re:2年分の検索方法は?
発言  わん  - 05/12/3(土) 18:36 -

引用なし
パスワード
   こんばんわ。

クエリに関することはできました。
ありがとうございます。

以下のようなSQLでとりあえずの希望のものにはなりました。

SELECT テーブルI.日付, テーブルI.名前,
テーブルI.結果1, テーブルI.結果2,
DSum("結果1","テーブルI","Year([日付]) = " & Year([日付])-1 &
"AND [テーブルI].[名前] = '" & [名前] & "'") AS 前年結果1,
DSum("結果2","テーブルI","Year([日付]) = " & Year([日付])-1 &
"AND [テーブルI].[名前] = '" & [名前] & "'") AS 前年結果2
FROM テーブルI
GROUP BY テーブルI.日付, テーブルI.名前,
テーブルI.結果1, テーブルI.結果2,
DSum("結果1","テーブルI","Year([日付]) = " & Year([日付])-1 &
"AND [テーブルI].[名前] = '" & [名前] & "'"),
DSum("結果2","テーブルI","Year([日付]) = " & Year([日付])-1 &
"AND [テーブルI].[名前] = '" & [名前] & "'");

DSum関数の累計計算についても理解できて、
直接フォームのテキストに書き込むこともできました。

出来上がってみて思ったのですが、
これだと条件にあったテキストやクエリ式を
全て作成しなければいけないことがわかりました。

そこで、1つ質問なのですが以下のように
  フォーム     コントロールソース/イベント
  txt結果1      :Sum([結果1])
  txt結果2      :Sum([結果2])

txt結果1前年、txt結果2前年についても1つのテキストのみで
コンボ検索とコマンドボタン実行による表示はできないのでしょうか?

現在は、フォーム上のコンボ検索にはcomb年以外にも
comb年、comb月、comb名前で検索をして表示させています。
これに対応する形で前年分も表示させたいと思うのですが
無理なのでしょうか?

わかりにくい説明のような気もしますが、
宜しくお願い致します。

【6900】Re:2年分の検索方法は?
発言  小僧  - 05/12/5(月) 9:52 -

引用なし
パスワード
   ▼わん さん:
おはようございます。

まだ状況がつかめないでいます ^^;

2005/12/05 A  10000
2005/12/06 A  12000

上記のように同年、同月、同じ名前で結果が2つあるような事はありますか?

もしあるとすれば、フォーム上に表示するのは

1) 合計だけ

2005/12   A  22000

2) 複数ある場合は全部

2005/12/05 A  10000
2005/12/06 A  12000

どちらなのでしょうか。


>現在は、フォーム上のコンボ検索にはcomb年以外にも
>comb年、comb月、comb名前で検索をして表示させています。

これはフィルタを使っているのでしょうか。

全件のデータが表示されている状態で、
コンボボックスで指定された 年、月、名前で検索するのでれば

Private Sub cmd検索_Click()
Dim strFil As String

  If Not IsNull(Me.cmb年) Then
    strFil = " And Year([日付]) = " & CLng(Me.cmb年)
  End If
  
  If Not IsNull(Me.cmb月) Then
    strFil = strFil & " And Month([日付]) = " & CLng(Me.cmb月)
  End If
  
  If Not IsNull(Me.cmb名前) Then
    strFil = strFil & " And 名前 = '" & Me.cmb名前 & "'"
  End If
  
  strFil = Mid(strFil, 6)
  
  Me.Filter = strFil
  Me.FilterOn = True
End Sub

こんな感じでしょうか。

【6903】Re:2年分の検索方法は?
発言  わん  - 05/12/5(月) 13:06 -

引用なし
パスワード
   こんにちわ。
いつもお世話になっております。
説明が上手くできなくて申し訳ありません。

ご質問の件ですが、

>2005/12/05 A  10000
>2005/12/06 A  12000
>上記のように同年、同月、同じ名前で結果が2つあるような事はありますか?
あります。

>もしあるとすれば、フォーム上に表示するのは
>1) 合計だけ
>2005/12   A  22000
表示するのはこの状態です。
ですので、全件のデータは表示されてはおりません。

>>現在は、フォーム上のコンボ検索にはcomb年以外にも
>>comb年、comb月、comb名前で検索をして表示させています。
>これはフィルタを使っているのでしょうか。
はい、おっしゃる通りです。
コードは以下のようになっております。(以前に教えて頂いたコードです)

Private Sub cmd検索_Click()
If IsNull(Me.年度) Then
 MsgBox "年度を入力して下さい。"
  Me.年度.SetFocus
  Exit Sub
 End If
If DCount("*", "クエリ", "Left(日付, 4) = '" & Me.年度 & "'") = 0 Then
  MsgBox "選択された年度は存在しません。"
Else
  Me.Filter = "Left(日付, 4) = '" & Me.年度 & "'"
  Me.FilterOn = True
End If
End Sub

ちなみにcmd検索ボタンには年度及び月度、名前用があります。
以上のコードにどう書き加えれば、
前年分がtxt結果1前年に表示されるのでしょうか?
基本的に無理なことなのでしょうか?

以上の説明でご理解頂けたでしょうか。
宜しくお願い致します。

【6906】Re:2年分の検索方法は?
発言  小僧  - 05/12/5(月) 14:26 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

>説明が上手くできなくて申し訳ありません。

すみません、こちらこそです。
未だ わんさん のやりたい事が明確に見えてきません^^;

・cmb年 が未選択 : 前年という概念ができないので表示なし。

・cmb年 を選択 : 年に応じた結果1 の合計と結果2 の合計
         また、前年の結果1 の合計と結果2 の合計が表示。


この状態から、cmb月、cmb名前を選択する事によって
フィルタが掛けられる、という事なのでしょうか?

> テーブルI データ
>  ID     日付      名前   結果1  結果2
>   1   2000年1月1日   A    130000  235
>   2   2000年2月1日   B    180000  285
>   3   2001年1月1日   A    200000  300
>   4   2001年2月1日   B    100000  185
>   5   2002年1月1日   C    170000  275
>   6   2002年2月1日   C    250000  335
>   7   2003年1月1日   A    100000  185
>   8   2004年1月1日   B    150000  260
>   9   2004年2月1日   C    190000  290

cmb年が未選択 → 表示レコードなし

cmb年 で 2002を選択

   2002年--月   ---    420000  610  30000  485

cmb月 で 1 月を選択

   2002年01月   ---    170000  275  200000  300

cmb名前 で C を選択

   2002年01月   C     170000  275  ------  --- 

【6908】Re:2年分の検索方法は?
発言  わん  - 05/12/5(月) 15:04 -

引用なし
パスワード
   お世話様です。
まさに小僧さんが示した通りのものを
作成したいと考えています。
詳細に明示して下さりありがとうございます。

>・cmb年 が未選択 : 前年という概念ができないので表示なし。
>・cmb年 を選択 : 年に応じた結果1 の合計と結果2 の合計
>         また、前年の結果1 の合計と結果2 の合計が表示。
>この状態から、cmb月、cmb名前を選択する事によって
>フィルタが掛けられる、という事なのでしょうか?
>
>> テーブルI データ
>>  ID     日付      名前   結果1  結果2
>>   1   2000年1月1日   A    130000  235
>>   2   2000年2月1日   B    180000  285
>>   3   2001年1月1日   A    200000  300
>>   4   2001年2月1日   B    100000  185
>>   5   2002年1月1日   C    170000  275
>>   6   2002年2月1日   C    250000  335
>>   7   2003年1月1日   A    100000  185
>>   8   2004年1月1日   B    150000  260
>>   9   2004年2月1日   C    190000  290
>
>cmb年が未選択 → 表示レコードなし
>
>cmb年 で 2002を選択
>   2002年--月   ---    420000  610  300000  485
>
>cmb月 で 1 月を選択
>   2002年01月   ---    170000  275  200000  300
>
>cmb名前 で C を選択
>   2002年01月   C     170000  275  ------  --- 

できますでしょうか?
宜しくお願いします。

【6911】Re:2年分の検索方法は?
発言  小僧  - 05/12/5(月) 17:51 -

引用なし
パスワード
   ▼わん さん:
こんばんは。

できた事はできたのですが、
「とりあえずできた」程度のモノですので参考までに…。

フォーム:フォーム名
コンボボックス
cmb年
cmb月
cmb名前

テキストボックス(コントロールソース)
txt年(年)
txt月(月)
txt名前(名前)
txt結果1(結果1)
txt結果2(結果2)
txt前年結果1(無し)
txt前年結果2(無し)

フォームのレコードソース

SELECT Year([日付]) AS 年,
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)) AS 月,
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前) AS 名前,
Sum(テーブルI.結果1) AS 結果1,
Sum(テーブルI.結果2) AS 結果2
FROM テーブルI
WHERE (((IIf(IsNull([Forms]![フォーム名]![cmb月]),"---",Month([テーブルI].[日付])))="---" Or
(IIf(IsNull([Forms]![フォーム名]![cmb月]),"---",Month([テーブルI].[日付])))=[Forms]![フォーム名]![cmb月]) AND
((IIf(IsNull([Forms]![フォーム名]![cmb名前]),"---",[テーブルI].[名前]))="---" Or
(IIf(IsNull([Forms]![フォーム名]![cmb名前]),"---",[テーブルI].[名前]))=[Forms]![フォーム名]![cmb名前]))
GROUP BY Year([日付]),
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)),
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前),
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)),
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前)
HAVING (((Year([日付]))=[Forms]![フォーム名]![cmb年]));

(コピーペーストでいけると思います…。)


あとは、cmb年、cmb月、cmb名前の更新後処理から
関数を呼び出す形になります。

Private Sub cmb年_AfterUpdate()
  Call LastYear
End Sub

Private Sub cmb月_AfterUpdate()
  Call LastYear
End Sub

Private Sub cmb名前_AfterUpdate()
  Call LastYear
End Sub

Sub LastYear()
Dim strWhere As String

  strWhere = "Year([日付]) = " & CLng(Me.cmb年) - 1
  
  If Not IsNull(Me.cmb月) Then
    strWhere = strWhere & " AND Month([日付]) = " & CLng(Me.cmb月)
  End If
  
  If Not IsNull(Me.cmb名前) Then
    strWhere = strWhere & " AND 名前 = '" & Me.cmb名前 & "'"
  End If
  
  Me.txt前年結果1.value = DSum("結果1", "テーブルI", strWhere)
  Me.txt前年結果2.value = DSum("結果2", "テーブルI", strWhere)
  Me.Requery
End Sub


色々と考えていたのですが、上記の通りまとまったものができなくてすみません。

【6934】Re:2年分の検索方法は?
質問  わん  - 05/12/8(木) 13:47 -

引用なし
パスワード
   こんにちわ。

お返事が遅くなり申し訳ございません。
最近、出張が多いものですいませんでした。

早速ですが、
指示されたものを作成して試したのですが
上手く動作しません。

症状は、
・フォーム詳細にテキスト自体が表示されない。
・コンボボックスには何も(白)表示されない。
 (勿論、テーブルIにはデータが入力されています)
どうしてでしょうか?

それと各コントロールの配置の確認なのですが、
・コンボボックスはフォームヘッダーに。
・テキストボックスはフォーム詳細に。
でよろしかったのですよね。

宜しくお願いします。

【6935】Re:2年分の検索方法は?
発言  小僧  - 05/12/8(木) 13:58 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

>最近、出張が多いものですいませんでした。

いえいえ。当方も業務が忙しいと回答ができませんので、
その辺はお互い様でと言う事で…。

>それと各コントロールの配置の確認なのですが、
>・コンボボックスはフォームヘッダーに。
>・テキストボックスはフォーム詳細に。
>でよろしかったのですよね。

まずこちらですが、上記の設定で大丈夫です。

>・コンボボックスには何も(白)表示されない。

すみません。
コンボボックスの値集合ソースを記述するのを忘れていました。

Cmb年
SELECT Year([日付]) FROM テーブルI GROUP BY Year([日付]);

Cmb月
SELECT Month([日付]) FROM テーブルI GROUP BY Month([日付]);

Cmb名前
SELECT テーブルI.名前 FROM テーブルI GROUP BY テーブルI.名前;


>・フォーム詳細にテキスト自体が表示されない。

こちらはコンボボックスと連動する形でフォームが表示されますので、
現時点で Cmb年 がうまくいっていない為だと思われます。

【6952】Re:2年分の検索方法は?
お礼  わん  - 05/12/10(土) 12:21 -

引用なし
パスワード
   結果報告とお礼が遅くなりまして
申し訳ありません。

上手く動作致しました。
今回も根気よくご指導いただきまして
ありがとうございます。

同じことをするにしても、
幾通りものやり方や考え方があるんですね。
またまた、勉強になりました。

ただ、少し私が考えているものと
若干異なる部分もありましたので
後は、自分で考えてやってみたいと思います。

今回、教えて頂いた様々なことをもとに
必要な関数や考え方がわかりましたので、
多分、大丈夫ではないかと思います・・・。

また、わからなくなりましたら
再度、ご質問させて頂きます。
いつも丁寧にありがとうございます。

【6957】Re:2年分の検索方法は?
お礼  わん  - 05/12/12(月) 16:41 -

引用なし
パスワード
   お世話になっております。
希望していたものができました。
ありがとうございました。

少し時間ができたので、
落ち着いて今回教わったことを
最初(DLookup関数)から全部実施してみました。

どうやら、
一番最初に教えて頂いたDLookup関数が
私のやりたかったことでした。

関数が上手く動作しなかったのは、
SQLの文字が大文字だったり、
カンマが抜けてしまっていたりしたことが
原因だったようです。

初歩的なミスのため、
お時間をとらせてしまい申し訳ありませんでした。

今回も大変ためになりました。
本当に有難うございました。

追伸、
VBAは数学にちょっと似てますね。
基本は、法則(マクロ・コード)を理解して、
公式(関数)を沢山覚えるって感じですね。
今回のことで参考書の使い方がわかりました。
今度からは、もう少し自分で作ってから質問できそうです。

有難うございました。

【6961】Re:2年分の検索方法は?
質問  わん  - 05/12/13(火) 11:26 -

引用なし
パスワード
   お世話になっています。
恥ずかしながら、もう壁にぶつかってしまいました。

現在は、
以前に教えて頂いたDLookUp関数を使うことにして
以下のSQLを利用しています。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
DateAdd("yyyy",-1,[日付]) AS 前年度日付,
DLookUp("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1,
DLookUp("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI;

そこで1つ問題が発生しました。
上記を利用すると例えばうるう年を含めた前後の年度、
つまり2月29日が存在する年度では前年結果が非表示ではなく、
前年の2月28日の結果が表示されてしまいます。

例)2003年2月28日
   2004年2月29日 → 未記入ではなく2003年2月28日の結果が表示

どうやったら未記入にできるのでしょうか?
ちなみにデータが無い年度に関しては未記入になります。
自分では、IIfを使うのか?Nullチェックか?それともYearじゃないのか?
とも考えてみたのですが上手くいきません。

上手く解決する方法はありますでしょうか。
度々ですが宜しくお願いします。

【6962】Re:2年分の検索方法は?
発言  小僧  - 05/12/13(火) 13:15 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

>お世話になっています。
>恥ずかしながら、もう壁にぶつかってしまいました。

当方も壁にぶつかっては Help や MS の技術者情報のページと格闘してますよ^^;

>上記を利用すると例えばうるう年を含めた前後の年度、
>つまり2月29日が存在する年度では前年結果が非表示ではなく、
>前年の2月28日の結果が表示されてしまいます。

>DLookUp("結果1","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1

こちらは、

・名前が一致して
・日付が去年のデータ

のうち、一番初めに見つかったものを返す式です。
したがって前年結果1 は月日に関係なく前年であれば値を引っ張ってきてしまいます。

>どうやったら未記入にできるのでしょうか?

日付まで意識して前年のものを取ってくるとすると、こんな感じでしょうか。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
IIf(Format([日付],"mmdd")="0229",Null,DateAdd("yyyy",-1,[日付])) AS 前年度日付,
DLookUp("結果1","テーブルI","[日付] = #" &
Nz([前年度日付],CDate(0)) & " # AND 名前 = '" & [名前] & "'") AS 前年結果1,
DLookUp("結果2","テーブルI","[日付] = #" &
Nz([前年度日付],CDate(0)) & " # AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI;

【6964】Re:2年分の検索方法は?
発言  わん  - 05/12/13(火) 14:21 -

引用なし
パスワード
   お見事です!!
有難うございました。
これで完璧です。

今回教えて頂いたことで1つわかったのですが、
DLookUp関数を使うとフォーム上での速度が非常に遅くなるのですが、
DLookUp関数は処理速度を遅くしてしまう関数なのですか?

立ち上がるまでに1分ほど掛かってしまいます。
フィルタ検索をするときは5秒掛かるかどうかなで構わないと思いますが、
これは、私のやり方が悪いのでしょうか?

あと、SQL文はクエリ作成だけでなく同じものをフォーム上でも
作成できることがわかりました。
クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?
クエリ内での計算式はデータとして別利用しないものは、
フォーム上での作成の方が良いのでしょうか?

宜しくお願いします。

【6966】Re:2年分の検索方法は?
発言  小僧  - 05/12/13(火) 15:17 -

引用なし
パスワード
   ▼わん さん:
こんにちは。

>今回教えて頂いたことで1つわかったのですが、
>DLookUp関数を使うとフォーム上での速度が非常に遅くなるのですが、
>DLookUp関数は処理速度を遅くしてしまう関数なのですか?

残念ながらその通りです。

D系関数(定義域集計関数…DLookupやDCountなど)は使い勝手が良いのですが
参照するテーブルのレコード数が多くなると計算速度が落ちてしまいます。

こちらのテストデータですと20件余りなので気にならなかったのですが
わん さんが使用される環境ですと顕著に現れてしまうみたいですね…。


>クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?

こちらは処理速度には関係ないと思われます。
(あくまで当方の考えですが…。)


当方が作っている MDB は殆どクエリが存在しません。
先にご提示されている様にフォーム内に埋め込んでしまったり、

アクションクエリ(DELETE や INSERT など)については VBA にて

Docmd オブジェクトの RunSQL メソッド
DAO や ADO の Execute メソッド

にて実行してしまう為です。

作成段階で視覚的に SQL の実行結果を確認する場合などにクエリを作ったりしますが、
完成時には全て消去してしまいます。

ですが、複数人で MDB を製作したり後々の人のメンテナンスを考えると

Q_メインフォームの基
Q_前年度分結果

など、解りやすい名前でクエリを保存しておく方が良い場合もあると思います。

【6967】Re:2年分の検索方法は?
回答  小僧  - 05/12/13(火) 15:21 -

引用なし
パスワード
   長くなりましたので、分けますね。

先ほどの結果をDLookupを使わないでやってみました。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
IIf(Format([テーブルI].[日付],"mmdd")="0229",Null,DateAdd("yyyy",-1,[テーブルI].[日付])) AS 前年日付,
P.結果1 AS 前年結果1,
P.結果2 AS 前年結果2
FROM テーブルI LEFT JOIN [
SELECT IIf(Format(テーブルI.日付,"mmdd")="0229",Null,DateAdd("yyyy",1,テーブルI.日付)) AS 来年日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2
FROM テーブルI
]. AS P
ON (テーブルI.日付 = P.来年日付) AND (テーブルI.名前 = P.名前)
ORDER BY テーブルI.日付;


DLookUPよりは速い結果が出ると良いのですが…。

【6968】Re:2年分の検索方法は?
発言  わん  - 05/12/13(火) 16:36 -

引用なし
パスワード
   早速の回答、有難うございます。

>残念ながらその通りです。
>
>D系関数(定義域集計関数…DLookupやDCountなど)は使い勝手が良いのですが
>参照するテーブルのレコード数が多くなると計算速度が落ちてしまいます。
>
>こちらのテストデータですと20件余りなので気にならなかったのですが
> わん さんが使用される環境ですと顕著に現れてしまうみたいですね…。

はい。
結果1、結果2というのはここで教えて頂くための例文のようなもので、
実際はこれに当たるものが12個あります。
ですから、
1つのフォーム又はクエリの中に
12個のDLookup関数を使用していることになります。
テスト中のデータ件数は803件しかないですから、
今のままでは、実際にはもっと遅くなるということですよね。


>>クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?
>
>こちらは処理速度には関係ないと思われます。
>(あくまで当方の考えですが…。)

前回教えて頂いたときに、
MDBの重さや速度のことをご指摘いただきましたので
今は少しは考えながらやっていますので、
なるべくデータ自体を減らし、できる限りフォーム内にて作成しております。

また、新たにLeftJoin句について教わりましたので、
実際のものに変更するのに時間がかかると思いますがやってみます。
出来上がりましたらご報告させていただきます。

とりあえず、お礼を申し上げます。
有難うございました。

【7022】Re:2年分の検索方法は?
お礼  わん  - 05/12/28(水) 1:48 -

引用なし
パスワード
   できました!!
随分時間が掛かりましたが・・・。

クエリの中身を把握するのに四苦八苦でした。
Left JOIN句を使用するときは
クエリ内でフィールドを使って計算式を作成したらダメなんですね。

それに気が付くまでに時間が掛かりました。
DLookup関数を使用しているときとは比較になりません。
DLookup関数で1分以上掛かる時間をほんの一瞬で
動作できるようになりました。正に完璧です。

本当にいつもありがとうございます。
またこの次もお願いします。

そういえば、小僧さんはもうすぐ会社がお休みですかね。
教えて頂きたいことがあっても答えてもらえなくなってしまいますね。

では、またお会いできることを楽しみにしております。
本当にありがとうございました。

1468 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078229
(SS)C-BOARD v3.8 is Free