こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

選択クエリをフォーム形式で作りたい

ACCESS2010を使用しています。
ACCESSを使用して、1カ月未満の超初心者です。
頭でイメージしている事がACCESSで作れるのか分からず。
作成可能なら方法を教えて頂きたいですm(__)m

選択クエリを誰でも使いやすいように、フォームの形にしたいです。
言い方を変えると、フォームに選択クエリの機能をつけたい。(あまり変わらないか汗)

フォームは上下で分割フォーム?のように分かれており、
上部には、選択クエリのように条件を指定して、
一致した結果を下部に表形式で表示をさせたいです。

データは以下の通りです。
【テーブル名】
 売上表

【フィールド】
1.購入日(1/1,2/2,etc...)
2.領収書(有・無)
3.購入店(A青果、B青果,etc...)
4.購入内容(りんご、みかん、すいか,etc...)
5.原産国(USA,UK,etc...)
6.原価(10円,50円,etc...)
7.販売価格(100円,200円,etc...)

↓フォームイメージです↓

-----------------------------------------------
¦≪フィールド≫ ≪検索したい事入力≫       ¦
¦[購入日]------[1/1]                     ¦
¦[領収書]------[有]                     ¦
¦[購入店]------[A青果]      ¦
-----------------------------------        ¦
¦結果 ¦
¦                               ¦
¦[購入日] [購入店] [購入内容] [原産国]    ¦
¦-------------------------------------   ¦
¦[ 1/1 ] [A青果 ] [ り ん ご ] [USA ]     ¦
¦[ 1/1 ] [A青果 ] [ みかん ] [USA ]      ¦
¦[ 1/1 ] [A青果 ] [ みかん ] [UK ]       ¦  
¦  ・ ¦
¦  ・ ¦
¦---------------------------------------------¦


(説明)
テーブル:売上表の中のフィールド1、2、3.を使用し、
1.購入日:1/1かつ、2.領収書:有かつ、3.購入店:A青果でソートをかけると、
それに一致するフィールド1、3、4、5の内容が表形式で現れて欲しい。
※フィールド1、2、3は、入力補助として、テーブル:売上表のデータから
ドロップダウンリスト(コンボ?)のようにし、選択出来るようにしたい。
※[3.購入店]が空欄でも、[1.購入日]と、[2.領収書]が入力されていれば、結果が出るようにしたい。
※表示された結果は書き込みしたいので、テーブル:売上表が出るようにしたい。
  (クエリだと書き込みできない構造。。)

以上、頭の中の構想ですが、どのようにしたら作成できるでしょうか?
ACCESSの解説書やネットなどで勉強していますので、
方法を教えて頂けましたらVBAでも、がむしゃらに完成できるようにします。
(VBA使わずに作成できるなら、そちらの方がありがたい…><)

どうぞ、お力をお貸しください。
また、情報が不足していましたらご説明いたしますので、コメント願います。
よろしくお願いします。

投稿日時 - 2014-01-23 22:35:08

QNo.8443690

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

No1より続き

(7)
二つ目のボタンの「名前」を、「cmd全表示」とします。
「標題」は「全表示」としておきます。ようするに
ボタンの表面の表示文字です。(6)のボタンと同様に
「クリック時のイベント」を選択し、

Private Sub cmd全表示_Click()
'フィルタを解除しすべて表示
Me.FilterOn = False
End Sub

のようにしておきます。

(8)
三つ目のボタンの「名前」を「cmd条件クリア」と
しておきます。「標題」は「条件クリア」としておきます。
同様にして、「クリック時のイベント」で以下のように
設定しておきます。

Private Sub cmd条件クリア_Click()
'条件をクリア
Me!cmb購入日 = Null
Me!cmb領収書 = Null
Me!cmb購入店 = Null
End Sub


以上、(1)~(8)で本来ならば、すべての
設定は終了です。
まだ、ボタンが一つ残っています。実は、テーブルに
フィルタをかけて質問の機能を設定するならば、(6)の
ようなVBAコードが一般的なのです。しかし、たとえば
条件をもう一つ増やすならば、コンボボックスまたは
テキストボックスを追加し、検索条件をVBAで設定
するようになります。ところが検索条件を3つから
4つに増やすとどれだけVBAでコードが増えるか
わかりますでしょうか。考えただけでも身震いが
します。(6)のようなコードの書き方をしていては
うんざりします。
そこで、なんとか少ないコードでできないだろうか
と考えると、以下のようなコードの書き方が
出てきます。

