Access2010 VBAによる空白欄の判定

このQ&Aのポイント
  • VBA勉強中の初心者です。本を片手に自分でコードを記述してみましたが思った動作をしてくれません。
  • チェックボックスをクリックした際に、規則名欄が空白の場合はエラー処理を避けるために改めて空白を入力し、ID欄が空白の場合は自動で連続した番号を入力するようにしています。
  • 新規レコード作成の画面にてチェックボックスをクリックすると、第一の条件式での判定は問題ないのですが、第二の条件式で名前欄もID欄も空白だとしてもElseの処理となってしまいます。条件式が間違っているのでしょうか。
回答を見る
  • ベストアンサー

Access2010 VBAによる空白欄の判定

VBA勉強中の初心者です。 本を片手に自分でコードを記述してみましたが思った動作をしてくれません。 詳しい方がいらっしゃいましたら、手直ししていただけるとありがたいです。 どのように動かしたいかというと チェックボックス、ID、規則名からなるテーブルを参照するフォームにて、 1.チェックボックスをクリック(True)した際に、規則名欄が空白の場合はエラー処理を避ける為、改めて空白を入力し、ID欄が空白の場合は自動で連続した番号を入力するようにしています。 2.逆に、既存のレコードのチェックをした際には、既に入力されている規則名及びIDを便宜的に振り直すようにしたいです。 また、IDを主キーとして、かつ、IDと規則名が入力されていないと保存が出来ないようにしています。 なお、IDの連続した番号はオートナンバーにはせずDMaxを使用し連番を付しています。 これらのことを記述したものが以下になります。 Private Sub チェック0_Click()       If (Me.[チェック0] = True) Then 'チェックボックスが真ならば     If Me.制定規則台帳ID = "" Then 'かつ、ID欄が空白ならば       Me.制定規則台帳ID = [DMax("制定規則台帳ID", "copy制定規則台帳_tbl") + 1] '既存のIDの一番大きな数字+1で入力       Me![制定規則台帳ID].Requery     Else 'ID欄は空白ではない       Me.制定規則台帳ID = [制定規則台帳ID] '既存のIDをもう一度打ち込む       Me![制定規則台帳ID].Requery     End If   End If      If (Me.[チェック0] = True) Then 'チェックボックスが真ならば     If Me.規則等名.Value = "" Then 'かつ、規則名欄が空白ならば       Me.規則等名.Value = "" '空白を打ち込む       Me![規則等名].Requery     Else       Me.規則等名.Value = [規則等名] '既存の規則名をもう一度打ち込む       Me![規則等名].Requery     End If   Else     MsgBox "チェックボックスはFalse", vbOKOnly, "test"      End If End Sub このとき、新規レコード作成の画面にてチェックボックスをクリックすると、第一の条件式にて、チェックボックスの真偽の判定は問題ないのですが、第二の条件式で名前欄もID欄も空白(新規レコードなので)だとしてもElseの処理となってしまいます。 コントロール内が空白かどうかを判定する場合の条件式が間違っているのでしょうか。 詳しい方、ご教示ください。

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

  • ベストアンサー
回答No.2

> その内容は、 > 「実行時エラー'2465' >  指定した式で参照されている'1'フィールドが見つかりません。」 > となり、DMax関数の式が黄色で表示されます。 とりあえず下記の式を試してみてください。 Me.制定規則台帳ID = Nz(DMax("制定規則台帳ID", "copy制定規則台帳_tbl")) + 1 '既存のIDの一番大きな数字+1で入力 また、下記の一行は不要ですので、削除してください。 Me![制定規則台帳ID].Requery

ryoza0130
質問者

お礼

hatena1989 様 ご回答ありがとうございます。 全て上手く動作いたしました。 Nz関数。。。 まだまだ分からないことばかりです。 もっと勉強していかなくてはなりませんね。 本当に助かりました。 ありがとうございました。

その他の回答 (1)

回答No.1

テキスト型の場合、デフォルトの設定では、未入力の初期値は ""(空文字列)ではなく Null です。 NullはIsNull関数で判定します。下記のように変更すればいいでしょう。     If IsNull(Me.制定規則台帳ID) Then 'かつ、ID欄が空白ならば     If IsNull(Me.規則等名.Value) Then 'かつ、規則名欄が空白ならば       Me.規則等名.Value = Null 'Nullを打ち込む Null と "" は見た目では判別がつかないので、Nullだけ許容する、または、""だけ許容する、のどちらかの設定にしておいた方が混乱がないでしょう。 Nullだけ許容する設定は、フィールドプロパティで下記のように設定します。 値要求 いいえ 空文字列の許可 いいえ

