Access VBA質問箱 IV

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

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


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

【10741】複数条件からのデータ抽出について 08/11/19(水) 10:33 質問[未読]
【10742】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 11:31 回答[未読]
【10745】Re:複数条件からのデータ抽出について 08/11/19(水) 14:47 質問[未読]
【10746】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 15:11 回答[未読]
【10747】Re:複数条件からのデータ抽出について 08/11/19(水) 15:23 質問[未読]
【10748】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 15:27 回答[未読]
【10749】Re:複数条件からのデータ抽出について 08/11/19(水) 15:42 質問[未読]
【10750】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 15:57 回答[未読]
【10751】Re:複数条件からのデータ抽出について 08/11/19(水) 16:21 質問[未読]
【10752】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 16:30 発言[未読]
【10753】Re:複数条件からのデータ抽出について 08/11/19(水) 16:35 質問[未読]
【10754】Re:複数条件からのデータ抽出について 08/11/19(水) 16:40 質問[未読]
【10755】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 16:42 発言[未読]
【10756】Re:複数条件からのデータ抽出について 08/11/19(水) 16:49 回答[未読]
【10757】Re:複数条件からのデータ抽出について Gin_II 08/11/19(水) 17:07 発言[未読]
【10758】Re:複数条件からのデータ抽出について 08/11/19(水) 17:52 回答[未読]
【10763】質問事項他について 08/11/20(木) 9:21 発言[未読]
【10765】Re:質問事項他について Gin_II 08/11/20(木) 10:42 回答[未読]
【10766】Re:質問事項他について 08/11/20(木) 10:51 質問[未読]
【10769】Re:質問事項他について Gin_II 08/11/20(木) 11:44 発言[未読]
【10770】Re:質問事項他について 08/11/20(木) 12:11 質問[未読]
【10771】Re:質問事項他について Gin_II 08/11/20(木) 13:28 発言[未読]
【10773】Re:質問事項他について 08/11/20(木) 16:11 質問[未読]
【10775】Re:質問事項他について Gin_II 08/11/20(木) 16:29 回答[未読]
【10777】Re:質問事項他について 08/11/20(木) 17:07 質問[未読]
【10778】Re:質問事項他について Gin_II 08/11/20(木) 17:22 回答[未読]

【10741】複数条件からのデータ抽出について
質問    - 08/11/19(水) 10:33 -

引用なし
パスワード
   ACCESSのVBAについて質問です。
クエリ(VBAでは”Sheet1_2クエリ”)から、コンボボックス(”combo”)でABCを入力し、さらに数値1(”kazu3”)から数値2(”kazu4”)までのデータを抽出するには?(下記参照)

Private Sub cmd1_Click()
On Error GoTo e
Dim stSQL As String
Dim stList As String

stSQL = "SELECT * from Sheet1_2クエリ WHERE"
'アルファベットの条件
If Combo <> "" Then
stList = "[アルファベット]='" & Combo & "'"
End If
'数値の条件
If kazu3 <> "" Then
If kazu4 <> "" Then
stList = "[数値]>=" & kazu3 & "And[数値]<=" & kazu4
Else
stList = "[数値]=" & kazu3
End If
End If

stSQL = stSQL & stList
Me.RecordSource = stSQL
e:
Exit Sub
End Sub

数値だけは抽出できるのですが、ABC別に抽出することが出来ません。
どなたかご指摘お願いいたします!

【10742】Re:複数条件からのデータ抽出について
回答  Gin_II  - 08/11/19(水) 11:31 -

引用なし
パスワード
   >     stList = "[アルファベット]='" & Combo & "'"

ここで設定した内容を、

>       stList = "[数値]>=" & kazu3 & "And[数値]<=" & kazu4

上書きしているので、

> 数値だけは抽出できるのですが、ABC別に抽出することが出来ません。

当然そうなりますね。
ちなみに、書かれているものは、スペースがなかったりするのでエラーに
なると思いますが、実際に使っているものは、きちんと書いているという
ことですよね?


Dim strSql As String
Dim strWhere As String

strSQL = "SELECT * from Sheet1_2クエリ "

If Not IsNull(Me!combo) Then
  strWhere = strWhere & " AND アルファベット = '" & Me!combo & "'"
End If

If Not IsNull(Me!kazu3) Then
  If Not IsNull(Me!kazu4) Then
    strWhere = strWhere & " AND 数値 BETWEEN " & Me!kazu3 & " AND " & Me!kazu4
  Else
    strWhere = strWhere & " AND 数値 =" & Me!kazu3
  End If
