『エクセルを保存した時にHTMLで保存するVBAの作成』(ak)
お世話になります。
エクセルを保存した時に、指定した場所に、HTML形式で保存する、
VBAの作成をするマクロを組んでいます。
そこでエラーになり、自分では解決できないので、解決方法を教えてください。
「'指定フォルダにHTMLで保存 ActiveWorkbook.SaveAs 」と
「'BOOK保存処理 w.Saved = True」で
エラーになっているようです。
不慣れなもので自分なりに勉強しながら作ったのですが、
原因がわからないので、原因と解決方法をご教示願えませんでしょうか。
よろしくお願いいたします。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call START
End Sub
Sub START()
MsgBox "開始"
'指定フォルダにHTMLで保存
On Error GoTo ERMS1
ActiveWorkbook.SaveAs Filename:="C:\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
ERMS1:
MsgBox "ERROR ActiveWorkbook.SaveAs中にエラー発生 ActiveWorkbook.Path = " & ActiveWorkbook.Path
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
'BOOK保存処理
On Error GoTo ERMS2
Dim w As Workbook
For Each w In Workbooks '全ての Book を保存したことにするフラグ (保存処理はしない)
w.Saved = True
Next
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
ERMS2:
MsgBox "Book保存処理中にエラー発生"
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
End Sub
< 使用 Excel:Excel2010、使用 OS:Windows7 >
----
こんにちは
取り敢えず、C:\temp フォルダが有るとして
ActiveWorkbook.SaveAs Filename:="C:\Test.html", 〜
は
ActiveWorkbook.SaveAs Filename:="C:\temp\Test.html", 〜
にしてもダメですか?
(ウッシ) 2016/07/27(水) 14:46
----
On Error GoTo ERMS1
処理1
ERMS1:
エラー処理1
の流れ(処理1終了後にエラー処理を飛ばすことをしていない)だと処理1終了後(エラーがなくても)そのままエラー処理1を実行してしまわないか?
(ねむねむ) 2016/07/27(水) 14:50
----
>不慣れなもので自分なりに勉強しながら作ったのですが
1.On Error の使い方が間違っている。今の書き方ではエラーが在ろうが無かろうが
次のステートメントに進んでしまう。
ヘルプなりWebページなりで基本を理解すべし。
2.そもそも、Workbook_BeforeSaveイベントで実行する必要が本当にあるのか、疑問、
再考の余地がありそう。
>原因と解決方法をご教示願えませんでしょうか。
デバッグの基本、F8によるステップ実行。
(とおりすがり) 2016/07/27(水) 14:55
----
返信ありがとうございます。
ご指摘を受けて、修正してみました。
エラーが発生した場合は、エラーメッセージをセットし
それがあるかどうかでエラー処理をするようにしました。
しかし、デバッグをすると、「ActiveWorkbook.SaveAs」が2回よばれているようです。
1回目のActiveWorkbook.SaveAsまで行った後、
また一番初めの
「Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)」
に戻ってしまいます。
そして、2回目のActiveWorkbook.SaveAsでエラーとなって終了しています。
その時、パスは空になっています。
Dim errStr As String
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call START
End Sub
Sub START()
MsgBox "開始"
errStr = ""
'指定フォルダにHTMLで保存
On Error GoTo ERMS1
ActiveWorkbook.SaveAs Filename:="C:\test\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
ERMS1:
'エラー文字列設定
errStr = "ERROR ActiveWorkbook.SaveAs中にエラー発生"
If errStr <> "" Then
MsgBox "エラー1"
MsgBox errStr & "ActiveWorkbook.Path = " & ActiveWorkbook.Path
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
End If
errStr = ""
'BOOK保存処理
On Error GoTo ERMS2
Dim w As Workbook
For Each w In Workbooks '全ての Book を保存したことにするフラグ (保存処理はしない)
w.Saved = True
Next
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
ERMS2:
'エラー文字列設定
errStr = "Book保存処理中にエラー発生"
If errStr <> "" Then
MsgBox errStr
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
End If
End Sub
(ak) 2016/07/27(水) 15:20
----
こんにちは
エラー処理を書いたコードではなくて、
Sub test()
ActiveWorkbook.SaveAs Filename:="C:\test\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
End Sub
のように一つずつエラーメッセージを確認するのもいいですよ。
既にファイルが存在するとか。アクセス出来ないとか、何故エラーになるのか確かめて、
そのための対応が出来た上でエラー処理を入れていくといいかも。
2回の「ActiveWorkbook.SaveAs」については、
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.EnableEvents = False
Call START
Application.EnableEvents = True
End Sub
としてみるとか。
(ウッシ) 2016/07/27(水) 15:43
----
ありがとうございます。
Sub test()
ActiveWorkbook.SaveAs Filename:="C:\test\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
End Sub
のみで実行すると、エクセル自体が強制終了します。。。
VBAの画面で、上記のソースを貼り付けて、保存ボタンを押した時点です
(ak) 2016/07/27(水) 16:12
----
こんにちは
新規のブックで、上記コードをセットして名前を付けて「test.xlsm」とかで
保存しておいてから実行しましたか?
(ウッシ) 2016/07/27(水) 16:21
----
はい、やはり強制終了されてしまいます。。。。
どうも
ThisWorkbook.Close False 'Book を閉じる
Application.Quit 'Excel を終了する
のどちらかのコードが無いと、エラーになるようです。
(ak) 2016/07/27(水) 16:45
----
こんにちは
本当に、新規ブックですか?
Sub test() 以外に
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
とか他のコードがセットされてたりしませんか?
(ウッシ) 2016/07/27(水) 17:04
----
すみません、Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) の中に書いておりました、
sub test だけで実行すると、ファイルはできましたが、下記の警告メッセージがでます。
「プライバシーに関する注意:このドキュメントには、マクロ、ActiveXコントロール、XML拡張パックの情報、またはWebコンポーネントが含まれています。これらにはドキュメント検査機能で削除する事ができない個人情報が含まれる場合があります。」
(ak) 2016/07/27(水) 17:17
----
こんばんは
プライバシーに関する注意については
http://excel-master.net/miscellaneous-knowledge/notice-about-privacy/
とか、
http://qiita.com/ktyubeshi/items/45e65efb5d056b3d9e34
を参考に対処してもらうとして、
既に、"C:\test\Test.html" が存在した場合は上書きするなら、
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="C:\test\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
Application.DisplayAlerts = True
とします。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
Call START
End Sub
Sub START()
Dim w As Workbook
MsgBox "開始"
'指定フォルダにHTMLで保存
On Error GoTo ERMS1
Application.DisplayAlerts = False
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:="C:\test\Test.html", FileFormat:=xlHtml, ReadOnlyRecommended:=False, CreateBackup:=False
Application.EnableEvents = True
Application.DisplayAlerts = True
For Each w In Workbooks '全ての Book を保存したことにするフラグ (保存処理はしない)
w.Saved = True
Next
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
Exit Sub
ERMS1:
MsgBox Err.Description & "ActiveWorkbook.Path = " & ActiveWorkbook.Path
Application.EnableEvents = False
ThisWorkbook.Save
Application.EnableEvents = True
Application.Quit 'Excel を終了する
ThisWorkbook.Close False 'Book を閉じる
End Sub
こんな感じにしておいて、どんなエラーが発生するか調べて下さい。
コードをセットしてマクロブックを保存する場合は
Workbook_BeforeSave内のCancel = Trueを選択してF9でブレークポイント
を設定してから保存実行してブレークしたら、黄色矢印をEnd Sub まで
ドラッグしてCall STARTをスキップして下さい。
(ウッシ) 2016/07/28(木) 00:32
----
度々ご教示頂きありがとうございます。
エラーは発生しないのですが、
元のエクセルファイルが、更新されないままHTMLで保存されてしまいます。
上司と相談した結果、別の方法を探すことになりそうです。
お時間を頂きまして申し訳ありませんでした。
(ak) 2016/07/28(木) 13:34