ryoza0130
質問者

補足

hatena1989様 ありがとうございます。 無事に空白の判定が出来るようになりました! ですが、また別な問題が・・・ こちらも教えていただけたらありがたいです。 ご指摘いただいた部分を修正したところ、無事に空白の判定は出来たのですが、空白の場合にIDを自動入力する部分でエラーが出てしまいます。 その内容は、 「実行時エラー'2465'  指定した式で参照されている'1'フィールドが見つかりません。」 となり、DMax関数の式が黄色で表示されます。 関数で指定している、フィールド名とテーブル名は間違いないのですが、どこか引数が間違っているのでしょうか。 ご教示よろしくお願いいたします。

関連するQ&A

  • Access 97 VBAについて

    Access VBAについて教えてください。 初心者ですが、レポートに表示されるテキストボックスの”項目名”と”内容”プロパティーに重複データ非表示にしています。そして、非表示となった部分に”〃”を表示するため別のテキストボックス、”隠しオブジェクト1”及び”隠しオブジェクト2”を配置しています。???にどんな記述が必要かわかりません。”項目名”だけであれば問題なく表示されるのですが”内容”についても同様に処理したいのです。 どうぞ宜しくお願いいたします。 Option Compare Database Option Explicit '値を保持するために外側に変数を定義します。 Dim varA As Variant --------------------------------------------------- Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)   If Me.項目名 = varA Then    Me.隠しオブジェクト1.Visible = True Else Me.隠しオブジェクト1.Visible = False End If varA = Me.項目名 ???? If Me.内容 = varA Then Me.隠しオブジェクト2.Visible = True Else Me.隠しオブジェクト2.Visible = False End If varA = Me.内容 End Sub

  • 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 誕生日が空白の検索のところの記述が問題だと思っています。 初心者でよくわかっておりません。 ご存知の方がいらっしゃいましたら、教えてください。 よろしくお願いします。

  • VBA null判定

    Accessでテキストボックスの値をテーブルへ書き込むVBAを作成しているのですが、Null判定がうまくいきません。 ◎環境 OS:Windows7Pro Var:Access2010 DB:MySQL5.6 Private Sub cmdSubmit_Click() Dim Rst As DAO.Recordset Dim ErrT As String Set Rst = CurrentDb.OpenRecordset("m_plan", dbOpenDynaset) '各テキストボックス、Null判定 If IsNull(txtPid) Then MsgBox "プランID[" & txtPid & "]が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPName) Then MsgBox "プラン名が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPsdate) Then Me!txtPsdate = #01/01/2010# End If If IsNull(Me!txtPedate) Then Me!txtPedate = #01/01/2010# End If Debug.Print "プランID["; Me.txtPid & "]" Debug.Print "プラン名[" & Me!txtPName & "]" Debug.Print "開始日[" & Me!txtPsdate & "]" Debug.Print "終了日[" & Me!txtPedate & "]" ↑↑↑↑↑↑↑↑↑ ここで、Null判定を行ってますが、データがあるにも関わらず、処理が続行されたり、Null判定結果が起動するたびに変わります。 On Error GoTo err With Rst .MoveLast .AddNew .Fields("PlanID") = Me!txtPid .Fields("PlanName") = Me!txtPName .Fields("PlanSt") = CDate(Me!txtPsdate) .Fields("PlanEn") = CDate(Me!txtPedate) .Fields("P_Remaks") = Me!txtPbikou .Update End With Rst.Close Set Rst = Nothing err: MsgBox "DBエラー" Debug.Print Rst.Type Debug.Print err.Description Call txtCrer End Sub ただし、下記判定だけのボタンとプロシージャーでは、正常に判定されます。 判定だけの、プロシージャー 'Null判定テスト Private Sub cmdtest_Click() If IsNull(txtPid) Then Debug.Print "[" & txtPid & "]" & "Nullです。" Else Debug.Print "[" & txtPid & "]" & "Not Nullです。" End If If IsNull(txtPName) Then Debug.Print "[" & txtPName & "]" & "Nullです。" Else Debug.Print "[" & txtPName & "]" & "Not Nullです。" End If If IsNull(txtPsdate) Then Debug.Print "[" & txtPsdate & "]" & "Nullです。" Else Debug.Print "[" & txtPsdate & "]" & "Not Nullです。" End If Debug.Print "===============================" End Sub どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

  • アクセスでテキストボックスの値が空白だったら

    お世話になっております。 フォームのテキストボックスの値が0か空白だったら、レポート上に表示されるものを変えたいのですが、うまくいきません。 If [Forms]![フォーム1]![テキストボックス1].value = 0 Or [Forms]![フォーム1]![テキストボックス1].value = "" Then Me![レポート上のテキストボックス] = "無" Else [Forms]![フォーム1]![レポート上のテキストボックス1] = [Forms]![フォーム1]![テキストボックス1] & "ヶ月" End If これだと何も入っていないときに"ヶ月"と表示されてしまいます。どのように書けばよいのでしょうか? ご教授願えませんでしょうか?

  • 【Access】サブフォームの項目選択時、対応するコントロールの有効無効を制御する方法

    サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、 サブフォーム内のチェックボックスをクリックすると、 対応するコンボボックスの有効無効を制御したい (ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、 どのチェックボックスをクリックしても、 ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。 【テーブル名:tbl】 ID, checkbox, combobox 0, false, A 1, true, B 2, false, C 【サブフォーム名のチェックボックスのクリックイベント】 Private Sub checkbox_Click() If Me.checkbox = True Then Me.combobox.Enabled = True Else Me.combobox.Enabled = False End If End Sub 何かしら添え字を渡す事ができれば、対応できるのではと思いましたが、 どのように記述すればよいか分かりませんでした。 その為、上記のような場合、個別で制御する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • Access 2003 でフォームフィルターがかかりません。

    Access 2003 でフォームフィルターがかかりません。 どなたか助けてください。 アクセス初心者です。 フォームの詳細欄にチェックボックス(フィールド名:伝票チェック)を配置しております。 チェックの入っていないものを表示させたいです。 フォームヘッダーのオプショングループ(フレーム67)に オプションボタン0-オプション値0と オプションボタン2-オプション値2 の2個のオプションボタンを配置してあります。 クリック時のイベントプロシージャに以下のコードを書きました。 Private Sub フレーム67_Click() If Me!フレーム67 = 0 Then Me.Filter = 伝票チェック = 0 Me.FilterOn = True Else Me.Filter = "" Me.FilterOn = True End If End Sub 実行時エラーは出ませんが、データが何も表示されません。 どうすればいいのでしょう??? どなたかお願いします。

  • Accessでのvbaについての質問

    Accessでのvbaを使用したプログラムについてお聞きしたいです。前にも似たようなことを質問していましたが、まだうまくいってません。マスタメンテナンス画面を作成しているのですがテキストボックスの入力チェック が上手くいきません。テキストボックス はコードという名前をつけています。 以下のコードでコーディングしています。 未入力チェック関数 Public Function EmptyCheck(Koumoku As Variant) As Boolean '引数で渡された項目が入力されているかチェック If Koumoku = ""Then EmptyCheck = True Else EmptyCheck = False End If End Function 桁数チェック関数 Public Function NumberCheck(Koumoku As Variant, Number As Integer) As Boolean If Len(Koumoku) <>Number Then NumberCheck = True Else NumberCheck = False End If End Function 半角英数字チェック関数 Public Function ZokuseiCheck(Koumoku As Variant) As Boolean If IsNumeric(Koumoku) = False And Not Koumoku Like "[a-z]*"And Len(Koumoku) <>6 Then ZokuseiCheck = True Else ZokuseiCheck = False End If End Function コード処理 Private Sub コード_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then ' If EmptyCheck(コード) = True Then MsgBox "コードを入力してください。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf NumberCheck(コード, 6) = True Then MsgBox "コードの桁数が不正です。" コード.SetFocus KeyCode = 0 Exit Sub ElseIf ZokuseiCheck(コード) = True Then MsgBox "コードの属性が不正です。" コード.SetFocus KeyCode = 0 Exit Sub Else コード.Locked = True End If End If 上手くいかない点は以下の通りです。 1、テキストボックス(コード)の未入力チェックが上手く行きません。テキストボックスが空白の時も""になったりNullになったり変わるのでIf Koumoku = ""ThenにしてしまうとNullになった時処理されずそのまま次のテキストボックスにカーソルが移ってしまう時があります。なんでNullになったり""になったりで変わるのかも謎です。あと空白の時、Koumoku=""で一致しているにも関わらず、Falseで返されてしまい、未入力処理がされません。IsNullを使ってNull値判定してもKoumoku=Nullで一致してるのにFalseで返されました。 2、桁数チェックも上手く行きません。コード処理の方で桁数チェック関数に6という数字を渡して6桁入力としているのですが6桁でもエラーになってしまう時があります。LEN関数でどのように文字数を測っているのかも よくわからないです。 3.これは単純に半角英数字の判定の仕方が間違っているんだと思いますが、やり方がよく分からず、上手く判定できません。 4.これは入力チェックに当てはまるのですがEnterキーを押した時に処理するようにコードを書いていましたが変な結果が出ます。最初にテキストボックスでEnterキーを押して未入力の時に、「コードを入力してください。」とメッセージが出るのはいいのですがその後入力してもまた同じメッセージが出てきます。ほかのテキストボックスをクリックしてカーソルを移さないと同じメッセージが出続けます。桁数や半角英数字チェックの時も同じです。他のカーソルをクリックしないと次の項目のチェックにいかず、同じエラーメッセージが出続けます。何とかほかのカーソルに移さずに修正したら正しく処理が通るようにできないでしょうか。 5、最後に何も問題なかったらテキストボックスにロックかけるよう処理をしているのですが「コントロールの変更を保存していないときはコントロールをロックできません」というエラーメッセージが出てくる時があります。意味が分からず調べても出てこなかったので意味のわかる方何が悪くてエラーになっているのか教えて下さい。 調べてもデバッグしても原因が分からないものばかりです。 長文になってしまいましたがわかる方よろしくお願いします。

  • ACCESS

    現在以下のシステムを検討しています。 (1)ログインフォームと(2)トップフォーム(3)注文フォームが別々に存在しており、 (1)ログインフォームは  ・ログインID入力用のテキストボックスが一個  ・パスワード入力用のテキストボックスが一個  ・ログインボタンが1個  設置されています。 以下はログインボタンクリック時に動作するプログラムです。 Private Sub cmdLogIn_Click() Dim Res If IsNull(Me.txtID) Then MsgBox "IDを入力してください" Me.txtID.SetFocus Exit Sub End If If IsNull(Me.txtPass) Then MsgBox "パスワードを入力してください" Me.txtPass.SetFocus Exit Sub End If Res = DLookup("パスワード", "T顧客", _ "顧客ID='" & Replace(Me.txtID, "'", "''") & "'") If IsNull(Res) Then MsgBox "該当するIDはありません。正しいIDを入力してください。" Me.txtID.SetFocus Exit Sub End If If Res = Me.txtPass Then DoCmd.OpenForm "注文フォーム" '----ID,pass合致でフォームを開く。 Me.txtID = Me.txtID2 Me.txtPass = Me.txtPass2 DoCmd.Close acForm, "Fログイン" Else MsgBox "パスワードが異なります。", vbOKOnly + vbCritical Me.txtPass.SetFocus End If End Sub (2)トップフォームは  商品のリストが画像付き(商品一個につき画像一個)  で示され、画像を押すと商品別に作成してある注文フォームに進むのですが、  ログイン完了していないとログインを促すメッセージが出て注文フォームが開かないよう  にしています。  トップフォームにはテキストボックスを2個不可視の状態で配置しております。  以下は商品画像に埋め込んであるコマンドです。 Private Sub 商品画像 1_Click() Dim Res If IsNull(Me.txtID) Then MsgBox "ログインしてください" Exit Sub End If If IsNull(Me.txtPass) Then MsgBox "ログインしてください" Exit Sub End If If Res = Me.txtPass Then DoCmd.OpenForm "商品名" '----ID,pass合致で注文フォームを開く。 End If End Sub   (3)注文フォームは  ・数量選択のコントロールボックス  ・注文ボタン  ・キャンセルボタン  を設置しています。 【以下が質問内容になります】 「ロフインフォーム」内の入力値(テキストボックスに入力されていたIDやパスワード値)を注文フォーム内のテキストボックスに取得させる(あるいは設定させる)にはどのようにすればよいのでしょうか? 注文フォームにはテキストボックス2個( ID入力用と Password入力用)を不可視で配置しています。こちらのテキストボックス2個については手動入力は行わず、注文フォームが開いた際にログイン時の ID, Paswordがテキストボックスの中に自動的に入力あるいは設定されるようにしたいのですが、どのようにすればよいかがわかりません。 因みにログイン ID,Passwordは複数セットあり、ユーザーがログイン完了後、注文フォームを閉じるまでの間は 同一のID, Paswordの内容を保持したいと考えています。 上記の中にID,Paswordを保持させるようなコードを入れることは可能でしょうか? 注文フォームを開く際のコードに何か入れることができるのではないかと考えていたの ですが、よい案が浮かびません。 他によいやり方などがあれば教えていただけますでしょうか? よろしくお願いします。

  • VBAの書き方を教えてください。

    Access2010を使用しています。 フォーム:ログインにID、PASSのテキストBOXを設け、フォーム:メニューのコマンドボタンをID別に使用不可にしています。問題は、メニューからさらに製品仕様書の一覧フォームを開き、指定の製品の詳細フォームを開くのですが、詳細フォームにログインで入力したIDを使用し、使用不可コマンドボタンを作りたいのです。 ログインボタン Dim Res If IsNull(Me.ID) Then MsgBox "IDを入力してください" Me.ID.SetFocus Exit Sub End If If IsNull(Me.パスワード) Then MsgBox "パスワードを入力してください" Me.パスワード.SetFocus Exit Sub End If Res = DLookup("パスワード", "talogin", "ID='" & Me.ID & "'") If IsNull(Res) Then MsgBox "該当するIDはありません。正しいIDを入力してください。" Me.ID.SetFocus Exit Sub End If If Res = Me.パスワード Then DoCmd.OpenForm "メニュー" '----ID,pass合致でフォームを開く。 Forms!メニュー!ログイン名 = Me.ID Else MsgBox "パスワードが異なります。", vbOKOnly + vbCritical Me.パスワード.SetFocus End If End sub ログインボタンで、テーブルtaEnabledを参照。不可リストに書き込んだボタン名のみ、使用不可にする。 メニュー画面にログイン名を表示。 Private Sub Form_Open(Cancel As Integer) Dim AID As Long Dim Var As Variant AID = Nz(DLookup("権限ID", "taLogin", "ID ='" & Forms!ログイン!ID & "'"), 0) For Each Var In Split(DLookup("不可リスト", "taEnabled", "権限ID =" & AID), ",") Me.Controls(Var).Enabled = Flase Next Var End Sub この後、フォーム:メニューに設置の各帳票・単表フォームを開いた時に、再度IDを使用し、表示したフォーム内のコマンドボタンを使用不可にしたいので、皆様のお力をお貸し下さい。

  • Access VBA

    Access2003を使用しています。 単純な質問かもしれませんがよろしくお願いします。 ログイン画面を作成しておりログイン自体はできたのですが、ログインしたときに ログイン画面を自動的に閉じたいのですが、うまくいきません。 現在の仕様では、ログイン画面(frm_ログイン)とメイン画面(frm_main)があり ログインに成功するとメイン画面が開くようになっています。 ーー以下VBAコードーー Private Sub rogin_Click() Dim a If IsNull(Me.[UserName]) Then MsgBox "IDが未入力です" Me.[UserName].SetFocus ElseIf IsNull(Me.[password]) Then MsgBox "パスワードが未入力です" Me.[password].SetFocus Else a = DLookup("パスワード", "tbl_ユーザー", "ユーザー名='" & Me.[UserName] & "'") If IsNull(a) Then MsgBox "該当する ユーザー名 は存在しません" Me.[UserName].SetFocus ElseIf StrComp(a, Me.[password], vbBinaryCompare) = 0 Then On Error GoTo Err_rogin_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "frm_main" DoCmd.OpenForm stDocName, , , stLinkCriteria Else MsgBox "パスワードが違います" Me.[password].SetFocus End If End If Exit_rogin_Click: Exit Sub Err_rogin_Click: MsgBox Err.Description Resume Exit_rogin_Click End Sub ーー以上ーー 長くなって申し訳ないのですが、どのようにすればログイン後にログイン画面(frm_ログイン)を閉じるようにできるのでしょうか? よろしくお願いします。

専門家に質問してみよう