ExcelVBAによる上書き保存時の処理について

このQ&Aのポイント
  • ExcelVBAを使用して上書き保存する際の処理方法について教えてください。
  • 上書き保存時に「いいえ」を選択した場合にファイルの新規保存ダイアログを表示する方法を教えてください。
  • VBAコードを使用してSheet1というシートを上書き保存する際、同名のファイルが存在する場合にどのように処理すれば良いですか?
回答を見る
  • ベストアンサー

ExcelVBAによる 上書き保存時の処理について

ExcelVBAによる 上書き保存時の処理について 先日、作業で使用するエクセルにて下記のようにSheet1というシートを保存するVBAを作成しました。 しかし、格納したいパスに同名のファイルが存在した場合、上書き確認メッセージ上で上書き保存をするか否かを確認するのですが この時、「いいえ」を押下してしまうとそのまま、保存せず処理を終了してしまいます。 私としては、上書き保存を確認する際に「いいえ」を選択するともう一度「ファイルの新規保存」ダイアログを表示し、ファイル名の変更等を行えるようにしたいのですが、どの様にすれば良いのでしょうか? 一応、その時のコードを下記に掲載します。 Sheets("Sheet1").Copy Sheets("Sheet1").Cells.Select SaveName = Application.GetSaveAsFilename(filefilter:="Microsoft Office Excelブック,*.xls") If SaveName <> "False" Then 'キャンセルが押下されたならば、一時保存用のExcelファイルを閉じる If Dir(SaveName) <> "" Then If MsgBox("同名ファイルがあります。上書きしますか?", vbYesNo) = vbNo Then ActiveWorkbook.Close End If End If End If ActiveWorkbook.SaveAs Filename:=SaveName, FileFormat:=xlNormal End

質問者が選んだベストアンサー

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

必要な部分を Do ~ Loopで囲んでやれば良いです。 Do LoopFLG=FALSE SaveName = Application.GetSaveAsFilename(filefilter:="Microsoft Office Excelブック,*.xls") If SaveName <> "False" Then 'キャンセルが押下されたならば、一時保存用のExcelファイルを閉じる If Dir(SaveName) <> "" Then If MsgBox("同名ファイルがあります。上書きしますか?", vbYesNo) = vbNo Then LoopFLG=TRUE End If End If End If Loop Until LoopFLG=TRUE

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

ロジックとしては、上書きしますか?で、「はい」「いいえ」だけで、「ファイル新規保存」が出てきますと、見かけ上の無限ループが、「いいえ」側で発生しますから、「キャンセル」を設けます。 Sub MacroTest1()  Dim SaveName As Variant  Dim Fname As String  Dim ret As VbMsgBoxResult  Const EXT As String = "xls"    Worksheets("Sheet1").Copy    Do   SaveName = Application.GetSaveAsFilename(Fname, "Microsoft Office Excelブック,*.xls")   If VarType(SaveName) = vbBoolean Or SaveName = "" Then    ActiveWorkbook.Close False    Exit Sub   End If   If InStr(1, SaveName, EXT, 1) = 0 Then SaveName = SaveName & "." & EXT   Fname = Dir(SaveName)   If Fname <> "" Then    ret = MsgBox("同名ファイルがあります。上書きしますか?(キャンセルは取りやめ)", vbYesNoCancel)    If ret = vbCancel Then     ActiveWorkbook.Close     Exit Sub    ElseIf ret = vbYes Then     Application.DisplayAlerts = False     ActiveWorkbook.SaveAs Filename:=SaveName, FileFormat:=xlNormal     Application.DisplayAlerts = False     ActiveWorkbook.Close True     Exit Sub    End If   End If  Loop While Fname <> ""  ActiveWorkbook.SaveAs Filename:=SaveName, FileFormat:=xlNormal  ActiveWorkbook.Close End Sub

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

まぁ,GoTo制御はダメとは言われますが。 Sub macro1()  Dim SaveName As Variant  Worksheets("Sheet1").Copy roopStart:  savename = Application.GetSaveAsFilename(filefilter:="Microsoft Office Excelブック,*.xls")  If savename = False Then   ActiveWorkbook.Close False   Exit Sub  End If  If Dir(savename) <> "" Then   If MsgBox("同名ファイルがあります。上書きしますか?", vbYesNo) = vbNo Then GoTo roopStart  End If  Application.DisplayAlerts = False  ActiveWorkbook.SaveAs Filename:=savename, FileFormat:=xlNormal  Application.DisplayAlerts = True End Sub

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

