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

Microsoft Access 2010についての質問です。

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

よろしくお願いいたします。

A 回答 (6件)

No5の


Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset)

はレコードセットの場合と勘違いしていました。
No5はパスしてください。



Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス)

です。


暑さで脳の中がぐちゃぐちゃです。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。

素晴らしいご示唆を頂き、ありがとうございました。そうですね。一度書き込んでみればいいんですね。自分でも、他の部分(フォルダが書き込み可能か否かの判定など)ではこの考え方を使っているにもかかわらず、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

改めまして、ありがとうございました。

お礼日時:2011/08/24 16:33

もっとはっきりと、



Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset)

と、開くモードをはっきりとしてもいいですが。


VBAでの手段はこのようなところですかね。
    • good
    • 0

No3の続きです。



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

たとえば、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

ではどうですか。
    • good
    • 0

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オブジェクトから何かを
して、出来る、出来ない、という方法も
あるかもしれませんが、これは多分セキュリティ
がかけられていると思われるので、今のところ
このくらいですが。

この回答への補足

ありがとうございます。

新しく教えて頂いたもので実行してみたところ、やはりダメでした。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

補足日時:2011/08/24 13:21
    • good
    • 0

たぶん、以下で機能すると思いますが。



Sub test()
Dim ret As Long
ret = GetAttr(CurrentProject.Path & "\" & "ファイル名")
If ret And vbReadOnly Then
MsgBox "読み取り専用"
Else
MsgBox "読み取り専用ではない"
End If
End Sub

この回答への補足

ありがとうございます。

教えて頂いたプログラムを実行してみたところ、accdbファイルが自分のパソコン内にあるときは上手くいきました。アーカイブ属性がオンになっているので、変数retの値は33になりました。

しかし、対象のaccdbファイルは普段、BuffaloのNASサーバ(TS-WX1.0TL/R1)の中に置いてあります。その状態で試してみますと、読み取り専用属性が認識されません。つまり、変数retが33にならず、32になってしまいます。

ちなみに、このNASサーバ内にあるファイル(accdbファイル以外のファイルも含みます)について、ファイルのプロパティで読み取り属性を設定することはできません。なぜかは分からないのですが、NASサーバが拒否しているようです。一方で、NASサーバ内にあるaccdbファイルを読み取り専用モードで開くことは可能です。この辺の事情も関係してくるのでしょうか。

というわけで、質問を次のように少し変えさせて頂きます。

読み取り属性の設定を許可しないNASサーバ内に置いたaccdbファイルについて、読み取り専用で開かれているか否かをVBAで確認したいのですが、どのようにすればよいのでしょうか。

よろしくお願いいたします。

補足日時:2011/08/24 09:37
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A