Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Access 2016)
顧客管理システムを作成したいです。
投稿日時: 18/11/06 17:42:34
投稿者: Cst&Dog

顧客管理システムの作成をしています。(完全素人の独学です。)
 
現在すでに出来たものとして顧客の注文データが入っているテーブルが1つ
そのデータを検索するフォームがあります。
 
データの内容としては、
名前、商品名、メールアドレス1、メールアドレス2、メールアドレス3、金額、購入日
となっています。
 
検索フォームでは、名前とメールアドレス1,2,3のどれかに引っかかるようVBAで検索できるようにしています。
(検索窓は1つで4つのどれかにひっかかるという感じです。)
 
ただ、これだと同じ顧客が3件注文した履歴があり、2件はアドレスを2個、1件はアドレス1個のデータとなっている場合、アドレスが1件しかない注文データが表示されなないことになります。
 
これを回避するため、できれば
1.顧客情報だけのテーブルを作る
2.注文データだけのテーブルを作る
3.1と2のテーブルを紐づける
4.1のテーブルを検索し、出て来た検索結果から2の情報を表示する
 
といったことをしたいと思いました。
 
ただ、いろんな本などをみてもうまく出来ず困っております。
 
件数が6000件近くあり、またひと月あたり100件前後のデータが増えます。
月初に前月分をまとめていれるのでIDで管理なども出来ずにいます。
 
どうすればいいでしょうか?
ご回答いただけるととても助かります。
 
何卒宜しくお願い致します。

回答
投稿日時: 18/11/06 17:56:56
投稿者: sk

引用:
現在すでに出来たものとして顧客の注文データが入っているテーブルが1つ
そのデータを検索するフォームがあります。
  
データの内容としては、
名前、商品名、メールアドレス1、メールアドレス2、メールアドレス3、金額、購入日
となっています。

とりあえずサンプルデータベース(ノースウィンドなど)を
新規作成してみて、それぞれのテーブルやフォームが
どのように設計されているかを確認された上で、
テーブル設計から見直された方がよろしいのではないでしょうか。

投稿日時: 18/11/06 18:17:13
投稿者: Cst&Dog

早急なご回答ありがとうございます。
すでに出来たものは、Yahoo知恵袋などであったものを自分で作成してつくりました。
  
一度はそれでもいいかと思ったのですが、やはり検索ででてこないものがあるとこまるので変更したいと思っています。

回答
投稿日時: 18/11/06 19:01:55
投稿者: Suzu

引用:
検索フォームでは、名前とメールアドレス1,2,3のどれかに引っかかるようVBAで検索できるようにしています。
(検索窓は1つで4つのどれかにひっかかるという感じです。)
  
ただ、これだと同じ顧客が3件注文した履歴があり、2件はアドレスを2個、1件はアドレス1個のデータとなっている場合、アドレスが1件しかない注文データが表示されなないことになります。

 
現状、どのようなコードなのでしょうね。
アドレスが1件しかない注文データが表示されなないことになります。
この部分の理屈が良く分かりません。
 
 
フィルターを使うなら
 
If IsNull(Me.txtBox) = False Then
  strFilter = "名前='" & Me.txtBox & "' Or アドレス1='" & Me.txtBox & "' Or " & _
             "アドレス2='" & Me.txtBox & "' Or アドレス3='" & Me.txtBox & "'"
  Me.Filter = strFilter
End If
 
の様なコードで充足するのではないでしょうか。

投稿日時: 18/11/06 21:52:42
投稿者: Cst&Dog

説明が分かりづらくすみません。
 
Me.Filter = "名前 Like ""*" & Me.検索入力.Text & "*"" or " & _
"メールアドレス Like ""*" & Me.検索入力.Text & "*"""
 
会社のPCで作成しているので、すべてのコード?を思い出せないのですが、作ったものはこちらになります。
 
 
1件しかアドレスがないものが表示されない理由ですが、
例えばの話ですが
 
Aさんは1と2のアドレスを持っています。
AAという商品を購入するときは1と2両方のアドレスを入力してくれたのですが
BBという商品の時は1しか入力してくれませんでした。
 
