• ベストアンサー

読み取り専用で開いているか否かの確認(アクセス)

Microsoft Access 2010についての質問です。 カレントプロジェクト(accdbファイル)が読み取り専用で開かれているか否かをVBAで確認したいのですが、どのようにすればよいのでしょうか。エクセルでいう「Workbook.ReadOnlyプロパティ」のようなものがあればいいと思うのですが、見つけられません。 よろしくお願いいたします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

No5の Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset) はレコードセットの場合と勘違いしていました。 No5はパスしてください。 Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス) です。 暑さで脳の中がぐちゃぐちゃです。

macron
質問者

お礼

何度もありがとうございます。 素晴らしいご示唆を頂き、ありがとうございました。そうですね。一度書き込んでみればいいんですね。自分でも、他の部分(フォルダが書き込み可能か否かの判定など)ではこの考え方を使っているにもかかわらず、accdbファイルが読み取り専用で開かれているか否かの判定では、なぜか完全に失念していました。 実際に書き込まなくても、書き込もうとするだけでもいいようです。下記のようなコードを作ってみました。rs.AddNewを実行しているだけです。このコードでは書き込みの一歩手前で止めていますので、読み取り専用でない場合にも後で消す必要がなく、便利かと思います。 Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル名", dbOpenDynaset) On Error Resume Next rs.AddNew If Err.Number <> 0 Then MsgBox ("読み取り専用である") Else MsgBox ("読み取り専用でない") End If On Error GoTo 0 rs.Close: Set rs = Nothing db.Close: Set db = Nothing 改めまして、ありがとうございました。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

もっとはっきりと、 Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset) と、開くモードをはっきりとしてもいいですが。 VBAでの手段はこのようなところですかね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No3の続きです。 No3の最後の部分の場合、直接には 読み取り専用である、ということは 確認できません。読み取り専用ではない、 ということは確認できますが。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

たとえば、TableDefsに新規にテーブルの作成を 試みたとして、読み取り専用ならば実行時エラー が返ってきます。 というような意味でのTableDefのことです。 Dim db As Database Dim tdf As TableDef Dim fld As Field If Err.Number <> 0 Then Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス) Set tdf = db.CreateTableDef("テーブル名") Set fld = tdf.CreateField("フィールド名", dbText, 50) tdf.Fields.Append fld tdf.Fields.Refresh db.TableDefs.Append tdf db.TableDefs.Refresh Set tdf = Nothing db.Close: Set db = Nothing Else MsgBox "実行できません。読み取り専用か排他モードになっています" End If ただ、上記はエラー処理をしなければ実行時エラーが返ってくるので If Err.Number <> 0 Then でにげています。 実行時エラーが生じるのは、 Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス) のところです。 もし、登録できてしむならば、そのテーブルは 必要ないので改めてテーブルを、今度は上位 オブジェクトのTableDefsからテーブルを 探して削除するということをするように なります。 反対に、実行時エラーが Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス) で、出るならば、この時点で以降をキャンセルすればいいということで、 Dim db As Database If Err.Number <> 0 Then Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス) MsgBox "読み取り専用ではありません" Else MsgBox "実行できません。読み取り専用か排他モードになっています" End If db.Close: Set db = Nothing ではどうですか。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

Microsoftのサンプルからですが、 Microsoft Scripting Runtimeを参照設定しての方法です。 Sub test20() Dim objFSO As Object Dim objFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(ファイルパス) If objFile.Attributes And ReadOnly Then MsgBox "読み取り専用" Else MsgBox "読み取り専用ではない" End If MsgBox objFile Set objFSO = Nothing Set objFile = Nothing End Sub これが通らないとなると、残念ながら難しい。 AccessのTableDefオブジェクトから何かを して、出来る、出来ない、という方法も あるかもしれませんが、これは多分セキュリティ がかけられていると思われるので、今のところ このくらいですが。

macron
質問者

補足

ありがとうございます。 新しく教えて頂いたもので実行してみたところ、やはりダメでした。objFile.Attributesの値は32でした。どうやら、ファイルの属性には頼れないようです。 ちなみに、NASサーバの情報が下記リンク先にありました。これによると、OSの仕様上、読み取り専用属性は常にOFFになるということでした。このNASサーバを使っている限り、ファイルの属性を使うことはできないのかもしれません。NASサーバにこのような機能制限があるとは知りませんでした。次に購入するときは気を付けたいと思います。 http://buffalo.jp/php/lqa.php?id=BUF2210 TableDefオブジェクトを調べてみましたが、よく分かりませんでした。Accessのヘルプを参照して下記のコードを実行し、イミディエイトウィンドウに表示される情報(TableDef.Attributesプロパティ)を、読み取り専用で開いたときとそうでないときとで比較してみましたが、全く同じでした。もしかして、TableDef.Attributesプロパティではなく、他のプロパティでしょうか? Dim dbsNorthwind As Database Dim fldLoop As Field Dim relLoop As Relation Dim tdfloop As TableDef Set dbsNorthwind = CurrentDb() With dbsNorthwind ' Display the attributes of a TableDef object's ' fields. Debug.Print "Attributes of fields in " & _ .TableDefs(0).Name & " table:" For Each fldLoop In .TableDefs(0).Fields Debug.Print " " & fldLoop.Name & " = " & _ fldLoop.Attributes Next fldLoop ' Display the attributes of the Northwind database's ' relations. Debug.Print "Attributes of relations in " & _ .Name & ":" For Each relLoop In .Relations Debug.Print " " & relLoop.Name & " = " & _ relLoop.Attributes Next relLoop ' Display the attributes of the Northwind database's ' tables. Debug.Print "Attributes of tables in " & .Name & ":" For Each tdfloop In .TableDefs Debug.Print " " & tdfloop.Name & " = " & _ tdfloop.Attributes Next tdfloop .Close End With

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

たぶん、以下で機能すると思いますが。 Sub test() Dim ret As Long ret = GetAttr(CurrentProject.Path & "\" & "ファイル名") If ret And vbReadOnly Then MsgBox "読み取り専用" Else MsgBox "読み取り専用ではない" End If End Sub

macron
質問者

補足

ありがとうございます。 教えて頂いたプログラムを実行してみたところ、accdbファイルが自分のパソコン内にあるときは上手くいきました。アーカイブ属性がオンになっているので、変数retの値は33になりました。 しかし、対象のaccdbファイルは普段、BuffaloのNASサーバ(TS-WX1.0TL/R1)の中に置いてあります。その状態で試してみますと、読み取り専用属性が認識されません。つまり、変数retが33にならず、32になってしまいます。 ちなみに、このNASサーバ内にあるファイル(accdbファイル以外のファイルも含みます)について、ファイルのプロパティで読み取り属性を設定することはできません。なぜかは分からないのですが、NASサーバが拒否しているようです。一方で、NASサーバ内にあるaccdbファイルを読み取り専用モードで開くことは可能です。この辺の事情も関係してくるのでしょうか。 というわけで、質問を次のように少し変えさせて頂きます。 読み取り属性の設定を許可しないNASサーバ内に置いたaccdbファイルについて、読み取り専用で開かれているか否かをVBAで確認したいのですが、どのようにすればよいのでしょうか。 よろしくお願いいたします。

関連するQ&A