アプリ版:「スタンプのみでお礼する」機能のリリースについて

ActiveWorkbook.SaveAs FileName:=MyPath, FileFormat:=xlCSV, CreateBackup:=False

というコードで、BookをCSVファイルとして保存しています。
保存時に同名のファイルがあった場合、「置き換えますか?」のメッセージが表示されます。
ここで「いいえ」を選択するとエラーが出て止まってしまいます。
止まるのを回避するために、
On Error Resume Next
On Error GoTo 0
でSaveAsの文を挟みました。

現在、上記コードの続きに、、
MsgBox "保存しました"
と書いているため、保存しなかった場合にも「保存しました」と表示してしまいます。
これを避け、
「置き換えますか?」に対して「はい」を選択した場合にのみ「保存しました」とメッセージを表示したいです。
(「いいえ」「キャンセル」を選択した場合は「保存しませんでした」と表示したいです)
可能でしょうか。
予めDir関数でファイルを検索して、自分で「上書きorキャンセル」のメッセージを作成するしかないのでしょうか。
慣れていないのでできればDir関数は使いたくないのですが…。

A 回答 (3件)

エラーが発生すると、Errorというシステム変数にエラーの内容が残ります


(エラーが無い時は nul="")
ただし、エラーの直後しか残っていませんので
SaveAs の直後に er=Error とでもしておいて、
MsgBox "保存しました" の前に

if er="" then
  MsgBox "保存しました"
else
  MsgBox "保存しません"
endif

等としてはどうでしょうか
    • good
    • 0
この回答へのお礼

回答ありがとうございます、返信が遅れて申し訳ありません。

巧くいきました!
エラー時に「Error」にどんなものが入るのかわからなかったので「er」の変数型に迷いましたが、
なんとかなりました。

ありがとうございます。

お礼日時:2007/06/25 10:24

#2 です。



単に、以下のようにしても良いと思いますね。

ただし、同名ファイルがあった時に、「いいえ」の次に、「キャンセル」をクリックする必要があります。


Sub TestSaveAs2()
  Dim MyPath As String
  Dim Ret As Variant
  MyPath = ActiveWorkbook.Name
  
  If Dir(MyPath) <> "" Then
    With Application.Dialogs(xlDialogSaveAs)
      Ret = .Show(MyPath)
    End With
    If Ret = False Then
      MsgBox "保存はしませんでした。", vbInformation
    Else
      MsgBox "保存しました。"
    End If
  
  Else
    
    ActiveWorkbook.SaveAs Filename:=MyPath, _
    FileFormat:=xlCSV, _
    CreateBackup:=False
    MsgBox "保存しました。"
  
  End If
End Sub
  
    • good
    • 0
この回答へのお礼

わざわざ別の案も、ありがとうございます。
でも見た目、#2のコードの方がとっつきやすいそうに感じました(あくまで見た目ですが)。

お礼日時:2007/06/25 10:33

こんにちは。



>予めDir関数でファイルを検索して、自分で「上書きorキャンセル」のメッセージを作成するしかないのでしょうか。
>慣れていないのでできればDir関数は使いたくないのですが…。

それは、エラーではありませんから、エラートラップしてもしょうがないと思いますね。
慣れていなければ、慣れるまでしょうがないと思います。
最初は、誰も同じです。

---------------------------------------------

Sub TestSaveAs()
  Dim MyPath As String
  Dim intRet As Integer
  Dim Ret As Variant
  
  MyPath = ActiveWorkbook.Name 'ファイル名
  
  If Dir(MyPath) <> "" Then
    intRet = MsgBox("置き換えますか?", vbYesNoCancel)
    If intRet = vbYes Then
      Application.DisplayAlerts = False
      
      ActiveWorkbook.SaveAs Filename:=MyPath, _
      FileFormat:=xlCSV, _
      CreateBackup:=False
      MsgBox "保存しました。"
      Application.DisplayAlerts = True
    
    ElseIf intRet = vbNo Then
      With Application.Dialogs(xlDialogSaveAs)
      Ret = .Show(MyPath)
      End With
      If Ret = False Then
       MsgBox "保存はしませんでした。", vbInformation
      Else
       MsgBox "保存しました。"
      End If
    Else
      MsgBox "保存はしませんでした。", vbInformation
    End If
  Else
    ActiveWorkbook.SaveAs Filename:=MyPath, _
    FileFormat:=xlCSV, _
    CreateBackup:=False
    MsgBox "保存しました。"
  End If
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます、返信が遅れて申し訳ありません。

>>予めDir関数でファイルを検索して、自分で「上書きorキャンセル」のメッセージを作成するしかないのでしょうか。
>それは、エラーではありませんから、エラートラップしてもしょうがないと思いますね。

はい、エラートラップを使わずに、という意味でした。

vbYesNoCancelという部分で、メッセージボックスに選択肢を持たせるみたいですね!
今回の件に関しては#1の方のコードを使わせてもらいましたが、
コレ(vbYesNoCancel)は非常に使えそうです。
コード解析させてもらって、是非使って生きたいと思います。
とりあえず「intRet = MsgBox("置き換えますか?", vbYesNoCancel)」だけ突っ込んでみたところ、
あっさり3つの選択肢が出て感動です。

ありがとうございました。

お礼日時:2007/06/25 10:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!