End If

If Len(strWhere) > 0 Then
  Me.RecordSource = stSql & "WHERE " & Mid(strWhere, 5)
Else
  Me.RecordSource = stSql
End If

【10745】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 14:47 -

引用なし
パスワード
   いただいた回答に沿ってVBAを書き直してみましたが、数値は識別してくれるもののやはりアルファベットは識別せず、全部抽出してしまうようです…???
▼Gin_II さん:

【10746】Re:複数条件からのデータ抽出について
回答  Gin_II  - 08/11/19(水) 15:11 -

引用なし
パスワード
   > On Error GoTo e

コメントアウトして、きちんと実行できるかどうかを確認してください。
また、実行時エラー等が発生しないのであれば、

> If Len(strWhere) > 0 Then
>   Me.RecordSource = stSql & "WHERE " & Mid(strWhere, 5)
> Else
>   Me.RecordSource = stSql
> End If

この後に、

Debug.Print Me.RecordSource

と入れて、イミディエイトウィンドウニ表示された内容をこちらにアップしてください。

【10747】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 15:23 -

引用なし
パスワード
   書き直し以前は数値だけ抽出されていたのですが、書き直し以降、まったく動かなくなってしまいました。
Debug.Print Me.RecordSource
を追加記述してもそのもの自体がエラーに引っかかるらしく、「コンパイルエラー:End sub,End Function,End Property以降に書き込めるのはコメントのみです」といったエラーが出ます。

【10748】Re:複数条件からのデータ抽出について
回答  Gin_II  - 08/11/19(水) 15:27 -

引用なし
パスワード
   > 「コンパイルエラー:End sub,End Function,End Property以降に
> 書き込めるのはコメントのみです」といったエラーが出ます。

私が回答したものは、

> Private Sub cmd1_Click()
> End Sub

を省略していますが、消していいものではないですよ。

【10749】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 15:42 -

引用なし
パスワード
   それは無論消していません。

【10750】Re:複数条件からのデータ抽出について
回答  Gin_II  - 08/11/19(水) 15:57 -

引用なし
パスワード
   > それは無論消していません。

では、

> Private Sub cmd1_Click()

> End Sub

この間に、すべてコードが入っているということでいいですか?
となると、

> 「コンパイルエラー:End sub,End Function,End Property以降に
> 書き込めるのはコメントのみです」といったエラーが出ます。

このエラーがよく分からないですね。
とりあえず、Visual Basic Editor の画面で、

Ctrl+A 'すべて選択
Ctrl+C 'コピー

で、こちらにコードのすべてをアップできますか?

あと、
> If Len(strWhere) > 0 Then
>   Me.RecordSource = stSql & "WHERE " & Mid(strWhere, 5)
Debug.Print stSql & "WHERE " & Mid(strWhere, 5)
> Else
>   Me.RecordSource = stSql
> End If

のようにしても、同様にエラーになりますか?

【10751】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 16:21 -

引用なし
パスワード
   Private Sub cmd1_Click()
On Error GoTo e
 Dim strSql As String
 Dim strWhere As String

 strSql = "SELECT * from Sheet1_2クエリ "

 If Not IsNull(Me!Combo) Then
  strWhere = strWhere & " AND アルファベット = '" & Me!Combo & "'"
 End If

 If Not IsNull(Me!kazu3) Then
  If Not IsNull(Me!kazu4) Then
    strWhere = strWhere & " AND 数値 BETWEEN " & Me!kazu3 & " AND " & Me!kazu4
  Else
    strWhere = strWhere & " AND 数値 =" & Me!kazu3
  End If
 End If

 If Len(strWhere) > 0 Then
  Me.RecordSource = stSQL & "WHERE " & Mid(strWhere, 5)
 Else
  Me.RecordSource = stSQL
 End If

If Len(strWhere) > 0 Then
 Me.RecordSource = stSQL & "WHERE " & Mid(strWhere, 5)
Debug.Print stSQL & "WHERE " & Mid(strWhere, 5)
Else
  Me.RecordSource = stSQL
End If


stSQL = stSQL & stList
Me.RecordSource = stSQL
e:
Exit Sub
End Sub

-----------------------------------------------------
今はこのような状態です。
Visual Basic Editor についてよくわからないのでそのままコピペしてあげてしまいましたが、お分かりになりますでしょうか...。

【10752】Re:複数条件からのデータ抽出について
発言  Gin_II  - 08/11/19(水) 16:30 -