訂正です Loop Until LoopFLG=TRUE ↓ Loop While LoopFLG=TRUE

関連するQ&A

  • シートだけを保存したいのですが?

    はじめましてマクロ初心者です。 検索しましたがわからなかったので、質問させていただきます。 保存をキャンセルすると新規ブックができてしまいます。 キャンセルした時に新規ブックを作りたくないのですが、教えてください。 Sub シート保存() Dim Answer3 Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant Answer3 = MsgBox("本当に保存しますか?", vbYesNo) If Answer3 = vbYes Then Sheets("保存シート").Select Application.CutCopyMode = False Sheets("保存シート").Copy Else MsgBox ("キャンセルしました。") End If 既定ファイル名 = Range("V8") 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名) If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Else ActiveWorkbook.SaveCopyAs 保存ファイル名 End If End Sub よろしくお願いします。

  • VBAでも新規ファイル作成

    Excel2003です。 下記のコードであるシートを別ファイルにして保存するコードを書いています。ただ、このコードでは、コピー元のシートにExcel関数が入っているために、出来上がった新規ファイルを開くときに常に”リンクの更新”を聞かれてしまいます。リンクの更新をする必要はないのでファイルを開くたびに”更新しない”を選択してもよいのですが、初めからこの”リンクの更新”メッセージが出ないようにするには何か良い手立てはないでしょうか? ------------------------------------------------------------- Sub ファイル作成() '報告書を"名前を付けて保存" Sheets("Sheet1").Select Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant 既定ファイル名 = "新規報告書" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel ブック(*.xls),*.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Sheets("Sheet1").Select Else With ThisWorkbook.ActiveSheet Workbooks.Add .Copy After:=ActiveWorkbook.Sheets(1) Application.DisplayAlerts = False ActiveWorkbook.Sheets(1).Delete Application.DisplayAlerts = True ActiveWorkbook.SaveAs 保存ファイル名, xlNormal ActiveWorkbook.Close False End With Sheets("Sheet1").Select End If End Sub ---------------------------------------------------------------

  • (VBA)特定のシートのみを名前を付けて保存

    Excel2003です。 数シートあるうちの特定のシートのみを別のbookとして「名前を付けて保存」する下記のコードを書きました。一応うまく動くのですが、実はこの特定のシートには行の非表示部分があります。しかし、下記のコードではもちろん非表示部分も開かれた状態で保存がされますよね。 この非表示の状態で保存するにはどのようにすればよいのでしょうか? 【以下現在のコードです】 ------------------------------------------------ Sub 名前を付けて保存() '報告書を"名前を付けて保存" Sheets("報告書").Select Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant 既定ファイル名 = "報告書" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel ブック(*.xls),*.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Else With ThisWorkbook.ActiveSheet Workbooks.Add .Cells.Copy ActiveSheet.Range("A1") ActiveWorkbook.SaveAs 保存ファイル名, xlNormal ActiveWorkbook.Close False End With Sheets("報告書").Select Range("A1").Select MsgBox "報告書を作成しました。" End If End Sub ----------------------------------------------------

  • OSがVistaのエクセル2007で作ったファイルがXpのエクセル2003で読み取れない

    すいません。教えてください。 Vista PCエクセル2007で保存したファイルが、XP PCエクセル2003で見ると文字化けしてしまうのですが、どこがいけないのか教えてください。 Sub 保存シートの名前を付けて保存() ' シート保存 Macro '***このマクロは見積もり番号と件名を保存ファイル名にし保存します。*** Dim Answer3 Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant Answer3 = MsgBox("本当に保存しますか?", vbYesNo) If Answer3 = vbNo Then MsgBox ("キャンセルしました。") Exit Sub End If Sheets("保存シート").Select Application.CutCopyMode = False Sheets("保存シート").Copy 既定ファイル名 = Range("V7") 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel 97-2003ブック, *.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" ActiveWorkbook.Close (False) Else ActiveWorkbook.SaveCopyAs 保存ファイル名 ActiveWorkbook.Close (False) End If End Sub よろしくお願いします。

  • 読み取り専用ファイルを上書き保存するには?

    作業中は常に読み取り専用状態にしておき、保存の時にだけ読み取り専用の属性を解除して 上書き保存し、上書き保存が終了次第、即座に読み取り専用状態に戻す運用を考えております。 (1)ThisWorkbookのOpenプロシージャでファイルを読み取り専用状態に設定 (2)ThisWorkbookのBeforeSaveプロシージャで    読み取り専用を解除→上書き保存→読み取り専用状態に再設定    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)      '上書き保存モードを解除      Cancel = True      '上書きしますか?のコメントを非表示に設定      ActiveWorkbook.Saved = True      'ファイルが読み取り専用であった場合は以下の処理を実行      If ActiveWorkbook.ReadOnly Then        'ブックの読み取り専用設定を解除        ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True        '上書き保存を実行        Application.DisplayAlerts = False        Application.EnableEvents = False        ActiveWorkbook.Save        Application.EnableEvents = True        Application.DisplayAlerts = True        'ブックを読み取り専用に設定        ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly      'ファイルが読み取り専用でなかった場合は以下の処理を実行      Else        '上書き保存を実行        Application.DisplayAlerts = False        Application.EnableEvents = False        ActiveWorkbook.Save        Application.EnableEvents = True        Application.DisplayAlerts = True      End If    End Sub 上記のマクロで上手くいきそうなのですが、下記2点が解決できずに困っております。 (1)上書き保存ボタンをクリックすると下記のメッセージが毎回表示されてしまいます。   『読み取り専用です。コピーを保存するには名前を付けて保存して下さい。』   OKボタンをクリックしたりEscやEnterキーを押下さえすればこの警告メッセージを回避でき   以後は思った通りの処理を行えるのですが、できればこのメッセージを表示したくない。 (2)上書き保存のために読み取り専用を解除した際、他のオペレーターがエクセル起動中、   または上書き保存中であった場合、エラーが発生してしまうことと思われます。   この問題の解決策をご存知の方、是非教えて下さいますよう宜しくお願いします。 当初は共有ブックとしての運用の方向で進めていたのですが、既に2人のオペレーターが ファイルにアクセスしている状態で、3人目のオペレーターがファイルを開くと読み取り専用と なってしまったり、保存時に時間がかかり過ぎたり、保存時のエラーが頻繁に発生したりといった 状況でしたので共有ブックとしての運用は諦めました。(シート50枚、ファイルサイズ3.5MB程度) 使用PCはXPでExcel2003です。以上、宜しくお願いします。

  • ExcelVBAのコードで上書き保存

    お世話になります。 ExcelVBAのコードで上書き保存時 「実行時エラー1004 ファイルを保存できません」 となり止ってしまいます。 (自分のPCではエラーも発生せず保存できるのですが 友人のPCでは上記のエラーが発生する状況です) コードはExcel起動時にExcel自体を非表示にし フォームで入力等の処理を行い、上書き保存→Excel終了としています。 Private Sub Workbook_Open() Application.Visible = False 'Excel非表示 userform1.Show End Sub Private Sub CommandButton2_Click() 'userform1 ActiveWorkbook.Save '上書き保存 Application.Quit 'Excel終了 End Sub 何とか解決する方法はないでしょうか? よろしくお願いします。

  • GetSaveAsFilenameでフォルダを指定したいのですが?

    すいません。マクロ初心者です。 (1)以下のプロシージャで保存するときに、フォルダを指定したいのですがどこにフォルダ名を入れたらいいかわかりません。 (2)XPのエクセル2003で作成したのですが、vistaのエクセル2007で使用すると保存時に拡張子.xlsが付かずエクセルファイルになりません。 ご教授ください。 Sub シート保存2() Dim Answer3 Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant Answer3 = MsgBox("本当に保存しますか?", vbYesNo) If Answer3 = vbNo Then MsgBox ("キャンセルしました。") Exit Sub End If Sheets("保存シート").Select Application.CutCopyMode = False Sheets("保存シート").Copy 既定ファイル名 = Range("V7") & ".xls" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名) If 保存ファイル名 = False Then MsgBox "保存は中止されました。" ActiveWorkbook.Close (False) Else ActiveWorkbook.SaveCopyAs 保存ファイル名 ActiveWorkbook.Close (False) End If End Sub よろしくお願いします。

  • Excel/VBAのファイル保存

    いつもここでは大変お世話になっています。 以下のように名前をつけて保存をしているのですが、 同名のファイルがあった場合でも上書き確認せずに上書きをさせる方法を教えて下さい。 お願いします。 ActiveWorkbook.SaveAs Filename:= _ "\\PC名\ディレクトリ名\ファイル名.xls", FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False

  • Excel2003VBAでファイルをコピーして指定場所に保存

    こんにちわ。 私は下記のコードで保存場所をCドライブに指定しているのですが、これを保存先が選べるようにするのはどうすれば良いですか? Application.DisplayAlerts = False Set OldWkbook = ActiveWorkbook ' 'ファイル名を取得 BkName1 = OldWkbook.Sheets(StName1).Range("E1").Value BkName2 = OldWkbook.Sheets(StName1).Range("E2").Value BkName3 = OldWkbook.Sheets(StName1).Range("E3").Value FileName = BkName1 & Format(".") & Format("試験結果") & Format(".") & BkName2 & Format(".") & BkName3 & ".xls" FileName = InputBox(FileName & "と言う名前で保存します" & vbCr & "よろしければこのままOKをクリックしてください", "保存ファイル名の確認", FileName) If FileName = "" Then Exit Sub Else If Right(FileName, 4) <> ".xls" Then MsgBox "ファイル名が異常です。" Exit Sub End If End If 'シートの保護を解除 Worksheets("Sheet1").Unprotect Worksheets("Sheet2").Unprotect Worksheets("Sheet3").Unprotect OldWkbook.Sheets(Array(StName1, StName2, StName3, StName4, StName5)).copy Set NewWkbook = ActiveWorkbook 'ボタンを削除 For wIx = NewWkbook.Sheets(1).Shapes.Count To 1 Step -1 If Left(NewWkbook.Sheets(1).Shapes(wIx).Name, 6) = "Button" Then 'ボタンのみ削除 NewWkbook.Sheets(1).Shapes(wIx).Delete End If Next NewWkbook.Sheets(1).Name = StName1 'コピー先シートの保護 Sheets(1).Protect Sheets(2).Protect Sheets(3).Protect Sheets(4).Protect Sheets(5).Protect FileName = "C:\" & FileName If Dir(FileName) <> "" Then '##ファイルが既に存在する If MsgBox("既に指定のファイルが存在します。 置き換えますか?", vbOKCancel, "置き換えの確認") = vbCancel Then NewWkbook.Close savechanges:=False '##保存せずに終了 'シートの保護 Worksheets("Sheet1").Protect Worksheets("Sheet2").Protect Worksheets("Sheet3").Protect Exit Sub '##指定ファイル置き換え保存 End If NewWkbook.SaveAs FileName:=FileName Else '##ファイルを新規保存 NewWkbook.SaveAs FileName:=FileName End If NewWkbook.Close savechanges:=False Application.DisplayAlerts = True 'シートの保護 Worksheets("Sheet1").Protect Worksheets("Sheet2").Protect Worksheets("Sheet3").Protect End Sub

  • VBA 保存

    保存ボタンを作成してファイルに飛ぶように させていますが…どうしてもエラーになります! エラー表示内容> 実行時エラー1004 シートの名前を他のシート、Visual Basicで参照される オブジェクト ライブラリまたは ワークシートと同じ名前に変更することはできません。 下記は実際の記述です。 Private Sub 保存_Click() Dim FileName As String Dim FileExt As String Dim BkName As String Dim OldWkbook As Workbook Dim NewWkbook As Workbook Const StName1 As String = "計画 グラフ" Const StName2 As String = "ケア一覧" ' Application.DisplayAlerts = False Set OldWkbook = ActiveWorkbook ' 'ファイル名を取得 BkName = OldWkbook.Sheets(StName1).Range("D1").Value FileName = BkName & Format(Now, "yyyy-mm-dd") & ".XLS" ' FileName = InputBox(FileName & "と言う名前で保存します" & vbCr & "よろしければこのままOKをクリックしてください", "保存ファイル名の確認", FileName) If FileName = "" Then Exit Sub Else If Right(FileName, 4) <> ".XLS" Then MsgBox "ファイル名が異常です。" Exit Sub End If End If ' OldWkbook.Sheets(Array(StName1, StName2)).Copy Set NewWkbook = ActiveWorkbook For wIx = 1 To NewWkbook.Sheets(1).Shapes.Count NewWkbook.Sheets(1).Shapes(1).Delete '←シート1のボタンを削除 Next NewWkbook.Sheets(1).Name = StName1 NewWkbook.Sheets(2).Name = StName2 ' FileName = "D:\看護計画保存\" & FileName ' If Dir(FileName) <> "" Then '##ファイルが既に存在する If MsgBox("既に指定のファイルが存在します。 置き換えますか?", vbOKCancel, "置き換えの確認") = vbCancel Then NewWkbook.Close savechanges:=False '##保存せずに終了 Exit Sub End If '##指定ファイル置き換え保存 NewWkbook.SaveAs FileName:=FileName Else '##ファイルを新規保存 NewWkbook.SaveAs FileName:=FileName End If ' NewWkbook.Close savechanges:=False Application.DisplayAlerts = True End Sub

専門家に質問してみよう