[[20160727141937]] 『エクセルを保存した時にHTMLで保存するVBAの作』(ak) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルを保存した時に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


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.