引用なし
パスワード
   > Visual Basic Editor についてよくわからないのでそのままコピペしてあげてしまいましたが、お分かりになりますでしょうか...。

現状のコードでも、

> 「コンパイルエラー:End sub,End Function,End Property以降に
> 書き込めるのはコメントのみです」といったエラーが出ます。

になりますか?
とりあえず、以下の状態にばっさりと変更して、

'-----------------------------------------------------
Private Sub cmd1_Click()
'On Error GoTo e
 Dim strSql As String
 Dim strWhere As String

 strSql = "SELECT * from Sheet1_2クエリ "

 If Not IsNull(Me!Combo) Then
  strWhere = strWhere & " AND アルファベット = '" & Me!Combo & "'"
 End If

 If Not IsNull(Me!kazu3) Then
  If Not IsNull(Me!kazu4) Then
    strWhere = strWhere & " AND 数値 BETWEEN " & Me!kazu3 & " AND " & Me!kazu4
  Else
    strWhere = strWhere & " AND 数値 =" & Me!kazu3
  End If
 End If

If Len(strWhere) > 0 Then
 Me.RecordSource = strSql & "WHERE " & Mid(strWhere, 5)
 Debug.Print strSql & "WHERE " & Mid(strWhere, 5)
Else
  Me.RecordSource = strSql
End If

e:
 Exit Sub

End Sub
'-----------------------------------------------------

(1) コンパイルをし、コンパイルエラーが発生しないか?
(2) 実行して、実行時エラーがでないか?

を確認してください。

(1) でエラーが発生するのなら、どの部分で発生したかを。
(2) でエラーが発生したのなら、
 ・どの部分で発生したか
 ・エラーメッセージは何か
 ・「表示」→「イミディエイトウィンドウ」で、出力されている内容

を教えてください。

【10753】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 16:35 -

引用なし
パスワード
   エラーはまったくでない代わりに、データが一個も抽出されなくなりました。

【10754】Re:複数条件からのデータ抽出について
質問    - 08/11/19(水) 16:40 -

引用なし
パスワード
   ちなみにコンボボックスに何も入っていないじょうたいで「数値」のみにゅうりょくすると該当の(つまりABCすべての)数値が帰ってきました。

【10755】Re:複数条件からのデータ抽出について
発言  Gin_II  - 08/11/19(水) 16:42 -

引用なし
パスワード
   >ちなみにコンボボックスに何も入っていないじょうたいで「数値」のみ
>にゅうりょくすると該当の(つまりABCすべての)数値が帰ってきました。

数値・コンボボックスを入力した状態で実行し、

> ・「表示」→「イミディエイトウィンドウ」で、出力されている内容

こちらの内容をアップしてもらってもいいですか?

【10756】Re:複数条件からのデータ抽出について
回答    - 08/11/19(水) 16:49 -

引用なし
パスワード
   SELECT * from Sheet1_2クエリ WHERE アルファベット = '3' AND 数値 BETWEEN 0006 AND 0100
SELECT * from Sheet1_2クエリ WHERE アルファベット = '3' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE アルファベット = '2' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE アルファベット = '2' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE アルファベット = '2' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE アルファベット = '2' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE アルファベット = '1' AND 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE 数値 BETWEEN 0001 AND 0200
SELECT * from Sheet1_2クエリ WHERE 数値 BETWEEN 0001 AND 0080
SELECT * from Sheet1_2クエリ WHERE 数値 BETWEEN 0001 AND 0080

--------------------------------------------------------
↑以上です。

【10757】Re:複数条件からのデータ抽出について
発言  Gin_II  - 08/11/19(水) 17:07 -

引用なし
パスワード
   > SELECT * from Sheet1_2クエリ WHERE アルファベット = '3' AND 数値 BETWEEN 0006 AND 0100
> SELECT * from Sheet1_2クエリ WHERE 数値 BETWEEN 0001 AND 0200

・アルファベットの前が、全角スペースになっている。
・コンボボックス:Combo は、複数の列を使っている?
・数値フィールドは、テキスト型?


【10752】Re:複数条件からのデータ抽出について 
で、回答した内容では、半角スペースを使っていますので、何か変更しませんでしたか?

>  Me.RecordSource = strSql & "WHERE " & Mid(strWhere, 5)

ここらへんとか。

あと、次の情報を確認し、教えてください。

