
No.6ベストアンサー
- 回答日時:
No5の
Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset)
はレコードセットの場合と勘違いしていました。
No5はパスしてください。
Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス)
です。
暑さで脳の中がぐちゃぐちゃです。
何度もありがとうございます。
素晴らしいご示唆を頂き、ありがとうございました。そうですね。一度書き込んでみればいいんですね。自分でも、他の部分(フォルダが書き込み可能か否かの判定など)ではこの考え方を使っているにもかかわらず、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
改めまして、ありがとうございました。
No.5
- 回答日時:
もっとはっきりと、
Set db = DBEngine.Workspaces(0).OpenDatabase(ファイルパス, dbOpendynaset)
と、開くモードをはっきりとしてもいいですが。
VBAでの手段はこのようなところですかね。
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
ではどうですか。
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オブジェクトから何かを
して、出来る、出来ない、という方法も
あるかもしれませんが、これは多分セキュリティ
がかけられていると思われるので、今のところ
このくらいですが。
この回答への補足
ありがとうございます。
新しく教えて頂いたもので実行してみたところ、やはりダメでした。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
No.1
- 回答日時:
たぶん、以下で機能すると思いますが。
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で確認したいのですが、どのようにすればよいのでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) こんにちは。Windows10でaccess(拡張子accdb)を右クリックし、プロパティ→全般タブ 1 2023/02/03 19:14
- Word(ワード) PCで作ったwordをスマホで編集しようとすると「このファイルは読み取り専用です。」と表示される。 3 2023/05/30 14:51
- Excel(エクセル) ExcelのVBAでWordを読み取り専用で開いて、見たいページに自動で移動する方法を教えて頂きたい 4 2022/07/27 10:39
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Excel(エクセル) excel2003でxlsxファイルを更新したい 6 2023/01/31 15:15
- Excel(エクセル) ネットワーク上のエクセルとリンクしている時にデータ更新をvbaで、refresh Allで行う場合の 2 2023/04/10 05:39
- システム 外付けHDDの初期化について 4 2023/03/05 21:19
- Excel(エクセル) Excelが読み取り専用になる件について 5 2022/10/13 09:53
- システム 外付けHDDの初期化について 4 2023/03/05 20:00
- Excel(エクセル) Excelの読み取り専用について質問です。 最初に開いてる人が編集しているデータは、読み取り専用を開 2 2022/06/16 21:59
このQ&Aを見た人はこんなQ&Aも見ています
-
ACCESSでデータ読み取り専用を解除する方法
その他(データベース)
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
Access VBA 読み取り専用かチェック
その他(データベース)
-
-
4
「データベースまたはオブジェクトは読み取り専用なので、更新できません」エラーについて
その他(データベース)
-
5
Access 昇順・降順で並び替えできない
その他(データベース)
-
6
ACCESSで値を代入できないとは?
Visual Basic(VBA)
-
7
Accessのレポートで開くと「読み取り専用なので…」と出る。
Access(アクセス)
-
8
VBAでCSVファイルが使用中かどうかの確認
Visual Basic(VBA)
-
9
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
10
「#エラー」の回避
Access(アクセス)
-
11
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
12
Accessで別mdbのテーブルをコピー
その他(プログラミング・Web制作)
-
13
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
14
vba Listviewでのチェックボックスのイベントを教えてください
Excel(エクセル)
-
15
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルでExcelを読み取...
-
【Word2000】右クリック「読み...
-
Excel>PERSONAL.XLSが開かれて...
-
MS-EXCEL*読取専用で保存ができ...
-
Excelvbaの 編集のためロックさ...
-
エクセルの「読み取り専用」「....
-
危険なファイルを正常にする方法
-
CD-Rの再利用
-
USBの読み取り専用を解除する方法
-
エクセルでCSVデーターを所定の...
-
Excel2010 ファイルの上書禁止...
-
サーバー上のファイルを保護さ...
-
知人が作ったパワーポイントを...
-
iTunesが開けません。
-
読み取り専用で・・・・・
-
ACCESSでデータ読み取り専用を...
-
Excelで読み取り専用設定
-
Excelが読み取り専用になる件に...
-
エクセルで誰が今開いているか...
-
添付ファイルが読み取り専用に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCEL共有ファイルの使用中の相...
-
エクセルで誰が今開いているか...
-
Chromebookを使用しています。 ...
-
Excelブックの共有をしているの...
-
excel で通知と読み取り専用の...
-
Excel>PERSONAL.XLSが開かれて...
-
Excelのファイルが突然開けな...
-
PCで作ったwordをスマホで編集...
-
バッチファイルでExcelを読み取...
-
危険なファイルを正常にする方法
-
ExcelのVBAでWordを読み取り専...
-
エクセルで他の人が開いたとき...
-
NASのフォルダが読み取り専用に...
-
autocadが作業途中で読み取り専...
-
ACCESSでデータ読み取り専用を...
-
Excelが読み取り専用になる件に...
-
読み取り専用にチェックが入っ...
-
excel2003でxlsxファイルを更新...
-
属性の適用エラー表示が消えない
-
USBの読み取り専用を解除する方法
おすすめ情報