• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL 共有Bookにマクロを組み動作させると不具合が起こる)

EXCEL共有Bookにマクロを組み動作させると不具合が起こる

このQ&Aのポイント
  • EXCELの共有bookにマクロを組んでいます。マクロはPrivate Sub Worksheet_Change(ByVal Target As Range)でセルに入力されると自動的に他のマクロが走り保存する使用で、4名~10名で頻繁に変更されます。その際に突然EXCELファイルの拡張子が『XLS』から『xls~RF******.tmp 』と変わってしまいます。
  • 保存しようとしても既に元の『XLS』ファイルと拡張子が変わっているため関連性がなくなり保存できなくなります。その後全ての人に一旦共有ファイルを閉じてもらい再度立ち上げると、ファイルがロックされています解除するか?などと質問してきて『はい』を選び再度保存をかけて初めて使用できるようになります。
  • マクロをあまり組んでいないファイルではこのような事は発生しません。どなたか経験のある方はいらっしゃいますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.3

はい。訂正のコードをActiveworkbook.Saveに置き換えて使用して下さい。 ブックのパスはThisWorkbook.path & "\" & ThisWorkbook.Nameで得られる文字列になります。 リスクとしては、保存中はファイルの属性が隠しファイルとなるので Windowsの設定で隠しファイルを表示できる設定にしておかないと、 そのブックがあるフォルダをエクスプローラで参照したときに、ファイルが消えたり現れたりするように見えるところでしょうか。 この点が無理なら、"現在は保存中だよ"という意味を示す一時ファイルを作って、同じように一時ファイルが存在する間は保存しないというループを回すとかですかね。 変更を入れるたびにリアルタイムに反映したいという意向からこのような動作をさせていると思います。 私はそれほど知識がありませんが、Accessを使ってデータベースファイル(mdb)に対して随時書き込みを行うと同じような運用が可能かと思います。 色々勝手が違うと思いますけどね。

FUKUYAMA28
質問者

お礼

ご親切にありがとうございます。Activeworkbook.Saveに置き換えるとうまく保存できています。しかし自宅PCはスタンドアロンのため共有での試験が行えていません。現在EXCELファイルが完成次第試してみたいと思います。連日初心者の私にお付き合いくださいまして本当にありがとうございました。

その他の回答 (2)

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

訂正です。自ブックの名前を変更するのは無理でしたね。。。 保存中は属性を隠しファイルに変更して、他のブックは そのブックが隠しファイルである間はWaitするという手段の方がいいかもしれません。 Do 'ブックが隠しファイルである間はWaitする If (GetAttr(ブックのパス) And vbHidden) <> vbHidden Then Exit Do End If Loop '隠しファイルにする SetAttr ブックのパス, vbHidden   '保存する ThisWorkbook.Save '保存が終わったら普通のファイルに戻す SetAttr ブックのパス, vbNormal

FUKUYAMA28
質問者

補足

ご回答ありがとうございます。ご察しの通り本日も保存の際に発生してしまいました。他の人とタイミングが合うと必ず発生してしまいます。質問ですが訂正のマクロは『ActiveWorkbook.Save』で単純にSaveを行っているのですが、その命令文の部分に置き換えて使用したらいいのでしょうか?(マクロはいつもブロクなどを確認して、親切にお答えいただいている方のマクロを参考に作成しているため基本的な部分もあまり理解できていない初心者です。)

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.1

その現象に経験があるわけではありませんが・・・推測です。 デッドロックが発生しているのでしょう。 共有ブックではその辺を考慮して保存してくれるのかもしれませんが、 VBAによるブックの保存ではロック状態を考慮できないのかもしれません。 (エクセルで普通に上書き保存するときは一時ファイルを作るのに対し、Saveメソッドで保存すると一時ファイルは作らないみたいですしね。) マクロがたくさんあるブックに限って起こるのはよくわかりませんが・・・ この場合は、事前にロックされているかを確認できればいいと思います。 Saveメソッド実行前に、Nameステートメントで名前を変えてみるという手があります。 Nameステートメントは名前を変更できないとエラーが返ってきますので、 On Errorで飛ばして名前変更が成功するまでResumeすればロックの状態を調べることができるかなと思います。 On Error Goto NameErr Name ブックのパス as ブックのパス '同じ名前に変更してみる On Error goto 0 ブック.Save exit sub :NameErr resume end sub この方法では完全にデッドロックを0にできるわけではないかもしれませんがね・・・ お試しください m(_ _)m

関連するQ&A