こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access レコードのロック

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

Private Sub Form_Load()
If Me.受付No. <> "" Then
Me.件名.Locked = True
Me.件名.Enabled = False
End If
End Sub

投稿日時 - 2008-07-22 15:32:41

QNo.4195722

困ってます

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

私は、[受付番号]でサンプルを書いています。
で、質問者は、[受付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行でしかありません。

投稿日時 - 2008-07-23 08:40:02

お礼

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

投稿日時 - 2008-07-23 16:42:35

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

条件式
[受付No] is not null

投稿日時 - 2008-07-22 16:52:58

お礼

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

投稿日時 - 2008-07-23 07:54:43

[イミディエイト]
? 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

投稿日時 - 2008-07-22 15:58:22

お礼

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

投稿日時 - 2008-07-23 08:06:28

あなたにオススメの質問