(1) 元となっているテーブルの、アルファベット・数値 のフィールド型
(2) コンボボックスの値集合ソース・列数・連結列プロパティの内容

現状のコードでは、

アルファベットフィールド:テキスト型
数値:数値型

として書かれていますが、

Combo 数値?
kazu3 テキスト?
kazu4 テキスト?

で記入されている内容は、逆になっているような気がします。

【10758】Re:複数条件からのデータ抽出について
回答    - 08/11/19(水) 17:52 -

引用なし
パスワード
   すみません、明日までに整理してご返答いたします。
よろしくお願いいたします。

【10763】質問事項他について
発言    - 08/11/20(木) 9:21 -

引用なし
パスワード
   昨日いただいたコードはそのままコピペしたので、変更はされてないです。
(1)テーブルのフィールド型について→アルファベット:テキスト型、数値:数値型
(2)コンボボックスの集合値ソース↓
「SELECT alfabetコード.ID, alfabetコード.アルファベット FROM alfabetコード;」
列数:1、連結列1
です。あと、Combo/kazu3/kazu4については特に数値やテキストなどの設定は行っておりません。

【10765】Re:質問事項他について
回答  Gin_II  - 08/11/20(木) 10:42 -

引用なし
パスワード
   > アルファベット:テキスト型、数値:数値型

・アルファベットフィールド

> (2)コンボボックスの集合値ソース↓
> 「SELECT alfabetコード.ID, alfabetコード.アルファベット FROM alfabetコード;」
> 列数:1、連結列1

コンボボックスの設定が間違っていますね。
現在は、IDフィールドの内容がコンボボックスの値として認識されます。

コンボボックスの値集合ソースを

SELECT alfabetコード.アルファベット FROM alfabetコード
ORDER BY alfabetコード.ID

のように修正すれば、アルファベットでの抽出もできるようになると思います。
ただし、現在は、コンボボックスで数字(1〜3)が表示されていると思いますが、
そこが、アルファベットフィールドの内容が表示されるようになります。


・数値フィールド
 数値型の場合、

> WHERE アルファベット = '3' AND 数値 BETWEEN 0006 AND 0100
 0006 とかは扱えません。
 実際は、Accessが型変換を自動的に行ってくれているのだと思いますが、
 基本的には、抽出対象のフィールドにきちんと型をあわせてやる方が
 いいです。
 
 入力の際に、6 とかを入れるか、VBAでSQL文を生成する際に、変換するか
 ですね。
 
>   If Not IsNull(Me!kazu4) Then
>     strWhere = strWhere & " AND 数値 BETWEEN " & Me!kazu3 & " AND " & Me!kazu4
>   Else
>     strWhere = strWhere & " AND 数値 =" & Me!kazu3
>   End If

この部分を、

  If Not IsNull(Me!kazu4) Then
    strWhere = strWhere & " AND 数値 BETWEEN " & Val(Me!kazu3) & " AND " & Val(Me!kazu4)
  Else
    strWhere = strWhere & " AND 数値 =" & Val(Me!kazu3)
  End If

のように変更してください。

【10766】Re:質問事項他について
質問    - 08/11/20(木) 10:51 -

引用なし
パスワード
   有難うございます、抽出されるようになって来ました。
現状では、コンボボックスにアルファベットを表示させることは出来ないですか?

【10769】Re:質問事項他について
発言  Gin_II  - 08/11/20(木) 11:44 -

引用なし
パスワード
   > コンボボックスにアルファベットを表示させることは出来ないですか?

変更後は、アルファベットが表示されませんか?
変更前は、数値が表示されていたと思いますけど。


> (2)コンボボックスの集合値ソース↓
> 「SELECT alfabetコード.ID, alfabetコード.アルファベット FROM alfabetコード;」
> 列数:1、連結列1

テーブル名:alfabetコード
 フィールド名:ID
        アルファベット

ID アルファベット
1  A
2  B
3  C

のようなテーブルがあって、それをコンボボックスの値集合ソースに
使っているんですよね?

で、変更前の設定では、IDフィールドを使っている(表示・値)ので、
VBAで参照した場合に、1〜3 が使われ、

> WHERE アルファベット = '3' AND 数値 BETWEEN 0006 AND 0100

このような状態になっていたんです。
で、当然ながら、その条件に一致するレコードがないため、

> エラーはまったくでない代わりに、データが一個も抽出されなくなりました。

こうなります。

【10770】Re:質問事項他について
質問    - 08/11/20(木) 12:11 -

