質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

6716閲覧

AcccessVBA。フィルターを複数条件かけたい

dokidoki_hamuo

総合スコア38

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2021/09/02 06:06

編集2021/09/03 00:07

フィルターを複数条件かけたい。

フィルターを複数条件でかけたのち、そのフィルターを反映させたレポートを
PDFにして保存する。というものを作っています。

フィルターをかけるところのコードでつまづいています。

ダブルクォーテーションのに囲まれた文字は文字列として認識される
ということはわかっているのですが、シングルクォーテーションが
出てくるのかがちょっと納得できません。

他にも至らぬ点があるかと思いますが、解説頂けると嬉しいです。

ネットで
ACCESS VBA フィルター 複数
ACCESS VBA フィルター  フィールド 複数
など調べてみたのですが、理解には至りませんでした。

解説と正しい構文を教えた頂きたいです。

下記のようなものを作成しています。

作成中のAccess

以下大まかなフォーム------------

店舗 □□□ 名前□□□

↑テキスト17 ↑テキスト26

以下レポートに使っているテーブル----------------

店舗名(フィールド1) 名前(フィールド2)
ドトール       コーヒー
ドトール       カフェラテ
スタバ        カフェラテ 
スタバ        コーヒー
ドトール       カフェモカ
ドトール       キャラメルラテ
スタバ        カフェモカ
スタバ        キャラメルラテ

以下キーとして用意したテーブル------------------

店舗名(フィールド1) 名前(フィールド2)
ドトール       コーヒー
ドトール       カフェラテ

コードの流れ

キーになるテーブルからキーワードを得て
店舗名がドトールで名前がコーヒーのものをフィルターで抽出
レポートにフィルターを反映、PDF化という流れです。

初心者の質問にも答えられる方どうぞよろしくお願いいたします。

VBA

1Private Sub コマンド19_Click() 2 3 4Dim spath As String '------保存先のパス 5Dim myname As String '------フィルターで絞るキー1 6Dim myname2 As String '------フィルターで絞るキー2 7Dim i As Long 8Dim Rs As DAO.Recordset '----キーとなるテーブル 9 10 11Set Rs = CurrentDb.OpenRecordset("キーテーブル") 12 13 14 Do Until Rs.EOF 15 16 myname = Rs!店舗名 17 myname2 = Rs!名前 18 19 テキスト17 = Rs.Fields("店舗名") 20 テキスト26 = Rs.Fields("名前") 21 22 Me.Filter = "店舗名='" & myname & "'" & "'And" & "名前='" & myname2 & "'"   '------←ここが違います。 23 Me.FilterOn = True 24 25 spath = テキスト20 & "\" 26 27 28 DoCmd.OpenReport "レポート", acViewReport, , Me.Filter 29 30 DoCmd.OutputTo acOutputReport, "レポート", acFormatPDF, spath & myname & ".pdf" 31 32 Rs.MoveNext 33 34Loop 35 36 37 38End Sub

お礼

長い質問に答えて頂き本当に助かりました!
もし何かありましたら、ご教授いただければ幸いです。
ありがとうございます!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

シングルクォーテーションについてです。

VBAでは、コードに文字列を指定する場合、ダブルクォーテーションで囲みますが、Filterの条件に指定する文字列は、シングルクォーテーションで囲みます。

以下、ご参考まで。
http://www7b.biglobe.ne.jp/~cbcnet/kisuhen/filter.html#hyoukihou

投稿2021/09/02 06:32

hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dokidoki_hamuo

2021/09/02 07:05

And のシングルクォーテーションはずしたらできました。 ありがとうございました。 ちょっとわからない部分があるので 質問させて頂きたいのですが 例えば Me.Filter = "氏名 <> '" & Txt氏名 & "'" このシングルクォーテーションはどこの部分を囲っているのですか? '" & Txt氏名 & "'" の部分なのですか??
hex309

2021/09/02 07:15

