[[20200407143412]] 『同名のファイルがある場合は上書き保存をしたい』(ゆー) ページの最後に飛ぶ

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

 

『同名のファイルがある場合は上書き保存をしたい』(ゆー)

 原本から名前を付けて保存をするボタンを設置しています。

 同じファイル名がある場合は「同名ファイルが存在します。上書き保存を実行しますか?」とメッセージボックスを出したいです。
 (今の状態だと「この場所に〜」で"いいえ"を選択した場合実行時エラーが出てしまうため)

 色々なサイトを見ながら名前を付けて保存までは作成してみましたが、
 フォルダ内に同名ファイルがあるかの判定→上書き保存の方法がわかりません。
 初心者ですので、解説いただきながら教えていただけないでしょうか?
 また、わかりやすいサイトをご教示いただけないでしょうか?

 Sub 名前を付けて保存()
     If MsgBox(Range("H21").Value & vbCrLf & "↑この現場名で保存しますか?", vbQuestion + vbOKCancel) = vbCancel Then
         MsgBox "正しい現場名を入力してください"
         Range("H21").Select
     Exit Sub
     End If
         ActiveWorkbook.SaveAs "C:\○○\請求書\" & Range("A1") & ".xlsm"
         MsgBox Range("A1").Value & vbCrLf & "   ↑が保存されました。"
 End Sub

 A1にはファイルの名前を指定するために下記の関数を入力しています。
 ="〇〇請求書 "&CU9&"・"&CU12&"月・"&H21
 H21→現場名
 CU9・CU12→年と月が入力しています。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


Excelのもとの仕様で、同名ファイルがある場合は
「この場所に〜.xlsmという名前のファイルが既にあります。置き換えますか?」
と、警告メッセージがでませんか?
(えく) 2020/04/07(火) 15:52

えく様
「この場所に〜.xlsmという名前のファイルが既にあります。置き換えますか?」と、警告メッセージがでませんか?

表示されます。

 >(今の状態だと「この場所に〜」で"いいえ"を選択した場合実行時エラーが出てしまうため)
実行時エラー'1004'
'(ファイル名).xlsm'にアクセスできません。
と表示されてしまうのを防ぎたいと思い質問いたしました。
(ゆー) 2020/04/07(火) 16:09

ああ、いいえ押すとSaveAsメソッドに失敗してエラーはくんですね

回避する方法として2通りあるかと思います

1.保存するフォルダ内を、該当のファイル名があるかどうかを調べる
2.エラーを無視する

1.の場合は結構めんどうです
個人的には2.をおすすめです

SaveAsメソッドの前にOn Error Resume Nextを入れて、エラーを無視します

 On Error Resume Next
 ActiveWorkbook.SaveAs "C:\○○\請求書\" & Range("A1") & ".xlsm"

http://officetanaka.net/excel/vba/file/file09.htm
上記サイトを参考にしてみてください

ただ、On Error Resume Nextはむやみやたらに使うものではないので注意が必要です
(本当はエラーを出すべきところを、出さないまま処理を続けてしまうだとか・・)

(えく) 2020/04/07(火) 16:19


えく様

参考のサイトありがとうございます。
1.は自分にはまだまだ早いですね…(ちんぷんかんぷんでした)

On Error Resume Nextを入れたところエラーは出なくなりました!
ですが、「いいえ」「キャンセル」を選択した場合でも
MsgBox Range("A1").Value & vbCrLf & "   ↑が保存されました。"
が表示されてしまいます。
どのように変更すればいいのでしょうか?
(ゆー) 2020/04/07(火) 16:34


個人的にはそのメッセージ必要ない気もしますが

 On Error Resume Next
 ActiveWorkbook.SaveAs "C:\○○\請求書\" & Range("A1") & ".xlsm"
 If Err.Number = 0 Then
    MsgBox Range("A1").Value & vbCrLf & "   ↑が保存されました。"
 End If

でいけませんか
Err.Numberで、エラーの番号を確認して0のときはエラーが発生していない
逆に言えば0以外であればエラーが発生していると考え
0のときに完了メッセージを表示するようにしています

今回だと、Err.Numberにはいいえを選択した際に1004が入ってくると思います
(実行時エラー'1004')
(えく) 2020/04/07(火) 16:56


えく様

ありがとうございます!
ばっちりいけました!

イミディエイトウインドウでいいえを選択した場合Err.Numberが1004になるのを確認できました。
わかりやすい説明をありがとうございます。
On Error Resume Nextはもっと理解が進んでから他のものに使えそうなら使用したいと思います。

メッセージは実際に操作している人が私よりもめちゃくちゃパソコンに疎いため
保存した"感"を出すために付けています(笑)
(ゆー) 2020/04/07(火) 17:27


 >On Error Resume Next
 このあたりを読めばイメージできるかな?
 VBS の記事だけど、考え方としてはそう変わらない・・・はず。

 On Error Resume Nextの正しい使い方
http://scripting.cocolog-nifty.com/blog/2006/12/on_error_resume_d841.html

 システム管理を自動化するVBScriptの典型的な4つのエラーと解決法
https://xtech.nikkei.com/it/article/Windows/20060201/228370/?P=3

 1ページ目には「変数宣言の強制」についても書いてあります。

 「ASP/VBScriptの処理がメモリリークを起こして暴走」した話。
 On Error Resume NextをASP/VBScriptで使うときの注意
http://lightningsheep.sblo.jp/article/45697252.html

(2u) 2020/04/07(火) 20:44


 2u様

 参考のサイトありがとうございます。

 「エラーがあっても無視して、どうなってもいいから暴走しろ」この一文に震えてしまいました…
 一見エラーが出ても次の作業にいけるので便利に見えるけれどもどこが不具合を起こしているかわからないということですね。
 On Errorはちゃんと種類(?)と機能を理解した上で使わないと後々に大変なことになりそうですね。
 一つのステートメントにとっても奥が深くて沼に嵌りそうです。。。

 教えていただいたサイトの内容を理解できるようにがんばります。
(ゆー) 2020/04/08(水) 11:57

コメント返信:

[ 一覧(最新更新順) ]


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