引用なし
パスワード
   実はコンボボックスをクリックすると出てくる値が見えていないんです。選択は出来ているらしいんですが。
alfabetテーブルがおかしいのでしょうか?
IDの前に何かプラスのようなものがついていて、開くと他のテ-ブルのデータが出てくるのですが、あまり気にしていませんでした。

【10771】Re:質問事項他について
発言  Gin_II  - 08/11/20(木) 13:28 -

引用なし
パスワード
   > 実はコンボボックスをクリックすると出てくる値が見えていないんです。

どこに出てくる値がですか?
なんとなく想像はできますが、なるべくきちんと説明をしてください。


> IDの前に何かプラスのようなものがついていて、開くと他のテ-ブルの
> データが出てくるのですが、あまり気にしていませんでした。

これもどこに?
たぶん、サブデータシートのことだとは思いますが。

だとすると、

見積テーブル:見積ID, 見積日, ・・・
見積明細テーブル:見積ID, 明細ID, 商品ID, ・・・

のようなテーブルがあった場合に、見積テーブルをデータシートビューで
開くと、

 見積ID 見積日
+  1  2008/11/20
+  2  2008/11/20
−  3  2008/11/20
 明細ID 商品ID
   1  A0001
   2  A0002

のように表示される機能ですね。


とりあえず、コンボボックスの設定を変更すれば、できるようには
なると思います。

> (2)コンボボックスの集合値ソース↓
> 「SELECT alfabetコード.ID, alfabetコード.アルファベット FROM alfabetコード;」
> 列数:1、連結列1

値集合ソース:SELECT alfabetコード.ID
          , alfabetコード.アルファベット
       FROM alfabetコード;
列 数:2
連結列:2
列 幅:1cm;1cm

のように変更してください。
※列幅は、適当に値を変更してもいいです。

続いて、VBAの変更箇所。

>  If Not IsNull(Me!Combo) Then
>   strWhere = strWhere & " AND アルファベット = '" & Me!Combo & "'"
>  End If

 If Not IsNull(Me!Combo) Then
  strWhere = strWhere & " AND アルファベット = '" & Me!Combo.Column(1) & "'"
 End If

とすれば、大丈夫だと思います。

【10773】Re:質問事項他について
質問    - 08/11/20(木) 16:11 -

引用なし
パスワード
   抽出のほうは、一応二列でIDとアルファベットが表示されるようになりました、有難うございます。
別窓で教えていただいているレポート出力についてですが、
------------------------
Private Sub cmd3_Click()
 DoCmd.OpenReport "REPORT_1", acViewPreview
 Reports!REPORT_1.Filter = Me.Filter
 Reports!REPORT_1.FilterOn = True

End Sub
------------------------
のように書いているのですが、全部のデータが出力されてしまう状態です。
うまくフィルターにかかっていないのでしょうか?

【10775】Re:質問事項他について
回答  Gin_II  - 08/11/20(木) 16:29 -

引用なし
パスワード
   私が回答した内容
> DoCmd.OpenReport ReportName:="REPORT1" _
>         , View:=acViewPreview _
>         , WhereCondition:=Me.Filter

波 さんが書いた内容
>  DoCmd.OpenReport "REPORT_1", acViewPreview
>  Reports!REPORT_1.Filter = Me.Filter
>  Reports!REPORT_1.FilterOn = True

レポートのフィルタプロパティを直接操作するのなら、レポートの
開く時イベントなどでしてやる必要があったと思います。

【10777】Re:質問事項他について
質問    - 08/11/20(木) 17:07 -

引用なし
パスワード
   回答いただいたコードに書き直して見ましたが、やはり全データがプレビューされてきます。

【10778】Re:質問事項他について
回答  Gin_II  - 08/11/20(木) 17:22 -

引用なし
パスワード
   > 回答いただいたコードに書き直して見ましたが、

> フォーム側の
>
> Me.RecordSource = なんちゃら
>
> になっている部分を、
>
> Me.Filter = なんちゃら
> Me.FilterOn = True

この部分も変更していますか?

変更しても、レポートで、抽出がされていないのであれば、

> DoCmd.OpenReport ReportName:="REPORT1" _
>         , View:=acViewPreview _
>         , WhereCondition:=Me.Filter

この下の行に、

Debug.Print Me.Filter
を追加して、イミディエイトウィンドウに表示される内容をアップしてください。

ただ、このスレッドも長くなってきたし、当初の質問とは内容が変わっていますので
新規スレッドにしてもらったほうがいいですね。

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