データとして
Aさん、アドレス1、アドレス2、購入AA
Aさん、アドレス1、購入BB
の2つができます。
 
これを検索するとき名前やアドレス1で検索をすると、AAとBB両方の購入履歴がでてきますが
アドレス2で検索するとAAの購入履歴しか出て来なくなってしまいます。
 
現在作成したものですと、こういうものとなってしまっています。
 
テーブルとしては
Aさん、アドレス1、アドレス2、購入AA
Aさん、アドレス1、購入BB
といった購入履歴のみのテーブルになってます。
 
 
これをすべてがでてくるように、したいと思っています。
 
そうなったとき、Aさんの基礎情報として
Aさん、アドレス1、アドレス2、住所etc
というテーブルを作り
 
購入情報の
Aさん、アドレス1、アドレス2、購入AA
Aさん、アドレス1、購入BB
のテーブルも作ります。
 
これをなんとかして、購入情報のデータを入れたときに基礎情報のAさんデータを紐づけたいです。
 
何卒宜しくお願い致します。

回答
投稿日時: 18/11/07 10:28:21
投稿者: sk

引用:
Aさんは1と2のアドレスを持っています。
AAという商品を購入するときは1と2両方のアドレスを入力してくれたのですが
BBという商品の時は1しか入力してくれませんでした。

引用:
これを検索するとき名前やアドレス1で検索をすると、AAとBB両方の購入履歴がでてきますが
アドレス2で検索するとAAの購入履歴しか出て来なくなってしまいます。

引用:
これをすべてがでてくるように、したいと思っています。

引用:
Me.Filter = "名前 Like ""*" & Me.検索入力.Text & "*"" or " & _
"メールアドレス Like ""*" & Me.検索入力.Text & "*"""

Dim strCriteria As String
With Me
    If Nz(![検索入力], "") <> "" Then
        strCriteria = "[名前] In (" & _
                      "SELECT tmp.[名前] FROM [テーブル名] tmp" & _
                      " WHERE tmp.[名前] Like ""*" & ![検索入力] & "*""" & _
                      " OR tmp.[メールアドレス1] Like ""*" & ![検索入力] & "*""" & _
                      " OR tmp.[メールアドレス2] Like ""*" & ![検索入力] & "*""" & _
                      " OR tmp.[メールアドレス3] Like ""*" & ![検索入力] & "*""" & _
                      ")"
    End If
    .Filter = strCriteria
    .FilterOn = (strCriteria <> "")
End With
 
-------------------------------------------------------------------------------
(テーブル/フィールドの名前は適宜修正すること)
 
引用:
そうなったとき、Aさんの基礎情報として
Aさん、アドレス1、アドレス2、住所etc
というテーブルを作り
  
購入情報の
Aさん、アドレス1、アドレス2、購入AA
Aさん、アドレス1、購入BB
のテーブルも作ります。

それとは別に、テーブルの正規化
適切に行なわれた方がよいでしょう。

投稿日時: 18/11/07 17:48:04
投稿者: Cst&Dog

私が、あまりにも素人でして、いまいち理解できておらず、すみません。
  
検索ボタンを押すと現在下記のようになっています。
  
  
Private Sub btnSearch_Click()
  
If Not IsNull(Me.検索入力) Then
  
Me.Filter = "名前 Like '*" & Me.検索入力 & "*' OR " & _
"メールアドレス Like '*" & Me.検索入力 & "*' OR " & _
"メールアドレス2 Like '*" & Me.検索入力 & "*' OR " & _
"メールアドレス3 Like '*" & Me.検索入力 & "*'"
  
Me.FilterOn = True
Else
Me.Filter = ""
Me.FilterOn = False
  
End If
  
Me.検索入力.SetFocus
  
End Sub
  
これを
 
    

引用:

    Dim strCriteria As String
    With Me
        If Nz(![検索入力], "") <> "" Then
            strCriteria = "[名前] In (" & _
                          "SELECT tmp.[名前] FROM [テーブル名] tmp" & _
                          " WHERE tmp.[名前] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス1] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス2] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス3] Like ""*" & ![検索入力] & "*""" & _
                          ")"
        End If
        .Filter = strCriteria
        .FilterOn = (strCriteria <> "")
    End With

 
 
  
