プロが教える店舗&オフィスのセキュリティ対策術

Access2000でDBをつくりました。

そのデータから検索をして、抽出をしたいのです。
検索条件をいれるデータはこれ、と決まっていればパラメータークエリでもつくればいいのですが、どれでも検索条件にするようにしたい、と使用者から頼まれました。
入力方法としては単票フォームを開き、検索したい項目に、検索条件をいれると抽出される、というようなものです。
検索したい項目は日付かもしれないし、名前かもしれない、はたまた会社名かもしれない、とバラバラなのです。
その項目毎にパラメータクエリをつくるのもちょっと・・・と思うので。
何かいい方法はありますでしょうか?

よろしくお願いします。

A 回答 (8件)

検索機能のみでしたら、Accessの検索ダイアログを使用するのが一番です。


ですが、抽出機能(フィルタ)も付加したフォームを作成するとなれば、VBAの知識が必要になってきます。
(確かにパラメータクエリーだけでは作るのは面倒になってきますね)

VBAで作成する場合には、コードの中でSQL(クエリー)を編集し、実行する方法が宜しいかと思います。

的をはずしていたら、すみません (^^;)

この回答への補足

早速のご回答ありがとうございます。

検索ダイアログをしようする、というのも考えましたが、あれって検索条件がひとつだけなんですよね?
複数の条件をつけたいこともあるらしいので・・・。

もしよろしければVBA・SQLの書き方を教えていただけないでしょうか?

補足日時:2001/12/13 14:15
    • good
    • 0

簡単な検索ソースを書きます。


↓がパラメータクエリをSQLビューで閲覧した際に見えますよね?

SELECT テーブル名.TEL, テーブル名.社名
FROM テーブル名
WHERE (((テーブル名.SQNO)= [SQNOを入力して下さい。] ));

そこで簡単な検索方法では↓Docmd.Runsqlを使用します。

Dim intKen As Integer 
'数字の場合Integer・文字列の場合はString
intKen = Me.検索値 
'検索値=フォームのテキストボックスの名前・intKen(変数に格納)
Docmd.Runsql "SELECT テーブル名.TEL, テーブル名.社名" _
& "FROM テーブル名 WHERE (((テーブル名.SQNO)= " & intKen & " ));
'「説明」SQLを改行する際は「 ~" _ 」で改行して次行は「 & " 」
'[]のパラメータクエリが入る場所に"&変数名&"を入れる。
'上記は数字の場合で文字列は「 '" & intKen & "' 」

こんな感じでよろしいでしょうか?
そうそうあいまい検索の際には「*」を入れてください。
また、わからない点は追記して下さい。

この回答への補足

Dim intKen As Integer
intKen=Me.検索値
docmd.Runsql"SELECT 一覧.Date_year, 一覧.Date_month, 一覧.Date_day, 一覧.氏名ID, 一覧.ソートID1, 一覧.ソートID2, 一覧.氏名, 一覧.削除対象, 一覧.挨拶状送付, 一覧.年賀状送付先, 一覧.暑中見舞送付先, 一覧.ランク, 一覧.喪中, 一覧.会社グループID, 一覧.会社名, 一覧.会社名2, 一覧.役職, 一覧.所属, 一覧.会社郵便番号, 一覧.会社住所, 一覧.会社電話番号, 一覧.自宅郵便番号, 一覧.自宅住所, 一覧.自宅電話番号, 一覧.お歳暮・お中元_備考, 一覧.住所・ハガキ_備考, 一覧.異動・退職_備考, 一覧.その他_備考"_&From 一覧 WHERE(((一覧.Date_year)=" & intKen & "));

とかいたところ
「SQLステートメントが正しくありません。
'DELEATE'、'INSERT'、'PROCEDURE'、'SELECT'または'UPDATE'をしようしてください。」
と出ました。
その後
SELECT 一覧.Date_year, 一覧.Date_month, 一覧.Date_day, 一覧.氏名ID, 一覧.ソートID1, 一覧.ソートID2, 一覧.氏名, 一覧.削除対象, 一覧.挨拶状送付, 一覧.年賀状送付先, 一覧.暑中見舞送付先, 一覧.ランク, 一覧.喪中, 一覧.会社グループID, 一覧.会社名, 一覧.会社名2, 一覧.役職, 一覧.所属, 一覧.会社郵便番号, 一覧.会社住所, 一覧.会社電話番号, 一覧.自宅郵便番号, 一覧.自宅住所, 一覧.自宅電話番号, 一覧.お歳暮・お中元_備考, 一覧.住所・ハガキ_備考, 一覧.異動・退職_備考, 一覧.その他_備考

