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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/10 14:24
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) Excelのマクロ ブック間である範囲をコピー Workbooks(“a.xlsx“).Sheets 3 2022/05/12 17:02
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
読み取り専用で開いているエクセルを編集モードに変更したい
Excel(エクセル)
-
読み取り専用ファイルを上書き保存するには?
Visual Basic(VBA)
-
Excelvbaの 編集のためロックされています について
Excel(エクセル)
-
-
4
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
名前をつけて保存した後、元のファイルに戻るには
その他(コンピューター・テクノロジー)
-
7
ブックをCloseまたはQuitで閉じると他のユーザーフォームが消えてしまう。
Excel(エクセル)
-
8
Excelで更新日時と更新者を表示させる
Excel(エクセル)
-
9
VBAでブック保護非保護を判定するには?
Excel(エクセル)
-
10
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
11
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
12
【Excel VBA】指定行以降をクリアするには?
Visual Basic(VBA)
-
13
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
14
VBAのFind関数で結合セルを検索するとヒットしない
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Linux バイナリ実行できない "...
-
Excel VBA の ChangeFileAccess
-
Vb.netのグローバル変数の宣言...
-
「オブジェクトが必要です。」...
-
アンカーリンクをクリックさせ...
-
awk内でsystem関数を使用しfunc...
-
VC++のちらつき防止方法
-
HTTPSのとき":"が"%3A"ではなく...
-
【Jquery】changeイベント毎にa...
-
ボタンをクリックすると数が増...
-
ASP+アクセスでのSQLコメントに...
-
ifreamをリロードしたい
-
C# .NET DataGridView の行を追...
-
同じ型【ハイフンと数字】だけ...
-
正規表現で半角数字1桁のみを全...
-
onclick指定関数の引数へローカ...
-
ActiveXobjectが作成できない
-
JavaScript window.openで開く...
-
C#テキストボックスの文字を配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【正規表現】【javascript】CR...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Boolean型配列中のTrueの有無を...
-
Excel VBA の ChangeFileAccess
-
【Jquery】changeイベント毎にa...
-
Vb.netのグローバル変数の宣言...
-
static constメンバ変数(配列)...
-
同じ型【ハイフンと数字】だけ...
-
class指定したHTML要素の背景色...
-
onclick指定関数の引数へローカ...
-
ボタンをクリックすると数が増...
-
HTTPSのとき":"が"%3A"ではなく...
-
「オブジェクトが必要です。」...
-
MFCのキャプション変更
-
ページ離脱時のalertボタンで処...
-
アンカーリンクをクリックさせ...
-
VC++のちらつき防止方法
-
C# .NET DataGridView の行を追...
-
2次元のJSON形式の配列の展開
おすすめ情報