Access2007初心者がVBAの記述で困っています、お力添えをお願いします

このQ&Aのポイント
  • Access2007の初心者がVBAの記述で困っています。チェックボックスにチェックが入っている場合に、誕生日が空白のデータを抽出する部分のVBAの記述で躓いています。
  • T_会員情報というテーブルで、検索ボタンを押下したら条件にあった情報がフォーム上に抽出できるようにしたいです。フォームには性別の非連結コンボボックスと、誕生日が空白という非連結チェックボックスがあります。
  • VBAの部分では、指定した条件に基づいて検索クエリを作成し、フォームのレコードソースを書き換えて再クエリを実行しています。誕生日が空白の検索の部分の記述が問題だと思っています。初心者でよくわかっておりません。解決方法をご存知の方がいらっしゃいましたら、教えてください。
回答を見る
  • ベストアンサー

Access2007の初心者です。VBAの記述で困っています、お力添え

Access2007の初心者です。VBAの記述で困っています、お力添えお願いします。 チェックボックスにチェックが入っている場合に、誕生日が空白のものを抽出する部分のVBAの 記述のところで躓いているのだと思っています。 ■テーブルの情報 ・テーブル名:T_会員情報 ・T_会員情報のフィールド:会員名(テキスト形式)・性別(数値型)・誕生日(日付/時刻型) ■実現したいこと ・T_会員情報で、「検索」ボタンを押下したら、条件にあった情報がフォーム上に抽出できるもの。 ■用意したフォーム T_会員情報の連結フォーム ・フォーム上には以下を用意  ◆「性別」の非連結コンボボックス:txtSeibetsu  ◆「誕生日が空白」という非連結チェックボックス:chkBirthday  ◆「AND OR」のいずれかが選択できるオプションボタン  ◆「検索ボタン」  ◆「会員名」「性別」「誕生日」のT_会員情報の帳票フォーム ■VBA Option Compare Database Option Explicit Const cAnd = 1 Const cOr = 2 Const cBaseQuery = "SELECT * FROM T_会員情報" Private Sub 検索ボタン_Click() Dim strWhere As String Dim strAndOr As String strWhere = vbNullString If Me.optAndOr.Value = cAnd Then strAndOr = " AND " Else strAndOr = " OR " End If '性別検索 If ISNull(Me.txtSeibetsu.value)=False Then strWhere = strWhere & strAndOr & " 性別 = " & Me.txtSeibetsu.Value End If '誕生日空白検索 If Me.chkBirthday=False Then strWhere = strWhere & strAndOr & " 誕生日= " & Null End If 'WHERE句編集 strWhere = Replace(strWhere, strAndOr, "WHERE", , 1) 'レコードソース書き換えと再クエリ Me.RecordSource = cBaseQuery & " " & strWhere Me.Requery End Sub 誕生日が空白の検索のところの記述が問題だと思っています。 初心者でよくわかっておりません。 ご存知の方がいらっしゃいましたら、教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

私の伝え方悪かったようです。 strWhere = strWhere & strAndOr & " [誕生日] Is Null" です。このままコピーしてください。 IsNull ではなく、Is Null と離します。 これでエラーは出ないと思いますが。

finetomato
質問者

お礼

ご回答本当にありがとうございます。 誕生日空白のチェックボックスにチェックを入れて検索すると、 「パラメータの入力」を求められてきてしまいます。 何が原因でしょうか? もしご存知でしたら、お力添えください。 よろしくお願いします。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