Dim intKen As Integer
intKen=Me.検索値
docmd.Runsql"SELECT 一覧.Date_year, 一覧.Date_month, 一覧.Date_day, 一覧.氏名ID, 一覧.ソートID1, 一覧.ソートID2, 一覧.氏名, 一覧.削除対象, 一覧.挨拶状送付, 一覧.年賀状送付先, 一覧.暑中見舞送付先, 一覧.ランク, 一覧.喪中, 一覧.会社グループID, 一覧.会社名, 一覧.会社名2, 一覧.役職, 一覧.所属, 一覧.会社郵便番号, 一覧.会社住所, 一覧.会社電話番号, 一覧.自宅郵便番号, 一覧.自宅住所, 一覧.自宅電話番号, 一覧.お歳暮・お中元_備考, 一覧.住所・ハガキ_備考, 一覧.異動・退職_備考, 一覧.その他_備考"_&From 一覧 WHERE(((一覧.Date_year)=" & intKen & "));
としましたが、やはりうまくいきません。

どこが間違っているのでしょうか?

補足日時:2001/12/14 09:05
    • good
    • 0

こんにちは。

maruru01です。
まず最初に、抽出するフィールドは、[一覧]テーブルの全フィールドではないのですか? もし全フィールドなら、"SELECT * FROM 一覧 WHERE ・・・"としましょう。
さて、一応上のように全フィールドを抽出するとすると
intKen = CLng(Me!検索値)
SQL = "SELECT * FROM 一覧 WHERE Date_year = " & intKen
DoCmd.RunSQL SQL
となります。
KODAMARさんのコードでは、
"の位置がおかしい
SELECTやFROMの前後に半角スペースがあるか
SQLステートメントの文末がおかしい(最後の"がないなど)
文末の「;」は不要
などの問題点があります。
とりあえず、改行などは考えずに作りましょう。
ちなみに、テーブルは[一覧]しか使用しないので、テーブル名を省略してもかまいません。
またSELECT句で一部のフィールドのみ抽出する場合は、
SQL = "SELECT Date_year, Date_month, Date_day FROM ・・・"
という風に記述して下さい。
では。
    • good
    • 0

No.3のmaruru01です。


訂正です。
SELECTの前には半角スペースは要りません。(SQLステートメントの先頭なので。)
では。
    • good
    • 0

maruru01さん・こんにちは!


先日はありがとうございました。
KODAMARさんへ
「私もmaruru01さんにお世話になっている1人です。わかりやすい
説明ですのでmaruru01さんの回答を参考にしてください。では」
    • good
    • 0

条件付でサンプルコードを記します


・文字列検索のみ
・一つのフィールドのみ検索可(指定変更可能)
・複数条件の時は、OR条件で検索する

データはフォームで開いていて、検索フォームを作成したと仮定します
(データを開いているフォームは、「ABC」と仮定します)
(検索フォームは、「検索値」テキストボックスと「検索実行」コマンドボタンが配置されている)

'~~~~~~~~~~~~~~~~~~~~
Private Sub 検索実行_Click()
Dim stSearch As String '検索値
Dim stFieldName As String '検索対象フィールド名
Dim stFormName As String '検索対象フォーム名
Dim stSQL As String '検索条件
Dim stMsg As String 'メッセージ
Dim RS As DAO.Recordset '検索用レコードセット

'検索値を取得
stSearch = Nz(Me![検索値].Value, "")
If stSearch = "" Then
stMsg = "検索値が設定されていません!"
MsgBox stMsg, vbExclamation
Exit Sub
End If

'検索フィールド設定
stFieldName = "氏名"

'検索条件設定(複数可:"/"にて判断)
stSQL = 条件式作成(stSearch, stFieldName)

'検索対象フォームのレコードセット展開(フィルタ設定込み)
stFormName = "ABC"
Set RS = Forms(stFormName).RecordsetClone

'検索実行(次へ)
RS.FindNext stSQL
If RS.NoMatch = True Then
'検索実行(全体)
RS.FindFirst stSQL
If RS.NoMatch = True Then
stMsg = "データがありません!"
MsgBox stMsg, vbExclamation
Else
stMsg = "最後まで検索しました!" & vbCrLf & "また最初から検索しますか?"
If MsgBox(stMsg, vbYesNo + vbQuestion) = vbYes Then
'レコード移動
Forms(stFormName).Bookmark = RS.Bookmark
End If
End If
Else
'レコード移動
Forms(stFormName).Bookmark = RS.Bookmark
End If

'レコードセット解放
Set RS = Nothing

End Sub

'~~~~~~~~~~~~~~~~~~~~
Private Function 条件式作成(stSearch As String, stFieldName As String) As String
Dim stSQL As String '検索条件
Dim stTmp As String '作業用文字列
Dim intCnt1 As Integer '作業用カウンタ1
Dim intCnt2 As Integer '作業用カウンタ2
Const stSepa As String = "/" '検索条件区切り文字
Const stAst As String = "*" '検索条件アスタリスク
Const stQues As String = "?" '検索条件クエスチョン

'検索条件設定(複数可:"/"にて判断)
stSQL = ""
intCnt1 = 1
intCnt2 = InStr(1, stSearch, stSepa)
If intCnt2 = 0 Then
'条件式設定
If InStr(1, stSearch, stAst) = 0 And InStr(1, stSearch, stQues) = 0 Then
stSQL = "((" & stFieldName & ") = '" & stSearch & "')"
Else
stSQL = "((" & stFieldName & ") Like '" & stSearch & "')"
End If
Else
stTmp = Mid(stSearch, intCnt1, intCnt2 - 1)
Do Until stTmp = ""
'条件接続詞を付加
If stSQL <> "" Then stSQL = stSQL & " Or "
'条件式追加
If InStr(1, stTmp, stAst) = 0 And InStr(1, stTmp, stQues) = 0 Then
stSQL = stSQL & "((" & stFieldName & ") = '" & stTmp & "')"
Else
stSQL = stSQL & "((" & stFieldName & ") Like '" & stTmp & "')"
End If
intCnt1 = intCnt2 + 1
intCnt2 = InStr(intCnt1, stSearch, stSepa)
If intCnt2 = 0 Then intCnt2 = Len(stSearch)
stTmp = Mid(stSearch, intCnt1, intCnt2 - intCnt1 + 1)
Loop
End If

'戻り値設定
条件式作成 = stSQL

End Function

'~~~~~~~~~~~~~~~~~~~~
※参照設定で、「Microsoft DAO 3.6 Object Library」にチェックをつけておいて下さい

すいませんm(_ _)m 長くなってしまいました。
たぶん求めているのに近いと思います。(細かいところまでは動作確認をしておりませんが...)


抽出機能に関しては、「検索実行(次へ)」から以下を下記コードに置き換えればできると思います。
ただ、抽出(フィルタ)機能を使用すると、フィルタ条件をフォームが覚えてしまうので、どこかでフィルタの初期化をしてあげなければなりません。
'~~~~~~~~~~~~~~~~~~~~
'抽出実行
Forms(stFormName).Filter = stSQL
Forms(stFormName).FilterOn = True
'~~~~~~~~~~~~~~~~~~~~

フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。

もし、分からないところがあれば補足を御願い致します
それでは頑張って下さい (^^)/

この回答への補足

詳しい回答ありがとうございます!

これは・・・検索フォームをつくるための検索クエリに入れればよいのでしょうか?(初心者ですいません。)

>・文字列検索のみ
>・一つのフィールドのみ検索可(指定変更可能)
>・複数条件の時は、OR条件で検索する

条件まで考えていただいてありがとうございます。
確かにこういうことを考えなきゃ、と気づき使用者にきいたところ

・複数フィールドを一度に検索することもある。(日付と名前とか)
・同じフィールドで複数条件を検索することもある。(田中と山田という名前、とか)
・上記2つを同時に行うこともある。(東京都に住んでいる田中と山田など)

ということなのだそうです。

なんかできるのかできないのかさえ自分で判断できなくなってきてしまいました・・・。

それとできたら、ということで言われたのですが、ANDとORを切替えることができるボタンのようなものが欲しい、とのことなのです。
こういうことってできるのでしょうか?

>フィールド名設定やフォーム名設定などは、フォーム構成がどうなっているか分からないので、ちょっとアドバイスしかねます。

下に使用するフィールド名をかきますね。

・Date_year     日付の年(Ex.00(年))
・Date_month     日付の月(Ex.01(月))
・Date_day      日付の日にち
・氏名ID       個々に番号をつける
・ソートID1     ソートをするためのキー
・ソートID2     ソートをするためのキー
・氏名        
・削除対象      削除する場合にチェックする。(チェックボックス)
・挨拶状送付     送付する場合にチェックを入れる。(チェックボックス)
・年賀状送付先    自宅か会社か選択をする。
・暑中見舞い送付先    同  上
・ランク       A~Eを選ぶ。
・喪中        喪中の場合にチェック。(チェックボックス)
・会社グループID   会社のグループを選択する。
・会社名       
・会社名2      
・役職        
・所属        
・会社郵便番号    会社の郵便番号
・会社住所_都道府県  会社の住所の都道府県
・会社住所_市町村       市町村
・会社住所_町名        町名・番地
・会社電話番号    会社の電話番号
・自宅郵便番号    
・自宅住所_都道府県
・自宅住所_市町村
・自宅住所_町名
・自宅電話番号
・お歳暮・お中元_備考
・住所・ハガキ_備考
・異動・退職_備考
・その他_備考

以上が全フィールドです。

会社・自宅の住所・郵便番号は相互でどちらかを入れるとどちらかが自動で入るようになっています。


このような状態のもので検索フォームを作成し、使用することは可能でしょうか?

長々とかいてしまいました。
よろしくお願いします。

補足日時:2001/12/19 11:43
    • good
    • 0

あまり良い方法ではない(※レコード数に準じてメモリをかなり食います。

)
のですが、簡単な検索です。
フィルタを使用する検索方法です。ちなみにマクロにフィルタって有りますよね
それをソースで書くとこのようになります。(重いところもソックリ!)

1.検索用のフォームを作ります。
2.フォームヘッダにテキストボックスを1つ作ります。
3.「検索」「解除」というコンボボックスを1つずつ作ります。
4.「検索」のソースです。
DoCmd.ApplyFilter , "([検索先の名前] Like '*" & Me.2で作ったテキストボックス名 & "*')
5.「解除」のソースです。
Docmd.ShowAllRecords
以上です。
もし複数の検索値を指定したい場合は、([検索先]~) AND ([検索先]~)
ん~できれば↓の経験者様のソースを参考にするべきと思います。
    • good
    • 0

経験者様からの回答が得られなかった場合に参考にしてください!



>これは・・・検索フォームをつくるための検索クエリに入れればよいのでしょうか?(初心者ですいません。)

ちがいます!フォーム上にコマンドボタンを作ってコマンドボタンを右クリック
その中に「プロパティ」をクリック。
コマンドボタンのメニューが出ますので「イベント」をクリック
「イベント」の「クリック時」をクリック
「...」右側に3点リーダみたいなものがありますのでそれをクリック
そうすると「イベントプロシージャ」が立ち上がりますので、その中に記述してください。
ただし初心者では経験者様が書かれているのはチトムズイかも知れませんね!
>>第一歩として私が書いたものをソックリ真似てみてください。
>>あとは徐々に経験者さまの記述を解析をしてくことをお勧めします。

>・複数フィールドを一度に検索することもある。(日付と名前とか)
>・同じフィールドで複数条件を検索することもある。(田中と山田という名前、とか)
>・上記2つを同時に行うこともある。(東京都に住んでいる田中と山田など)

>それとできたら、ということで言われたのですが、ANDとORを切替えることができ>るボタンのようなものが欲しい、とのことなのです。
>こういうことってできるのでしょうか?

できますけど・・・VBA経験を積んでからのご使用をお勧めします。
それと大変失礼ですが、VBAの本を1冊買われて完読してみては?
↓私が完読した本です。かなり勉強になりました。
例題物
・Access2000VBA基本例題(技術評論社)2680円
関数物
・Access2000関数&SQL&エラー処理(エーアイ出版)2600円
その他
・Access2000VBAプログラミング BlackBook 3980円

この中には例題CD付きの物も有り、検索例題でKODAMARさんがしたい事が
そっくりそのまま載ってましたよ!

また判らない事があれば追記してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!