
Excel(2000 SP-3) VBAの ChangeFileAccessがうまく行きません。
VBAからあるExcelファイルをWorkbooks.Open で開く処理の制御で悩んでいます。
2人で同時にマクロでhoge.xls をOpenすると、どちらも「他のユーザが使用中です」的なメッセージが出ませんでした。
(エクスプローラからクリックしたりして、hoge.xlsを直接開くと、他のユーザが使用中かどうかがわかります)
それでは困るので、ChangeFileAccess のNotify:=true をセットしてみたら、2人目は他のユーザが使用中である旨のメッセージが出るようになりました。
しかし、ChangeFileAccess のNotifyはちゃんと設定されているようなのですが、
'ChangeFileAccess'メソッドは失敗しました:'_Workbook'オブジェクト
とエラーが出ています。
ChangeFileAccessはどう使うのが正しいのでしょうか?
ソースは
Workbooks.Open Filename:=ThisWorkbook.Path & "\hoge.xls", updatelinks:=1, Notify:=True
ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True
って感じなのですが。
Workbooks.Openはちゃんとできています。Workbooks.OpenがコケたらOn Error Goto で拾ってMsgBoxでメッセージを出す、という処理をしているのですが、Workbooks.OpenはOKなのにChangeFileAccessでコケて、On Error Goto に引っかかってしまっています。
No.1ベストアンサー
- 回答日時:
なかなか回答が付かないようなので。
。。ダメ元で以下のように一旦、xlReadOnlyにしたあと再度xlReadWriteに戻してみてください。
----------------------------------------------
Workbooks.Open Filename:=ThisWorkbook.Path & "\hoge.xls", updatelinks:=1, Notify:=True
●
If ActiveWorkbook.ReadOnly = False Then
ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly, notify:=True
End If
●
ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True
-------------------------------------------
ご回答ありがとうございました。
試してみたところ、xlReadOnlyをセットする時に「読み取り専用の切り替えを行う前に、編集内容を保存しますか?」とメッセージが出てしまいました。
でもWorkbooks.Openの直後なのでいいやー、とxlReadOnlyの直前に
ActiveWorkbook.Saved = True
をかましたら、黙ってうまく動いてくれました。(xlReadOnly をセットした後にはActiveWorkbook.Saved = False を入れてみました)
一度xlReadOnlyにしてみるという発想は全然なかったので、なんだか目からウロコな気分です。どうもありがとうございました。
No.2
- 回答日時:
> 2人で同時にマクロでhoge.xls をOpenすると、どちらも「他のユーザが
> 使用中です」的なメッセージが出ませんでした。
Workbooks.Open の前にこんな感じの関数でチェックしてもダメですか?
Function FileUsable(ByVal strFilename As String) As Long
'---------------------------------------------------------
' @Description: ファイルは使用可能かどうか調べる
' @Return : -1 ファイルは存在しない
' : 0 既に開かれている
' : 1 使用可能
'---------------------------------------------------------
Dim n As Integer
If Dir$(strFilename) <> vbNullString Then
n = FreeFile()
On Error Resume Next
Open strFilename For Binary Lock Read Write As #n
Close #n
If Err.Number = 0 Then FileUsable = 1
On Error GoTo 0
Else
FileUsable = -1
End If
End Function
この回答への補足
ご回答ありがとうございました。
ファイルがあるかどうか、開かれているかどうかは、こうやって調べればいいのですね...今までずっと「開いてみてコケたらファイルが存在しない」というチェック方法ばかりしていました。しかも、複数の人が同時に使うかどうかを意識したコーディングをしたこともありませんでした。
今回はNo.1 のtaocatさんの方法で行くことにしましたが、次からファイルチェックはKenKen_SPさんのこの関数の方法にしようと思います。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
読み取り専用で開いているエクセルを編集モードに変更したい
Excel(エクセル)
-
読み取り専用ファイルを上書き保存するには?
Visual Basic(VBA)
-
自分のExcelを読み取り専用で開くVBAは?
Excel(エクセル)
-
-
4
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
5
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
6
Excel VBAで、複数のシートのセルの列幅を一度に変更する方法は??
Excel(エクセル)
-
7
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
8
Excelvbaの 編集のためロックされています について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTTPSのとき":"が"%3A"ではなく...
-
ASP+アクセスでのSQLコメントに...
-
Vb.netのグローバル変数の宣言...
-
Excel VBA の ChangeFileAccess
-
google apps scriptの終了のさせ方
-
getElementByIdを使用したグロ...
-
二次元配列を使って順位をだす...
-
window.openでタイトル名の指定
-
C#OpenCv V4にのエラーに関する...
-
ジェネレーターの作り方
-
テキストボックスに入力された...
-
リンクの有無を判別して画像の...
-
ASP.NETのコントロールの値をJa...
-
同じIDで定義した要素の配列を...
-
jQuery UIでドラッグ制限
-
ホームページに日付を自動更新...
-
javascriptでテーブルに追加し...
-
JavaScript window.openで開く...
-
ActiveXobjectが作成できない
-
<tbody> スクロール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ボタンをクリックすると数が増...
-
【正規表現】【javascript】CR...
-
同じ型【ハイフンと数字】だけ...
-
ASP+アクセスでのSQLコメントに...
-
HTTPSのとき":"が"%3A"ではなく...
-
サブウインドウから親ウインド...
-
confirmの連続?
-
VC++のちらつき防止方法
-
Boolean型配列中のTrueの有無を...
-
Vb.netのグローバル変数の宣言...
-
コールバック関数(?)をループし...
-
javascriptで文字挿入でtoggle...
-
【Jquery】changeイベント毎にa...
-
ifreamをリロードしたい
-
Excel VBA の ChangeFileAccess
-
MFCのキャプション変更
-
Linux バイナリ実行できない "...
-
-(ハイフン)_(アンダーバー)の...
-
2次元のJSON形式の配列の展開
-
C# .NET DataGridView の行を追...
おすすめ情報