エラーはプログラム上、コンボに表示 がないとエラーが起きます。したがって コンボの規定値を記入しておく必要が あります。 誕生日のパラメータが表示される、という ことはプログラムの中で記入ミスがあるか、 コンボボックスやテーブルに記入ミスが ある可能性があります。 ところで、このプログラムで実現したい ことについては考えていなかったのですが、 気になったのでこんなことがしたいのだろ うか、ということで以下のように書き出して みました。 1 全ての表示 SELECT T_会員情報.* FROM T_会員情報; 2 男の表示 SELECT T_会員情報.性別 FROM T_会員情報 WHERE (((T_会員情報.性別)=1)); 3 男で記入漏れの表示 SELECT T_会員情報.性別, * FROM T_会員情報 WHERE (((T_会員情報.性別)=1) AND ((T_会員情報.誕生日) Is Null)); 4 女の表示 SELECT * FROM T_会員情報 WHERE (((T_会員情報.性別)=2)); 5 女で記入漏れの表示 SELECT T_会員情報.性別, * FROM T_会員情報 WHERE (((T_会員情報.性別)=2) AND ((T_会員情報.誕生日) Is Null)); 6 男と女の記入漏れの表示 SELECT * FROM T_会員情報 WHERE (((T_会員情報.誕生日) Is Null)); どうでしょか。もしこうならば、少し プログラムを手直ししないとできない のではと思います。というのは、 鍵をにぎるのはstrWhereとstrAndOr ですが、この組み合わせとコードの 流れがうまくいってうないような 気がします。コードに手を加えて いないので、どんなものかなと 思案しているところです。オプション グループはチェックボックス に変えてもいのではという気も しますが。

finetomato
質問者

お礼

度々ご回答くださり、ありがとうございます。 教えてくださったことを元に考え直しプログラムに手を加えたところ、動くようになりました。 諦めかけていたので、本当に助かりました。 ありがとうございました。 私は、あるVBAの参考書をみながら、記述を見よう見まねで作成していたのですが、 私が作成したいものは、とくに「OR」を必要としないので、 「AND」「OR」を選択するチェックボックスを省き、 全て「AND」選択にして作成しなおしました。 ↓こうすることで動きました。 Option Compare Database Option Explicit Const cBaseQuery = "SELECT * FROM T_会員情報" Private Sub btnSearch_Click() Dim strWhere As String strWhere = vbNullString '性別検索 If Me.txtSeibetsu > 0 Then strWhere = strWhere & "AND" & " 性別 = " & Me.txtSeibetsu.Value End If '誕生日検索 If Me.chkBirthday.Value = True Then strWhere = strWhere & "AND" & "[誕生日]Is Null" End If 'WHERE句編集 strWhere = Replace(strWhere, "AND", "WHERE", , 1) 'レコードソース書き換えと再クエリ Me.RecordSource = cBaseQuery & " " & strWhere Me.Requery End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

コードを見る限り問題はないのですが、 エラーの内容からすると >誕生日が空白」という非連結チェックボックス:chkBirthday のチェックすボックスに規定値、 たとえば1を設定するとエラー 回避が出来るのでは、と思います。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

もし、パラメータの要求が [誕生日]にかかわるならば、 strWhere = strWhere & strAndOr & " IsNull([誕生日])" としてみてください。解釈は 同じですが。一応、パラメータ の要求を載せてみてください。

finetomato
質問者

お礼

引き続きご回答くださり、ありがとうございます。 教えてくださったとおりにしてみたのですが、以下のような動きをしてしまいます。 ■うまくいく場合 「性別」のみを選択して検索したとき ■うまくいかない場合: ・「誕生日が空白」のみにチェックを入れて検索した時 エラー内容:『実行時エラー '3131';FROM句の構文エラーです』 ・「性別」を指定して、「誕生日が空白」にチェックを入れた場合 パラメータの入力 誕生日 がでてしまいます。 空白を検索する場合は、別のVBAの記述を考えたほうがよいのでしょうか? もし何かご存知でしたら、教えてください。 よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

パラメータの内容は何でしょう。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

>strWhere = strWhere & strAndOr & " 誕生日= " & Null Null ではなく Is Null なのでは? コンパイルか実行でエラーが出るでしょうから エラー番号と内容を書くと手間が省けますが。

finetomato
質問者

お礼

