- ベストアンサー
Access レコードのロック
Access2000 フォームを読み込んだとき,テキストボックス"受付No."欄が 入力されている場合,テキストボックス"件名"欄をデータの変更が 出来ないようにロックを掛けたいのです。 下記のイベントプロシージャを組んだのですが,全くロックされません。 VBA初心者なので多分とんでもない間違いをしていると思いますが, どこが違うのかご指摘下さい。 Private Sub Form_Load() If Me.受付No. <> "" Then Me.件名.Locked = True Me.件名.Enabled = False End If End Sub
- みんなの回答 (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行でしかありません。
その他の回答 (2)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>テキストボックス"受付No."欄が >入力されている場合,テキストボックス"件名"欄をデータの変更が >出来ないようにロックを掛けたいのです。 これだけならVBAを使うより条件付書式のほうが簡単ですよ 特に帳票フォームの場合VBAの方法ではレコードごとに異なる設定はできませんが 条件付書式なら可能です 条件式 [受付No] is not null
お礼
早速の回答有難うございます。 条件付書式ですと,背景色が濃いグレーになり, 非常に見づらくなってしまうので。
[イミディエイト] ? 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
お礼
早速の回答有難うございます。 一日色々いじったのですが,うまくいきません。 VBA難しいものですね。 入力済みのレコードは,ロックが掛かるのですが, 新規データの入力画面に移ると, VBの画面になって「受付番号 = ""」のラインが黄色になり 実行時エラー 「フィールド'受付番号'は長さ0の文字列を格納できません」 となってしまいます。
お礼
どうも有難うございました。