みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA Workbook_BeforeSaveについて

教えて下さい!
会社のホームページにある情報を公開していて、その中に更新時間も載せております。その公開している文章はEXCELを利用しHTMファイルで保存しております。ファイルは社内の共有ファイルサーバーに保存されており、複数にて共有しています。そのEXCEL HTMファイルを編集し、(上書き)保存をした際、その時の時間を更新日時としてあるセルに表示させております。自身でVBAを以下の組みました。
(保存前処理の他、開いた時の列幅処理+前回更新日時の表示も行っています)

Option Explicit
---------------------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim KOUSHINBI As Date
KOUSHINBI = Now
Range("E2").Value = KOUSHINBI

End Sub
---------------------------------------------------------------
Private Sub Workbook_Open()
MSGDISP '前回更新時間の表示
Dim TODAY As Date, KOUSHIN As Date
KOUSHIN = DateValue(Range("E2").Value)
TODAY = Date

If KOUSHIN <> TODAY Then
Columns("B:D").ColumnWidth = 0
End If
End Sub
--------------------------------------------------------
'以下標準モジュールで

Sub MSGDISP()
Dim A As Date
A = Worksheets("DAILY").Range("E2").Value
MsgBox ("前回の更新日時は" & A & "です")

End Sub
---------------------------------------------
もちろん、 Workbook_BeforeSaveと Workbook_Openは「THIS WORKBOOK」モジュールに記載しております。
これを実行すると、BOOK OPENの処理は行われるのですが、保存時の更新日時の処理が全く起きてくれません。
新規でEXCELを作成し、Workbook_BeforeSaveのみの処理を記述すると上手く処理が行われます。何が原因なのでしょうか??

投稿日時 - 2009-11-27 15:48:11

QNo.5480052

すぐに回答ほしいです

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

Excelでhtmファイルを編集している時の現象ですよね。こちらでは同現象が再現できません。
新規Book(.htm)にWorkbook_BeforeSaveと Workbook_Open だけ記載して『手動保存』してみてください。
それでもBeforeSaveイベントは発生しないのでしょうか?
.xlsファイルの場合はどうでしょう。
_BeforeSaveプロシージャにブレイクポイントを設定してもそこを通らないのでしょうか?

新規BookでもBeforeSaveイベントが起きない場合、
念のためExcelをセーフモードで起動して試してみてください。

#ウィンドウズメニューから[ファイル名を指定して実行]
excel /s

セーフモード、新規Bookで問題ないなら、
・他のイベントプロシージャが関係している。
・他のアドインやマクロブックが影響している。
・(これは無いと思いますがイベントプロシージャ名の記入ミス。コードペイン上部のドロップダウンリストから選択してます?)

投稿日時 - 2009-11-30 13:03:04

補足

返事が遅くなりまして大変申し訳ありませんでした。
また、回答いただきましてありがとうございます。
まず、新規Book(.htm)でも同様の現象が起きておりました。
ブレイクポイントを設定しても全くかすりもしませんでした。

Excelをセーフモードで立ち上げる前にアドインを全て取り外してみました。そうしましたら全てが上手く処理出来る様になってしまいました。
ローカルでも共有ファイルサーバー上でも上手く動いています。
さらに、その後に取り外したアドインを組み入れても処理されるようになりました。
いったい何だったんでしょう??

投稿日時 - 2009-12-02 13:44:50

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>いったい何だったんでしょう??

特にエラーが出るわけでもなく、BeforeSaveイベントが起きないという現象だったのですよね。
アドインが関係していたとしても、『その後に取り外したアドインを組み入れても処理されるようになりました。』との事ですし、
私自身、同事象に遭遇した事はありませんので原因は解りかねます。

取り敢えず、不具合が解消したようで良かったですね。

本ケースのような、通常では発生しないはずの不具合の場合、まずはどのレベルで障害が発生しているかの見極めが必要だという事なのでしょう。
・特定Bookでの現象か。     …新規Bookで確認してみる。
・特定ユーザー環境での現象か。 …セーフモードあるいは別ユーザーでログインして確認してみる。
・特定端末での環境か。     …(可能なら)別端末で確認してみる。
など。(OSやOfficeのバージョン差異やネットワーク環境が絡めばもっと複雑になるでしょうけど)
そういった誘導的なアドバイスができれば、もうちょっと早く解消できたかもしれなかったですね。失礼しました。

投稿日時 - 2009-12-02 20:35:00

お礼

end-uさん、本当にありがとうございました。

>そういった誘導的なアドバイスができれば、もうちょっと早く解消できたかもしれなかったですね。失礼しました。

そんなとんでもないですよ。色々な段階のエラー解消法を教えてくれたので、解決に向かうことが出来たのですから。
今度不具合が出たら同様の手順で調べてみます。

今日もきちんと動作しており、ホッとしております。
ホントにありがとうございました。

投稿日時 - 2009-12-03 13:06:31

ANo.1

Worksheetは1つしかないのでしょうか?
そのThisWorkbookモジュールのコードではRangeの親が指定されていないので、その時のActiveSheetになってしまいますが、
その点は大丈夫ですか?

また、開いた時に最終保存日時を取れば良いだけのような気もしますが、どうなのでしょう。
Private Sub Workbook_Open()
  MsgBox ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
End Sub

投稿日時 - 2009-11-27 19:39:50

補足

ご回答ありがとうございます。

savaを記載しているモジュール以外にはsheetの指定をしておりますが、実際の運用は1book-1sheetですので大丈夫かと…。
sheet指定していたりしてなかったり、気まぐれな作りになってしまってましてスミマセン。。。
ちなみに、sheet指定の記載も試しては見ましたが、同じ動きです。

>また、開いた時に最終保存日時を取れば良いだけのような気もしますが、どうなのでしょう。
とコードを記載していただきましてありがとうございました。
しかしながら、ご提案の開いた際に最終保存日時の取得ではホームページに公開する際に、前回の更新日時をお知らせすることになってしまいますので適用できないのです。。。
いただいたコードはMsgBoxですから編集者に対しての確認メッセージになっているみたいですが、私が書いているSub MSGDISP()もきちんと動作はしております。(これはおまけみたいなものですけど…)

投稿日時 - 2009-11-28 16:29:42

あなたにオススメの質問