(9)
4っつ目のボタンの「名前」を「cmd検索実行2」とします。
ボタンの「標題」を「検索実行2」としておきます。
「クリック時のイベント」で、以下のように
設定しておきます。


Private Sub cmd検索実行2_Click()
  Dim strFilter As String
  Dim i As Long
  Dim ctl As Control

  'フォームの詳細より上にあるコントロールを検索
  For Each ctl In Me.Section(acHeader).Controls
    'コントロールの種類がコンボボックスであるか確認
    If TypeOf ctl Is ComboBox Then
      'コントロールにデータが表示されているか
      If Not IsNull(ctl.Value) Then
        'コントロールの名前が「cmb購入日」であるか確認
        If ctl.Name = "cmb購入日" Then
          '変数strFilterにデータが入っているか確認
          If strFilter <> "" Then
            '入っている場合の処理
            strFilter = strFilter & " AND "
            strFilter = strFilter & "[購入日] = #" & Me![cmb購入日] & "#"
          Else
            '入っていない場合の処理
            strFilter = strFilter & "[購入日] = #" & Me![cmb購入日] & "#"
          End If
        'コントロールの名前が「cmb購入日」でない場合の処理
        Else
          '変数strFilterにデータが入っている場合の処理
          If strFilter <> "" Then
           strFilter = strFilter & " AND "
           strFilter = strFilter & "[" & Right(ctl.Name, Len(ctl.Name) - 3) & "]" & " Like '*" & ctl.Value & "*'"
          'データが入っていない場合の処理
          Else
           strFilter = strFilter & "[" & Right(ctl.Name, Len(ctl.Name) - 3) & "]" & " Like '*" & ctl.Value & "*'"
          End If
        End If
      End If
    End If
  Next
Me.Filter = strFilter
Me.FilterOn = True
End Sub


一部、この質問に合わせた仕様になっていますが、
それを除けば、コンボボックスやテキストボックスが
混在していても使えるように簡単に変更ができます。
このコードを全部説明するのは大変なので、いくつかを
説明しておきます。

strFilter = strFilter & "[購入日] = #" & Me![cmb購入日] & "#"

は、日付を取り扱う場合はフィールドが日付型の場合は
#で日付を囲む必要があります。

Right(ctl.Name, Len(ctl.Name) - 3)

は、コンボボックスの名前が「cmb購入日」のように
先頭に「cmb」という文字列がつけられているので、
これを利用して名前から「cmb」を取り除けば、
フィールド名と同じ文字列「購入日」がとりだせます。
これを行なう式が上記の式です。このあたりは、
Right関数、Len関数などで調べてみてください。


以上、わからないところがあれば補足してください。

投稿日時 - 2014-01-27 15:11:56

お礼

お礼が遅くなり申し訳ありません。

素人ということを加味して、とても丁寧に解説頂き
本当にありがとうございます!!!
感動すら覚え、頭が下がる思いです。

教えて頂いた通りに作成してみます。
不明点や、つまづいた時に、ご質問させて頂くかもしれません。その際は、再度お付き合い頂けると大変助かります。
厚かましいお願いですが…。
また、完成しましたら、お礼を兼ねてご報告させて頂きます。

以上、取り急ぎお礼まで。

お時間を割いて、お答え頂き、
本当に本当にありがとうございました。

投稿日時 - 2014-02-02 21:56:45

ANo.1

長いので、回答を二つにわけます。


本題は、

>選択クエリを誰でも使いやすいように、フォームの形にしたいです。
>言い方を変えると、フォームに選択クエリの機能をつけたい。

というよりも、

>条件を指定して、一致した結果を下部に表形式で表示をさせたい

ということだろうということで、条件を設定するのは、

>1.購入日:1/1かつ、2.領収書:有かつ、3.購入店:A青果

の三つのフィールドについてで、複数の条件を設定できるようにして
条件に合うレコードを表形式で表示したい、ということなのだろうと
解釈しておきます。

Accessにかぶりついて日が浅いということなので、概略だけで
VBAは組み込めないでしょうから、上記の条件で一通り作成
の仕方を説明します。

(1)
テーブル「売上表」をもとにして、ウィザードで表形式のフォームを
作成します。そのときに表示するフィールド選択して作成します。

