EXCEL VBAのWorkbook_BeforeSaveとWorkbook_Openの処理について

このQ&Aのポイント
  • 会社のホームページの情報を公開するためにEXCELを利用しHTMファイルで保存しています。保存する際に更新時間をセルに表示させるためにVBAを組んでいます。しかし、保存時の更新日時の処理がうまく行われず、原因がわかりません。
  • Workbook_Openの処理はうまく行われるが、Workbook_BeforeSaveの処理がうまく行われない問題が発生しています。新規作成のEXCELファイルでは問題なく処理が行われます。
  • 処理がうまく行われない原因がわかりません。どうすれば解決できるでしょうか?
回答を見る
  • ベストアンサー

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のみの処理を記述すると上手く処理が行われます。何が原因なのでしょうか??

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

Excelでhtmファイルを編集している時の現象ですよね。こちらでは同現象が再現できません。 新規Book(.htm)にWorkbook_BeforeSaveと Workbook_Open だけ記載して『手動保存』してみてください。 それでもBeforeSaveイベントは発生しないのでしょうか? .xlsファイルの場合はどうでしょう。 _BeforeSaveプロシージャにブレイクポイントを設定してもそこを通らないのでしょうか? 新規BookでもBeforeSaveイベントが起きない場合、 念のためExcelをセーフモードで起動して試してみてください。 #ウィンドウズメニューから[ファイル名を指定して実行] excel /s セーフモード、新規Bookで問題ないなら、 ・他のイベントプロシージャが関係している。 ・他のアドインやマクロブックが影響している。 ・(これは無いと思いますがイベントプロシージャ名の記入ミス。コードペイン上部のドロップダウンリストから選択してます?)

yumetsuba
質問者

補足

返事が遅くなりまして大変申し訳ありませんでした。 また、回答いただきましてありがとうございます。 まず、新規Book(.htm)でも同様の現象が起きておりました。 ブレイクポイントを設定しても全くかすりもしませんでした。 Excelをセーフモードで立ち上げる前にアドインを全て取り外してみました。そうしましたら全てが上手く処理出来る様になってしまいました。 ローカルでも共有ファイルサーバー上でも上手く動いています。 さらに、その後に取り外したアドインを組み入れても処理されるようになりました。 いったい何だったんでしょう??

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

>いったい何だったんでしょう?? 特にエラーが出るわけでもなく、BeforeSaveイベントが起きないという現象だったのですよね。 アドインが関係していたとしても、『その後に取り外したアドインを組み入れても処理されるようになりました。』との事ですし、 私自身、同事象に遭遇した事はありませんので原因は解りかねます。 取り敢えず、不具合が解消したようで良かったですね。 本ケースのような、通常では発生しないはずの不具合の場合、まずはどのレベルで障害が発生しているかの見極めが必要だという事なのでしょう。 ・特定Bookでの現象か。     …新規Bookで確認してみる。 ・特定ユーザー環境での現象か。 …セーフモードあるいは別ユーザーでログインして確認してみる。 ・特定端末での環境か。     …(可能なら)別端末で確認してみる。 など。(OSやOfficeのバージョン差異やネットワーク環境が絡めばもっと複雑になるでしょうけど) そういった誘導的なアドバイスができれば、もうちょっと早く解消できたかもしれなかったですね。失礼しました。

yumetsuba
質問者

お礼

end-uさん、本当にありがとうございました。 >そういった誘導的なアドバイスができれば、もうちょっと早く解消できたかもしれなかったですね。失礼しました。 ↓ そんなとんでもないですよ。色々な段階のエラー解消法を教えてくれたので、解決に向かうことが出来たのですから。 今度不具合が出たら同様の手順で調べてみます。 今日もきちんと動作しており、ホッとしております。 ホントにありがとうございました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

Worksheetは1つしかないのでしょうか? そのThisWorkbookモジュールのコードではRangeの親が指定されていないので、その時のActiveSheetになってしまいますが、 その点は大丈夫ですか? また、開いた時に最終保存日時を取れば良いだけのような気もしますが、どうなのでしょう。 Private Sub Workbook_Open()   MsgBox ThisWorkbook.BuiltinDocumentProperties("Last Save Time") End Sub

yumetsuba
質問者

補足

ご回答ありがとうございます。 savaを記載しているモジュール以外にはsheetの指定をしておりますが、実際の運用は1book-1sheetですので大丈夫かと…。 sheet指定していたりしてなかったり、気まぐれな作りになってしまってましてスミマセン。。。 ちなみに、sheet指定の記載も試しては見ましたが、同じ動きです。 >また、開いた時に最終保存日時を取れば良いだけのような気もしますが、どうなのでしょう。 とコードを記載していただきましてありがとうございました。 しかしながら、ご提案の開いた際に最終保存日時の取得ではホームページに公開する際に、前回の更新日時をお知らせすることになってしまいますので適用できないのです。。。 いただいたコードはMsgBoxですから編集者に対しての確認メッセージになっているみたいですが、私が書いているSub MSGDISP()もきちんと動作はしております。(これはおまけみたいなものですけど…)