これに書き換えればいいということでしょうか?

回答
投稿日時: 18/11/07 17:57:24
投稿者: sk

引用:
Private Sub btnSearch_Click()


 
引用:
Me.検索入力.SetFocus

の間にあるコードを、私が例示したようなコードに
置き換えればよいでしょう。
 
引用:
strCriteria = "[名前] In (" & _
              "SELECT tmp.[名前] FROM [テーブル名] tmp" & _
              " WHERE tmp.[名前] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス1] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス2] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス3] Like ""*" & ![検索入力] & "*""" & _
              ")"

その上で、上記のテーブルとフィールドの名前を
指定する箇所は適宜書き換えて下さい。

投稿日時: 18/11/08 08:53:43
投稿者: Cst&Dog

教えて頂いたものを入力したところエラーとなってしまいました…
エラー内容としては
 
コンパイル エラー:
参照が不正または不完全です。
 
といったものでした。
 
どこがおかしいのでしょうか?
何度も申し訳ございません。
ご教授頂けますと助かります。
 
 
変更した内容は下記となります。
 
Option Compare Database
 
Private Sub btnSearch_Click()
 
strCriteria = "[名前] In [" & _
              "SELECT tmp.[名前] FROM [M_顧客情報] tmp" & _
              " WHERE tmp.[名前] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス1] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス2] Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.[メールアドレス3] Like ""*" & ![検索入力] & "*""" & _
              "]"
 
Me.検索入力.SetFocus
 
End Sub

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

引用:
Option Compare Database
  
Private Sub btnSearch_Click()
  
strCriteria = "名前 In " & _
              "SELECT tmp.名前 FROM M_顧客情報 tmp" & _
              " WHERE tmp.名前 Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.メールアドレス1 Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.メールアドレス2 Like ""*" & ![検索入力] & "*""" & _
              " OR tmp.メールアドレス3 Like ""*" & ![検索入力] & "*""" & _
              ""
  
Me.検索入力.SetFocus
  
End Sub

 
・2018/11/07 10:28:21 に例示したコードの
 一部分だけを貼り付けている。
 
・半角文字の "[" 及び "]" を記述すべき箇所が全て
 全角文字の "[" 及び "]" に書き換えられている。
 
・何故か "(" が "[" に、")" が "]" に
 書き換えられている箇所がある。
 
----------------------------------------------------------------------
Option Compare Database
Option Explicit
 
Private Sub btnSearch_Click()
         
    Dim strCriteria As String
         
    With Me
        If Nz(![検索入力], "") <> "" Then
            strCriteria = "[名前] In (" & _
                          "SELECT tmp.[名前] FROM [M_顧客情報] tmp" & _
                          " WHERE tmp.[名前] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス2] Like ""*" & ![検索入力] & "*""" & _
                          " OR tmp.[メールアドレス3] Like ""*" & ![検索入力] & "*""" & _
                          ")"
        End If
         
        .Filter = strCriteria
        .FilterOn = (strCriteria <> "")
         
    End With
 
End Sub
----------------------------------------------------------------------

投稿日時: 18/11/08 13:52:53
投稿者: Cst&Dog

検索ででてくるようになりました!!
 
ありがとうございます!
 
更に質問をしたいのですが、新たに質問を上げた方がいいでしょうか?
このまま質問させていただいてもよろしいでしょうか?

回答
投稿日時: 18/11/08 13:59:42
投稿者: sk

引用:
更に質問をしたいのですが、新たに質問を上げた方がいいでしょうか?
このまま質問させていただいてもよろしいでしょうか?

このスレッドの内容と直接関係がない問題なのであれば、
新たにスレッドを作成されることをお奨めします。

投稿日時: 18/11/08 15:06:04
投稿者: Cst&Dog

ありがとうございます。
 
別スレであげさせていただきます!
 
本当にありがとうございました。
また、別スレももしよろしければお願いします。