(2)
作成したフォームをデザインビューで開き、詳細のところにマウス
のを当て、表示が十字のようになったらグイッと下に移動させます。
ついでにラベルなどもすべて選択して下に下げます。

(3)
コンボボックスを三つ空いたところに設定します。
コンボボックスの名前は、「cmb購入日」、「cmb領収書」、「cmb購入店」
とします。次に各コンボボックスの設定を説明します。

(4)
「cmb購入日」
フォームをデザインビューで開き、コンボボックスのプロパティ
を表示し、名前が「cmb購入日」であることを確認しておきます。
プロパティの「値集合ソース」のところで右クリックして
「ビルド」を選択するか、あるいは一番右端をクリックして
「クエリビルダ」を起動し、テーブル「売上表」を追加します。
フィールドに「購入店」を表示し、ツールバーで「集計」を
クリックしてグループ化します。「集計」は「Σ」という記号
でツールバーにあると思います。設定が終わったら、そのまま
クエリビルダを閉じます。そのときに保存の確認が出るので
「はい」としておきます。

「cmb領収書」
コンボボックスの名前の確認を済ませたら、プロパティの
「値集合タイプ」のところをクリックして「値リスト」を
選択します。「値集合ソース」に「"有";"無"」を貼り付け、
保存します。

「cmb購入店」
「クエリビルダ」を表示し、テーブルを追加するところ
までは「cmb購入日」と同じです。「クエリビルダ」の
フィールドに「購入店」を表示し、「cmb購入日」と
同じようにグループ化し、同じ処理をして「クエリビルダ」
を閉じます。

以上でコンボボックスの設定は終了です。

(5)
ボタンを4つ設定しておきます。

(6)
一つ目のボタンの名前を、「cmdフィルタ実行」とでも
しておきます。標題は「フィルタ実行」としておきます。
プロパティの「クリック時のイベント」を選択し、
コード表を表示します。コード表を表示すると、

Private Sub cmdフィルタ実行_Click()

End Sub

と表示されていると思います。その中に質問の機能を
実現するコードを書き入れていきます。では・・・どうぞ、
ということではどうにもなりませんから、上記の
コードの中に以下をコピーし、保存してください。

'######## ここから ###########
Dim strFilter As String

If Not IsNull(Me!cmb購入日) And Not IsNull(Me!cmb領収書) And Not IsNull(Me!cmb購入店) Then
strFilter = "[購入日] = #" & Me![cmb購入日] & "# AND [領収書] Like '*" & Me![cmb領収書] & "*' AND [購入店] Like '*" & Me![cmb購入店] & "*'"
End If

If Not IsNull(Me!cmb購入日) And Not IsNull(Me!cmb領収書) And IsNull(Me!cmb購入店) Then
strFilter = "[購入日] = #" & Me![cmb購入日] & "# AND [領収書] Like '*" & Me![cmb領収書] & "*'"
End If

If Not IsNull(Me!cmb購入日) And IsNull(Me!cmb領収書) And Not IsNull(Me!cmb購入店) Then
strFilter = "[購入日] = #" & Me![cmb購入日] & "# AND [購入店] Like '*" & Me![cmb購入店] & "*'"
End If

If IsNull(Me!cmb購入日) And Not IsNull(Me!cmb領収書) And Not IsNull(Me!cmb購入店) Then
strFilter = "[領収書] Like '*" & Me![cmb領収書] & "*' And [購入店] Like '*" & Me![cmb購入店] & "*'"
End If

If Not IsNull(Me!cmb購入日) And IsNull(Me!cmb領収書) And IsNull(Me!cmb購入店) Then
strFilter = "[購入日] = #" & Me![cmb購入日] & "#"
End If

If IsNull(Me!cmb購入日) And IsNull(Me!cmb領収書) And Not IsNull(Me!cmb購入店) Then
strFilter = "[購入店] Like '*" & Me![cmb購入店] & "*'"
End If

If IsNull(Me!cmb購入日) And Not IsNull(Me!cmb領収書) And IsNull(Me!cmb購入店) Then
strFilter = "[領収書] Like '*" & Me![cmb領収書] & "*'"
End If

If IsNull(Me!cmb購入日) And IsNull(Me!cmb領収書) And IsNull(Me!cmb購入店) Then
strFilter = ""
MsgBox "すべて表示します"
End If

'フィルタをかける
Me.Filter = strFilter
Me.FilterOn = True
'############ ここまで ##########





以下続きます。

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2014-01-27 15:09:21

あなたにオススメの質問