お返事ありがとうございます。 すみません、細かいですが、if文が「False」⇒「True」としています。 私の記述が誤っておりました。 '誕生日空白検索 If Me.chkBirthday.Value=True Then strWhere = strWhere & strAndOr & " 誕生日= " & Null End If 教えてくださったとおり、「strWhere = strWhere & strAndOr & " 誕生日= " & IsNull」 としたところ 「コンパイルエラー 引数は省略できません」エラーがでます。 引数には何を入れたらよいのでしょうか? すみません、ご存知でしたらご教授ください。 よろしくお願いします。

関連するQ&A

  • Accessの初心者です。

    Accessの初心者です。 Accessの初心者です。 VBAでExcel出力をする記述について、おわかりになる方、教えてください。 フォームで検索条件に指定して表示した結果を、Excel出力したいのですが、 フォーム上に出力した項目全てではなく、一部の項目だけExcel出力したいです。 以下のような検索フォームを作成しています。 検索して表示するまでのVBAはできています。 検索条件:非連結 フォーム:連結フォーム(Q_会員情報 というクエリと連結) たとえば、検索条件に『男性』を指定して検索すると、 フォームに『会員番号』『会員名』『性別』『誕生日』の情報が出力されるとします。 これをマクロの機能で、Excel出力をすると、 [Q_会員情報]の項目が全てExcelに出力されますが、 これを、『会員名』『誕生日』だけをExcel出力したいです。 この場合、どのようにVBAを記述したらよいでしょうか? 使用しているのは、Excel2007です。 おわかりになる方いらっしゃいましたら、お力添えください。 よろしくお願いします。

  • access VBAで検索および抽出が出来ません・・・

    VBA初心者なのですが、あるサンプルデータを参考に顧客管理のフォームを作成しています。 検索条件が未入力なら全リストを、条件入力すれば検索・抽出したいのです。 未入力の場合は全リストが表示されていますが、条件入力すると真っ白になります・・・ リストボックスで表示するようにしています。 なぜ出来ないのか、どなたか詳しく教えてください。宜しくお願いします。 ______________________________________ Private Sub subSetFiler() Dim strWhere As String '変数の初期設定 strWhere = "" 'フリガナを部分一致で検索 If IsNull(Me![txtFurigana]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And" End If strWhere = strWhere & "tm01_Kokyaku.tm01_Furigana Like'*" & Me![txtFurigana] & "*'" End If '物件を部分一致で検索 If IsNull(Me![txtBukken]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And" End If strWhere = strWhere & "tm01_Kokyaku.tm01_Bukken Like '*" & Me![txtBukken] & "*'" End If 'Where文字列の加工 If strWhere <> "" Then strWhere = "Where" & strWhere End If 'リストボックスノ値集合ソース更新 Me![1stKokyakuCode] = Null Me![1stKokyakuCode].RowSource = "SELECT [tm01_Kokyaku].[tm01_Code] AS コード, [tm01_Kokyaku].[tm01_KokyakuName] AS 顧客名, [tm01_Kokyaku].[tm01_Bukken] AS 物件名, [tm01_Kokyaku].[tm01_Gouchi] AS 号地, [tm01_Kokyaku].[tm01_Address1] AS 住所, [tm01_Kokyaku].[tm01_Tel] AS 電話番号 " & _ "FROM tm01_Kokyaku" & _ strWhere & " " & _ "ORDER BY [tm01_Kokyaku].[tm01_Bukken], [tm01_Kokyaku].[tm01_Gouchi]" Me![1stKokyakuCode].Requery

  • ACCESS SQL 日付での検索ができない。

    ACCESSにて 登録したデータの検索機能を作っているのですが、 文字列での検索は引用したサンプルプログラムの通りにして 問題なく検索できるのですが、日付の検索をすると、1件も検索されません。 どのような文法的な誤りがあるかご指導ください。 検索での「日付の比較」部分のコード strWhere = strWhere & "R業務依頼日 = #" & "Me![txtYKSDay]" & "#"  strWhereでは、SELECT文のWHERE句の検索条件部分を文字列として作成しています。 後で、リストボックスの値集合ソースに突っ込む為。 私のレベルは、開発の経験はありません。 正規化とかクエリーが理解できるレベルです。 ACCESS:2000 OS:WindowsMe 800文字の制限を越えてしまったので、文字列の比較の部分と 日付の比較の部分のコードを付加します。 -------------------------------------------- '変数の初期設定 strWhere = ""   (略) '業務依頼日で検索 If IsNull(Me![txtYKSDay]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And " End If strWhere = strWhere & "R業務依頼日 = #" & "Me![txtYKSDay]" & "#"  <==ココ End If   (略) 'フリガナを部分一致で検索 If IsNull(Me![txtYKSFurigana]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And " End If strWhere = strWhere & "Kフリガナ Like '*" & Me![txtYKSFurigana] & "*'" End If

  • 帳票フォームの全件のレポート出力

    OS:XP Access Version:2007 抽出されたレコードが帳票フォームで表示されているのですが、 その複数抽出のレコードすべてをレポート出力したいのですが。。。どうすばいいわからなくて どなたかいい方法をおしえてください。 抽出条件コードはこれです。 Private Sub btnSearch_Click() Dim strWhere As String Dim strAndOr As String strWhere = vbNullString If Me.optAndOr.Value = cAnd Then strAndOr = " AND " Else strAndOr = " OR " End If If Me.txtYear.Value <> vbNullString Then strWhere = strWhere & strAndOr & " 年度 LIKE '*" & Me.txtYear.Value & "*'" End If If Me.txtName.Value <> vbNullString Then strWhere = strWhere & strAndOr & " 営業担当 LIKE '*" & Me.txtName.Value & "*'" End If 'WHERE句編集 strWhere = Replace(strWhere, strAndOr, "WHERE", , 1) 'レコードソース書き換えと再クエリ Me.RecordSource = cBaseQuery & " " & strWhere Me.Requery End Sub

  • アクセスVBAの検索で。

    アクセスでカレンダーというかスケジュールを管理できるようなものをつくろうとしています。 非連結フォーム1に ・入力年 ・入力月 ・[1]-[45]まで(それぞれ年月が変わると日付がかわる) という感じで入っています。 T_用件というテーブルには ・年(数値型 ・月(数値型 ・日(数値型 ・用件(テキスト型) とあり、これをもとに「F_用件」フォームを作成してあります。 フォーム1のボタンの1つを例にとるとこんな感じです。 If Me![7].Value <> "" Then Year = "(T_用件.年=" & (Me!入力年.Value) & ")" Month = "(T_用件.月=" & (Me!入力月.Value) & ")" Day = "(T_用件.年=" & (Me![7].Value) & ")" WhereCond = WhereCond & " AND (" & Year & " AND " & Month & " AND " & Day & ")" End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_用件", acNormal, , WhereCond こうするとF_用件フォームは開くのですが、きちんと検索されてきません。 どこが悪いのでしょうか? よろしくお願いします。

  • アクセス初心者です。

    一つのフォーム上に、一覧が参照できるlist_Userと非連結フォームがあります。list_Userフォームから、項目を選び、修正ボタンをクリックすると非連結フォームへ転記され、修正できるように作ったのですが、参照、更新、保守で〇、×を用いところ、非連結へ転記されるとき、〇×以外はきちんと転記されるのですが、〇の項目も×として入っていきます。どうすればそのままデータが入っていくのでしょうか? If (IsNull(Me.参照) Or Me.参照 = 0) And _ (IsNull(Me.更新) Or Me.更新 = 0) And _ (IsNull(Me.保守) Or Me.保守 = 0) Then MsgBox "参照・更新・保守が未設定です", vbCritical Me.参照.SetFocus Exit Sub End If 説明が分かりにくかったらすみません。宜しくお願い致します。

  • 【Access2000】VB記述でつまづいています。

     非連結のテキストボックスを2つ作成し、そのテキストボックスに、それぞれIDとパスワードを入力することにより「TOP」という名前のフォームを開くログイン用のフォームを作成しています。 ・このログイン用のフォーム名は「ログイン」。 ・フォームの中にあるID入力用のテキストボックス名は“txtNamePass” ・同じくパスワード入力用のテキストボックス名は“txtCountPass” ・IDとパスワードを入力した後に開くフォームは「TOP]。  この「ログイン」という名前のフォームにある“txtCountPass”の「更新後処理」の所に以下のコードを記述したところ、IDとパスワードを入力後、「TOP」のフォームは開くのですが、「ログイン」のフォームが閉じないままになってしまいます。  どのように書き直したらいいか御存知の方がいらっしゃったら御教示下さい。  Private Sub txtCountPass_AfterUpdate() Dim TextBoxA As TextBox Dim TextBoxB As TextBox Set TextBoxA = Me.txtNamePass ' --- A Set TextBoxB = Me.txtCountPass Const NamePass = "@@@@" ' --- B Const CountPass = "*****" If TextBoxA = NamePass Then ' --- C If TextBoxB = CountPass Then ' --- D DoCmd.OpenForm "TOP" ' --- E DoCmd.Close , "ログイン" Else MsgBox "パスワードが異なります。", vbOKOnly + vbCritical End If Else MsgBox "IDが異なります。", vbOKOnly + vbCritical End If End Sub

  • Access2010 「演算子がありません」エラー

    フォーム上に別フォームを開くボタンがあるのですが、クリックすると実行時エラーが表示されます。 実行時エラー 3075 クエリ式”コード IN(○○,××)の構文エラー 演算子がありません。 コードを数値型からテキスト型に変更したのが原因だと思います。 エラーが出ない方法を教えていただければ助かります。 よろしくお願いいたします。 Dim rst As Recordset Dim strWhere As String Set rst = Me.RecordsetClone With rst If .RecordCount = 0 Then Beep Exit Sub End If .MoveFirst strWhere = "" Do Until .EOF strWhere = strWhere & IIf(Len(strWhere) > 0, ",", "") & !コード .MoveNext Loop .Close strWhere = "コード IN (" & strWhere & ")" End With DoCmd.OpenForm "フォーム", , , strWhere

  • アクセスvba if文の記述方法

    検索フォームを作成しました。 入力項目は「氏名」「カナ」で入力チェックをおこなっております。 (未入力)メッセージを表示「未入力です」 (入力有)結果一覧のフォームを表示 未入力チェックは正常に処理されておりメッセージが表示されます。 項目に値を入力した場合フォームが起動しません。 if文から外した場合は正常に実行されます。 この条件の場合if文でどのように記述したらよいのでしょうか。 宜しくお願いします。 Private Sub 検索_Click() Dim mct As Control Dim flg As Boolean flg = False For Each mct In Me.Controls  If mct.ControlType = acTextBox Then   If mct.Tag = "Check" Then    If Not IsNull(mct) Then     flg = True     Exit Sub    End If   End If  End If Next mct If flg = True Then  Dim str As String  str = "[氏名] Like ""*" & Me!氏名 & "*"" And [カナ] Like ""*" & Me!カナ & "*"""  DoCmd.OpenForm "結果一覧", , , str Else  MsgBox ("未入力です") End If End Sub

  • AccessのVBAで教えて下さい

    フォームから「計算月」を入力した時、T_稼働日テーブルから年月で一致した稼動日数を所定就業日数に代入する処理を下記のように作りました。「計算月」に一致するデータがなかった時の処理を、If文以下のようにしたのですがうまくいきません。どのようにしたらよいでしょうか? どなたか教えて下さい。よろしくお願いします。 Private Sub 計算月_AfterUpdate()    所定就業日数 = DLookup("稼動日数", "T_稼動日数", "年月=" & 計算月)     If Me.所定就業日数 = Null Then       MsgBox "稼動日数を確認して下さい"     End If End Sub

専門家に質問してみよう