プロが教えるわが家の防犯対策術!

ACCESSの1つのファイルを何人もが使用しているファイルがあるとして、指定したフォームだけ、他ユーザーが使用している場合はロックする方法はありますか?レコードロックの機能ではうまくできなかったので、フォームを開かないようにエラーメッセージを出したいのですが・・・

A 回答 (3件)

Microsoft DAO 3.x Object Library を探してください。



案2-----------
省略
案2-----------
を消して

'案1-------
から
'案1-------
までの間のコメント(4行)を外してください。

コピペで動くと思いますが
コードの内容は把握しておいて下さい。でないと問題発生時に困りますよ。
    • good
    • 0

バージョン情報はヘルプから確認できます。



下準備
テーブルを一個用意  テーブル名を  T1
           フィールド名を F1  フィールドののデータ型はテキストに。
           テーブル T1を保存してから、右クリックしてプロパティを表示。
           隠しオブジェクトにチェックを入れます。
           (見たいときは、メニューから →ツール→オプション
            表示タブの隠しオブジェクトにチェックを。)
           
ロックしたいフォーム名を FM1 と仮定します。
そのフォームの開く時のイベントに下記を記述しますが
VBAの画面になったら、ツール→参照設定で、DAO3.x Object Libraryにチェックを入れてください
(DAO3.x の x はバージョンによって異なりますが、5 か 6 です)
↓こうなります

Private Sub Form_Open(Cancel As Integer)
'要参照設定 DAO3.x Object Library
On Error GoTo err
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim strSql As String
  
  strSql = "select F1 from T1"
  Set rs = CurrentDb.OpenRecordset(strSql, dbOpenSnapshot)
  
  '誰かが使用中の場合
  If DCount("*", "T1") > 0 Then
  '案1----------------
  '  rs.Close: Set rs = Nothing
  '  MsgBox rs!F1 & " が使用中ですので終了します", vbApplicationModal
  '  Cancel = True
  '  Exit Sub
  '案1---------------
  '案2---------------
    If MsgBox(rs!F1 & " が使用中です。読み取り専用で開きますか?", _
        vbYesNo + vbApplicationModal) = vbYes Then
      rs.Close: Set rs = Nothing
      Me.AllowEdits = False
      Me.AllowAdditions = False
      Me.AllowDeletions = False
  
    Else
      rs.Close: Set rs = Nothing
      '開くのをキャンセル
      Cancel = True
      Exit Sub
    End If
  '案2---------------
  Else
    rs.Close: Set rs = Nothing
    '誰も使用していないので自身を登録
    strSql = "Insert Into T1 (F1) Values('" & Environ("username") & "')"
    Debug.Print strSql
    CurrentDb.Execute strSql, dbFailOnError
  End If
  Exit Sub

err:
    MsgBox err.Number & vbCrLf & err.Description
    Cancel = True
End Sub


閉じる時のイベントに下記を記述
Private Sub Form_Close()
'要参照設定 DAO3.x Object Library
  Dim db As DAO.Database
  Dim strSql As String
  '自身が使っていたら名前を削除
  If DCount("*", "T1", "F1='" & Environ("username") & "'") > 0 Then
    '削除クエリ実行
    strSql = "delete * from T1"
    CurrentDb.Execute strSql
  End If
End Sub

※隠しオブジェクトにしてあるテーブルを直接開かれた場合は処置なしです。
(誰かがフォームを開きっ放しで消えた場合は、このテーブル内のデータを削除して解除を(*^^)v)

メッセージボックスが表示された際に、Ctrl + Break を押して強制終了する場合の対処は、
メニューから、『起動時の設定』で『ショートカットキーを有効にする」の
チェックを外してください。

案2がロックの場合、不要でしたら削除して案1----の間の ' を外して下さい。
初心者にはキツイかも知れませんが頑張って下さい。
分からない単語はカーソルを持っていって、F1 キーでヘルプを見て下さい。

追伸
不明な点があれば、お礼欄にレス入れてください。
こちらにメールが入りますので応答も早いかと思います。
    • good
    • 0
この回答へのお礼

お返事が遅くなりすみません。がんばってみましたが、最初で止まってしまいました。VBAの画面になったら、ツール→参照設定で、DAO3.x Object Libraryにチェックを入れるところですが、該当する項目がありません。それと案1で考えています。項目チェックができれば
、コピペでいけますか?

お礼日時:2007/01/06 12:35

VBA でも構いませんか?


Accessのバージョンは?

この回答への補足

VBA勉強中ですので、初心者向きにアドバイスをお願いします。バージョンはわかりません。

補足日時:2006/12/21 20:34
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!