こんにちは。
マクロのエクセルファイルを操作し、セーブ時に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
No.2ベストアンサー
- 回答日時:
>、.xlsmから.txtを記録するとともに
今は、Excel 2007 では試していません。本来、別ファイルの保存のためなら、Application.EnableEvents = False は、必要ないはずです。以下は、プロシージャを二つに分ける必要はないけれども、加工しやすさのために分けました。
'-------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim dir_Curr As String
Dim file_Curr As String
Dim flg As Boolean
dir_Curr = ThisWorkbook.Path
file_Curr = dir_Curr & "\test.txt"
On Error GoTo ErrHandler
If Dir(file_Curr) = "" Then
Call CSVFileSaving(file_Curr)
flg = True
End If
ErrHandler:
If Err.Number > 0 Then
MsgBox Err.Number & ": " & Err.Description
ElseIf flg Then
MsgBox "Saved safely", vbInformation
Else
MsgBox "Cancelled saving", vbExclamation
End If
End Sub
Sub CSVFileSaving(fileName As String)
ActiveSheet.Copy
With ActiveWorkbook
.SaveAs fileName:=fileName, FileFormat:=xlCSV, Local:=True ' 'xlTextWindows
.Close False
End With
End Sub
No.1
- 回答日時:
イベントの連鎖は,イベントの中で行おうとしている保存(saveas)の動作がまたイベントをトリガすることで発生します。
もう一つの見落としは,before_saveイベントは「保存する前に起動するアクション」です。つまり無事イベントプロシジャを抜けると,今度は本来の「本番の保存の動作」が続いて起こります。
従って対処として,
1.まず少なくとも cancel = true を忘れず書いて,「本番の保存」はキャンセルする
2.イベント内部でのトリガアクションに先立って,イベントを起動させないよう抑制する
private sub workbook_beforesave(…
dim …
(中略)
application.enableevents = false
activeworkbook.saveas 何某
application.enableevents = true
(後略)
end sub
若しくは
3.イベントの中で「保存しない」で,何か別の対処を探る?
この回答への補足
keithinさま。
ありがとうございます。
1番と2番の方針をとって全ては解決…のように見えました。
しかし、.xlsmから.txtを記録するとともに、普通に.xlsmファイルも
セーブしたかったので、Cancel = Trueをコメントアウトすると、同じく連鎖が出てしまいました。
イベント内部でのトリガーアクションはおさえたので、「本番の保存」も一度きりのはずなのに、なぜ連鎖が出るのでしょうか?対処方法をご教授いただけると幸いです。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim dir_curr As String
Dim file_curr As String
Dim msg As String
dir_curr = ThisWorkbook.Path
file_curr = ThisWorkbook.Path & "\test.txt"
' Cancel = True ' ←これを実行すると問題ないのですが…
Application.EnableEvents = False
ActiveWorkbook.SaveAs _
Filename:=file_curr, _
FileFormat:=xlCSV, Local:=True
Application.EnableEvents = True
msg = "saved"
MsgBox msg
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「6月まで」というのは6月以内...
-
月の最後の週の呼び名は?
-
8月までっていつまでのことでし...
-
10月をもって辞めるって、10...
-
昔の愛称?「~の字」
-
日本の陰暦(旧暦)にあった「1...
-
総会の年度表記について
-
満何歳の意味
-
「おじろく」は長男が死んだら...
-
自治会の通常総会の年度について
-
昔は何歳くらいからお酒を飲ん...
-
一ヶ月前、一ヶ月後
-
きょうだいは誕生月が近いの法...
-
カレンダーの日付 5/Bの意味に...
-
暦の世界統一はいつから
-
エクセルのフィルターを複数シ...
-
今は何年度ですか?
-
Excelで作成しているシート(表)
-
「なんで付き合おうと思ったか...
-
なぜ、「血」の繋がりと言うのか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自治会の通常総会の年度について
-
総会の年度表記について
-
確認ですが普通5月までに決める...
-
カレンダーの日付 5/Bの意味に...
-
「6月まで」というのは6月以内...
-
10月をもって辞めるって、10...
-
8月までっていつまでのことでし...
-
満何歳の意味
-
月の最後の週の呼び名は?
-
エクセルのフィルターを複数シ...
-
今は何年度ですか?
-
昔の愛称?「~の字」
-
入社が2月1日とした場合、3ヶ月...
-
「1年以上」の定義について
-
○年後の3月末日を関数で出したい
-
学校の在籍機関
-
一ヶ月前、一ヶ月後
-
○月第○週 の数え方について
-
VBAで先月、先々月を求める方法
-
定年になる年度を関数で算出したい
おすすめ情報