このように考えられてはいかがでしょうか? 例えば、「氏名」が「田中」の以外の人をFilterで抽出するとします。 そうすると、コードは以下のようになります。 Me.Filter = "氏名 <> '田中'" このときシングルクォーテーションは、フィルタの条件を表す「田中」を囲んでいます(ダブルクォーテーションはFilterに指定する条件全体を囲んでいます-条件は文字列として指定する必要があるため)。 この「田中」の部分が、「Txt氏名」(多分テキストボックスの値)になるので、シングルクォートの中身(田中)の部分を「Txt氏名」に置き換えます。 ただし、次のようにしてしまうと、「Txt氏名」という名前以外の人、という条件になってしまいます(テキストボックスの値を指定したことにならない)。 Me.Filter = "氏名 <> 'Txt氏名'" そこで、「Txt氏名」の部分を分け、更に全体をつなげたいので、&を使って連結して処理している、ということになります。 Me.Filter = "氏名 <> '" & Txt氏名 & "'" あまり上手な説明でなく申し訳ありません。
dokidoki_hamuo

2021/09/02 07:26

テキストボックスになるからシングルクォーテーションで囲わないわけですね!! よくわかりました。ありがとうございます^^ そこまではよくわかったのですが Me.Filter = "氏名 <> '" & Txt氏名 & "'" Me.Filter = "氏名 <> 【'】" & Txt氏名 & "【'】" このシングルクォーテーションはどうして必要なのですか?? 自分のイメージだと Me.Filter = "氏名 <> " & Txt氏名 これでいいのではないか、と思ってしまいます。 何度も申し訳ございませんが、ご回答頂けると嬉しいです。 よろしくお願い致します。
hex309

2021/09/02 07:40

Me.Filter = "氏名 <> " & Txt氏名 でよい、と感じてしまうのは、 「Txt氏名」には文字が入っているのだから、わざわざシングルクォーテーションで囲まなくても、VBAの方で処理できると感じるから、でしょうか? 確かに、お気持ちは分かります。 ただ、「Txt氏名」が「氏名」の入力されているテキストボックスである、ということは人間であれば、想像が付きます(事実、私も想像が付きました)。 しかし、コンピュータ(Access)には、「Txt氏名」に入っているのが「氏名」だから「文字」だと言うことまではわかりません。 なので、この値は「文字だ」ということを明確にして上げる必要があるのです。
dokidoki_hamuo

2021/09/02 07:52

わかりにくくてすみません。 >>そこで、「Txt氏名」の部分を分け、更に全体をつなげたいので、&を使って連結して処理している、ということになります。 Me.Filter = "氏名 <> '" & Txt氏名 & "'" Txt氏名 にシングルクォーテーションがつかないのは、テキストボックスの値を使えなくなるから シングルクォーテーションがついていないということだと解釈しました。 であるならば、Me.Filter = "氏名 <> 【'】" & Txt氏名 & "【'】" この部分のシングルクォーテーションは何に対して文字列扱いしているのですか?? テキストボックスだからシングルクォーテーションはつけられないけど テキストボックス中身が文字列だから、&で離して囲ったよ! ということですか?? この部分のシングルクォーテーションの役割がわかりませんでした( ;∀;) わかりにくくてごめんなさい。
hex309

2021/09/02 07:58

「テキストボックスだからシングルクォーテーションはつけられないけど テキストボックス中身が文字列だから、&で離して囲ったよ!」 はい。その理解で良いかと思います。 Me.Filter = "氏名 <> 【'】" & Txt氏名 & "【'】" で、「Txt氏名」が「田中」だとします。 そのまま当てはめてみると、次のようになりますよね(「田中」は文字列なのでダブルクォーテーションで囲みます)。 Me.Filter = "氏名 <> 【'】" & "田中" & "【'】" で、「田中」も文字列なので、&で繋ぐ必要がないので、次のように記述できます。 Me.Filter = "氏名 <> 【'】田中【'】" 結果、抽出する値である「田中」がシングルぅぉーテーションで囲まれていることになります。
dokidoki_hamuo

2021/09/02 08:03

なるほど!丁寧な記述助かります( ;∀;) ということは変数の時も中身が文字列だったら、きちんとシングルクォーテーションで囲わなくてはならないということで合っていますか?? 書き方としては Me.Filter = "氏名 <>" & " '" & Txt氏名 & "'" このほうが自分的にしっくりくるのですが これでもよいということですよね??
hex309

2021/09/02 13:16

はい。それでよろしいかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問