• ベストアンサー

Access レコードのロック

Access2000 フォームを読み込んだとき,テキストボックス"受付No."欄が 入力されている場合,テキストボックス"件名"欄をデータの変更が 出来ないようにロックを掛けたいのです。 下記のイベントプロシージャを組んだのですが,全くロックされません。 VBA初心者なので多分とんでもない間違いをしていると思いますが, どこが違うのかご指摘下さい。 Private Sub Form_Load() If Me.受付No. <> "" Then Me.件名.Locked = True Me.件名.Enabled = False End If End Sub

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

  • ベストアンサー
noname#140971
noname#140971
回答No.3

私は、[受付番号]でサンプルを書いています。 で、質問者は、[受付No.]です。 そこら辺りは自分の環境で・・・。 Private Sub Form_Current()   If Me.NewRecord Then     Me.受付番号 = ""   End If   受付番号_AfterUpdate End Sub Private Sub Form_Current()   受付番号_AfterUpdate End Sub 既定値を設定していればこれでもOKです ※既定値=0の可能性があるので注意を喚起するための3行でしかありません。

hirocha03
質問者

お礼

どうも有難うございました。

その他の回答 (2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

>テキストボックス"受付No."欄が >入力されている場合,テキストボックス"件名"欄をデータの変更が >出来ないようにロックを掛けたいのです。 これだけならVBAを使うより条件付書式のほうが簡単ですよ 特に帳票フォームの場合VBAの方法ではレコードごとに異なる設定はできませんが 条件付書式なら可能です 条件式 [受付No] is not null

hirocha03
質問者

お礼

早速の回答有難うございます。 条件付書式ですと,背景色が濃いグレーになり, 非常に見づらくなってしまうので。

noname#140971
noname#140971
回答No.1

[イミディエイト] ? Null<>"" Null ? CBool(Len(null & "")) False このイミディエイトウインドウでのテスト結果が全てです。 つまり、空欄を""と比較しても真とか偽とかの値ではなく Null という判定になります。 この不具合を回避するには Len関数で長さを測ればいいです。 Private Sub Form_Current()   If Me.NewRecord Then     受付番号 = ""   End If   受付番号_AfterUpdate End Sub Private Sub 受付番号_AfterUpdate()   Dim isLocked As Boolean      isLocked = Len(Me.受付番号 & "")   Me.件名.Enabled = Not isLocked   Me.件名.Locked = isLocked End Sub これですと、各レコードがカレントになる都度に<受付番号_AfterUpdate>がコールされます。 <受付番号_AfterUpdate>では、[受付番号]の長さが0ならば<偽>、そうでなければ<真>と。 これは、<真>と<偽>の約束事です。 [イミディエイト] ? CBool(0) False ? CBool(1) True

hirocha03
質問者

お礼

早速の回答有難うございます。 一日色々いじったのですが,うまくいきません。 VBA難しいものですね。 入力済みのレコードは,ロックが掛かるのですが, 新規データの入力画面に移ると, VBの画面になって「受付番号 = ""」のラインが黄色になり 実行時エラー 「フィールド'受付番号'は長さ0の文字列を格納できません」 となってしまいます。

関連するQ&A

  • access タブコントロールのロック

    いつもお世話になっております。 accessのフォームが開くときに、タブコントロールの編集をロックしたいのですが、 下記の記述ですとエラーになってしまいます。 何がおかしいのかおしえてください。 ------------------------------ Private Sub Form_Load() Me.タブ.Locked = True End Sub ------------------------------ Private Sub Form_Load() Me.タブ.Pages("ページ1").Locked = True Me.タブ.Pages("ページ2").Locked = True Me.タブ.Pages("ページ3").Locked = True Me.タブ.Pages("ページ4").Locked = True Me.タブ.Pages("ページ5").Locked = True End Sub

  • 【Access】コントロールのプロパティをまとめて設定する方法について

    ソース内で一つのコントロールに複数のプロパティを設定しており、 コントロールが複数あるため、関数内でコントロールのプロパティを設定したいと思いました。 よって、下記のようなソースを記述しましたが、 「NULLの使い方が不正です。」と表示されてしまいました。 【ソース】 Private Sub Form_Load() ' Me.txt_1.Enabled = False ' Me.txt_1.Locked = True SET_LOCK (Me.txt_1) SET_LOCK (Me.txt_2) End Sub Public Function SET_LOCK(CtrName As String) CtrName.Enabled = False CtrName.Locked = True End Function その為、上記のように、コントロール名を関数に渡し、 関数内でプロパティをまとめて設定する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • vba(Access2003)の記述情報

    こんばんは。 遅くに質問失礼します。 只今、Access2003のvbaを記述しており、エラーが出て困りましたので質問いたしました。 初歩的な事かと思うのですがご指導下さいませ。 AccessのフォームにテキストボックスA、テキストボックスB、テキストボックスC、作成し、フォームロード時に編集ロックをしたいと思います。 ※------------------------------ Me.AllowEdits = False とか プロパティの編集ロック はい/いいえ を利用しない方法を探しています。 -------------------------------- 現在vbaの記述は Private Sub Form_Load()  Dim Tbox As Variant  Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC")  Dim i As Integer  For i = LBound(Tbox) To UBound(Tbox)   [Tbox(i)].Locked = True ★  Next i End Sub を記述すると★行にエラーが発生します。 勉強のため色々ためしてみました。 試(1)…For文を外し短文で [テキストボックスA].Locked = True とした場合には問題なくロックできました。 試(2)…For文を外し短文で [Tbox(0)].Locked = True とした場合にはエラー。 試(3)…変数内確認のため MsgBox Tbox(0) とした場合「テキストボックスA」と出ます。 試(4)…For文を外し短文で [ & Tbox(0) & ].Locked = True や [ + Tbox(0) + ].Locked = True 試しましたがエラー・・・(当たり前でしょうが、、、 試(5)…googleで『vba [] 文字列 結合』等色々調べましたがあまり良い例に辿り着けず、、、 ご教授いただければ幸いです。 何卒、宜しくお願い致します。

  • Accessにて、コントロールの編集可能、使用可能の設定

    Access2002を使用しています。 表形式で作成したフォームで、 Aというチェックボックスに、チェックが入っている場合  Bのコントロールは入力可能、  Cのコントロールは入力不可 チェックが入っていない場合、  Bのコントロールは入力不可、  Cのコントロールは入力可能 というふうにしたいのですが、 Private Sub A_AfterUpdate()   If A = -1 Then     B.Locked = False     B.Enabled = True     C.Locked = False     C.Enabled = False   Else     B.Locked = False     B.Enabled = False     C.Locked = False     C.Enabled = True   End If End Sub 上記のように設定すると、すべてのレコードに対しての設定になってしまいます。 1件ずつのレコードに対して、条件を設定するにはどのようにすればよいでしょうか? よろしくお願いいたします。

  • アクセス 抽出条件が一致したらフォームを開く

    教えてください! フォームを「開くとき」イベントに、以下のコードを書きました。 Private Sub Form_Open(Cancel As Integer) Me!コマンド24.Enabled = False End Sub そのフォームの中には、以下のふたつ(a,b)と、コマントボタン「コマンド24」があります。 a:テキストボックス「当月の名前」『コントロールソースに、=DatePart("m",Date())を設定』 b:コンボボックス「月」『リスト値で、4,5,6,7,8,9を設定』月 そして、aとbの数値が一致した時に、検索ボタンを使用可能にする というコードを書きました。(というか、書いたつもりです) Private Sub 月_AfterUpdate() If (Me!当月の名前) = (Me!月) = True Then Me!24.Enabled = False Else Me!コマンド24.Enabled = True End If End Sub ですが、数値が一致しなくても、検索ボタンどうも、うまくいきませんでした。 このコードのどこが間違っているのでしょうか?

  • access setfocusについて

    いつもお世話になっております。 いろいろ調べたのですが行き詰っておりまして ご教授お願いします。 下記記述でsetfocusでエラーになってしまいます。 Private Sub コマンド_Click() If IsNull(Me.テキストボックスコントロール名) Then MsgBox "未入力です" Me.テキストボックスコントロール名.SetFocus End If テキストボックスの処理記述 End Sub https://www.moug.net/tech/acvba/0030005.html こちらを参考にしました。 よろしくお願いします。

  • アクセス コンロール名が勝手に変わります

    フォームにテキストボックスをぐいってやって、名前を「テキスト.1」にしました。 そして、VBAで、 「me.テキスト」と打つと、 me.テキスト_1に変わっています。 「.」と名前を付けたのに、勝手に「_」に変わっています。 本当の名前(コントロール名は)テキスト.1だけど、 Private Sub Form_Load() Me.テキスト_1.Value = "aaa" End Sub を実行したら問題なく出来ました。 どういうことでしょうか?勝手に名前が変わるようになってるのですか?

  • アクセスのMeについて

    アクセスの本の中で,Meが出てきました。 問題は,フォームに得点と結果のテキストボックスを作成します。そして,テキストボックスに得点を入力します。コマンドボタンに次のイベントで,得点が合格か不合格かを判定し,結果のテキストボックスに出力するものです。フォームにMeを入力していないのですが,VBAで突然現れてきました。このMeは,どんなときに使うのでしょうか。教えていただければ幸いです。 Private Sub 実行_Click() If Me.得点 >= 100 Then Me.結果 = "合格" Else Me.結果 = "不合格" End If End Sub

  • 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初心者です。

    VBA初心者です。 ユーザーフォームにテキストボックスとコンボボックスを1つずつ作り、それらを Private Sub ComboBox1_Change()    TextBox1.Value = ComboBox1.Value End Sub というふうに繋いでるとき、テキストボックスにフォーカスをあてさせないようするため、 Private Sub UserForm_Initialize()    TextBox1.Enabled = False End Sub このようにしました。ここまでは問題ありません。質問したいことは、このときテキストボックスに表示させる文字が淡色になるのを防ぐ方法です。    TextBox1.Locked = True これを上に付け加えればうまくいきそうなのですが、うまくいきませんでした…。どなたか解決方法を教えて下さい。

専門家に質問してみよう