関連するQ&A

  • VBAでWorkbook_BeforeSaveイベントで質問

    Workbook_BeforeSaveイベントである条件に達していればExcelファイルを終了したくないのですがどうすればよいでしょうか? WindowsXP ProSP2、Excel2000 コード例) Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) dim flg as boolean if flg=true then exit sub end if End Sub

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • VBAのWorkbook_BeforeSaveイベントについての疑問

    エクセル2000です。 前にも似たような質問をしたのですが理解ができていません。 ThisWorkbookモジュールに以下の記述をし、終了時保存する場合にはSheet2を表に出すようにしました。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Value = Time() Sheets("Sheet2").Select MsgBox "保存します。" & ActiveSheet.Name Sheets("Sheet1").Range("B65536").End(xlUp).Offset(1).Value = Time() End Sub これで×を押して手動で終了すればそのとおりに働きます。ActiveSheet.Nameも当然Sheet2になります。 ところが、標準モジュールの下記の終了マクロ Sub 終了() ThisWorkbook.Close End Sub で終了しようとすると、A列セルにTime()は記録され、どういうわけかSheet2がSelectされず、MsgBox "保存します。" のメッセージが出て、B列セルにTime()が記録され、保存されます。 ActiveSheet.NameもSheet2ではありません。 つまり、Sheets("Sheet2").Select の部分だけが完全にスキップされてしまうのです。 どうしてでしょうか?

  • EXCEL VBA におけるブック終了後の値の保存方法について

    EXCEL VBAについて質問があります。もしかしたら初歩的なことかもしれませんがよろしくお願いいたします。 まず、 Sub Test() Dim i As String i = InputBox("好きな果物を入力してください") Sheets("Sheet1").Range("A1").Value = i End Sub を実行し、ブックを保存して終了する。 ブックを開く Private Sub Workbook_Open() Dim k As String k = Sheets("Sheet1").Range("A1").Value If k = "みかん" Then MsgBox ("a") Else: MsgBox ("b") End If End Sub この処理を Sheets("Sheet1").Range("A1").Value = i というシート上のセルに値を保存するという方法を取らずに iの値をブック終了後もプロシージャ内に持っておくというのは可能なのでしょうか。 Publicで宣言してもブックを一度閉じると やっぱりiの値は保存されませんでした。 どうぞよろしくお願いいたします。

  • Private Sub Workbook_BeforeSaveについて

    エクセル2000です。 腑に落ちない現象が起きているので質問させてください。 Sheet1にテキストボックス(OLEオブジェクトのTextboxではありません)とボタンが貼ってあり、Visble=Falseで非表示にしています。それを保存する際には表示させたいので、BeforeSaveイベントで Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheet1.TextBoxes("テキスト").Visible = True Sheet1.Buttons("ボタン").Visible = True MsgBox "保存されちゃった!" End Sub と書いてみました。 手動で保存する場合には正しく、テクストボックスやボタンは正しく表示されます。もちろんMsgboxも出ます。 ところが、標準モジュールに書いた以下のコード、 Sub 保存() ActiveWorkbook.Save End Sub を走らせてみても、"保存されちゃった!"と、Msgboxは出ますが、肝心のテクストボックスやボタンが表示されません。 試行錯誤の結果、 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheet1.Shapes("テキスト").Visible = True Sheet1.Shapes("ボタン").Visible = True MsgBox "保存されちゃった!" End Sub と書くと、標準モジュールから、ActiveWorkbook.Saveでも表示されることがわかりました。 どうしてでしょうか?

  • エクセルVBAを教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() Dim d1 As Long Dim d2 As Long Dim ret As Variant Dim FindValue As String Dim TotalAddress As String If Range("E1").Value = "" Or Range("F1").Value = "" Then MsgBox "該当する場所にデータが入っていません。", vbCritical Exit Sub End If d1 = Range("A65536").End(xlUp).Offset(1).Row d2 = Range("B65536").End(xlUp).Offset(1).Row FindValue = """" & Range("E1").Value & Range("F1").Value & """" TotalAddress = Range("A1").Resize(d1).Address & "&" & Range("B1").Resize(d1).Address ret = Evaluate("MATCH(" & FindValue & "," & TotalAddress & ",0)") If IsError(ret) Then Cells(d1, 1) = Range("E1").Value Cells(d2, 2) = Range("F1").Value Else MsgBox "既に同じ組み合せがあります。", vbInformation End If End Sub というものを作ったのですが、E1=18、F1=1及びコマンドボタンを別シートに作成し、上記の表への登録をできるようにしたいのですが、なにかいい方法はありませんか?

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • エクセルVBA

    こんばんは。 いつも拝見しています。初歩的でしょうが私ではまだ 解決できません。ご指導いただきたく思います。 ユーザーフォームにテキストボックスとスピンボタンを設置し日付を 変更するようにしています。ユーザーフォームを開くと今日の日付に 変わってしまいます。C2とリンクしテキストボックスに先に値を 取得するにはどうしたらよいでしょうか。お願します。 Private Sub spnDate_SpinDown() Dim dtDate As Date dtDate = UserForm1.txtDate.Value UserForm1.txtDate.Value = Format(DateAdd("m", -1, dtDate), "yyyy/mm") End Sub Private Sub spnDate_SpinUp() Dim dtDate As Date dtDate = UserForm1.txtDate.Value UserForm1.txtDate.Value = Format(DateAdd("m", 1, dtDate), "yyyy/mm") End Sub Private Sub txtDate_Change() Range("c2") = txtDate.Value End Sub

  • VBAでイベント処理に複数回入ってしまうのを防ぎたい

    こんにちは。 マクロのエクセルファイルを操作し、セーブ時にCSV形式でテクストファイルに書くことを実現しようと思っています。 VBAでイベント処理"BeforeSave"で以下のように書くと、初めに書かれた"test.txt"が同じ処理を行おうとしているようで、そこでも書き込みの処理を行おうとする→無限に書き込みが発生?→エラーの表示が出てきます。これはどういう風に対処すればよろしいのでしょうか? Workbook/BeforeSaveイベント処理: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim file_curr As String Dim msg As String file_curr = ThisWorkbook.Path & "\test.txt" If Dir(file_curr) = "" Then ActiveWorkbook.SaveAs _ Filename:=file_curr, _ FileFormat:=xlCSV, Local:=True msg = "saved" Else msg = "file exist, not saved" End If MsgBox msg End Sub

専門家に質問してみよう