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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
ACCESSでデータ読み取り専用を解除する方法
その他(データベース)
-
勝手に読み取り専用ファイルになってしまう
Word(ワード)
-
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
-
4
Access サブフォームでの選択行の取得
その他(データベース)
-
5
Access2007 クエリが読み取り専用になってしまう
Access(アクセス)
-
6
Access VBA 読み取り専用かチェック
その他(データベース)
-
7
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
8
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
9
Accessのハイパーリンクをクリックしてもファイルが開かない
Access(アクセス)
-
10
Access終了時にマクロまたはVBAの実行したい
その他(Microsoft Office)
-
11
フォームの高さを数値で指定したいのですが
Excel(エクセル)
-
12
AccessのRefresh・Requery・Repaintの違い
Access(アクセス)
-
13
アクセスのフォームのビューが表示されないのですが、
その他(データベース)
-
14
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
15
DAOでのOpenRecordsetの方法
SQL Server
-
16
どこにもフォーカスを当てたくない
Access(アクセス)
-
17
Access2002 フォームを閉じるたびに「このフォームの変更を保存しますか?」と表示される
その他(データベース)
-
18
スクロールバーをVBAで操作したい
Access(アクセス)
-
19
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
20
「データベースまたはオブジェクトは読み取り専用なので、更新できません」エラーについて
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELが勝手に「読み取り専用」...
-
エクセルで誰が今開いているか...
-
ACCESSでデータ読み取り専用を...
-
EXCEL共有ファイルの使用中の相...
-
Excelブックの共有をしているの...
-
PCで作ったwordをスマホで編集...
-
読み取り専用にチェックが入っ...
-
楽天Edyの読み取らせかた
-
グーグルクロムにダウンロード...
-
エクセルで他の人が開いたとき...
-
Excel文書が読み取り専用になっ...
-
Excelvbaの 編集のためロックさ...
-
エクセルのファイルが突然読み...
-
エクセル共有ブックが読み取り...
-
Excelのファイルが突然開けな...
-
Excel>PERSONAL.XLSが開かれて...
-
excel で通知と読み取り専用の...
-
Excelが読み取り専用にならない
-
Eclipse で同期するたびに読み...
-
Excelが読み取り専用になる件に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで誰が今開いているか...
-
EXCELが勝手に「読み取り専用」...
-
PCで作ったwordをスマホで編集...
-
ACCESSでデータ読み取り専用を...
-
EXCEL共有ファイルの使用中の相...
-
Chromebookを使用しています。 ...
-
Excelブックの共有をしているの...
-
Excelのファイルが突然開けな...
-
エクセルで他の人が開いたとき...
-
エクセルのファイルが突然読み...
-
Excel>PERSONAL.XLSが開かれて...
-
USBの読み取り専用を解除する方法
-
ExcelのVBAでWordを読み取り専...
-
NASのフォルダが読み取り専用に...
-
読み取り専用にチェックが入っ...
-
勝手に読み取り専用ファイルに...
-
エクセル共有ブックが読み取り...
-
バッチファイルでExcelを読み取...
-
Excelが読み取り専用にならない
-
読み取り専用ファイルを印刷レ...
おすすめ情報