VBAでの疑問

このQ&Aのポイント
  • VBAで使用されるコードについての疑問です。
  • 上記のコードは、ファイルが保存されていない場合に上書きを防ぐための処理です。
  • このコードの意図は、保存されていないファイルを閉じる際に、保存するかどうかを選択する機能を提供することです。
回答を見る
  • ベストアンサー

VBAでの疑問

以下のようなコードを見ました。 Private Sub Workbook_BeforeClose(Cancel As Boolean) With ThisWorkbook Application.DisplayAlerts = False If .Name <> .FullName Then SaveAs Else Me.Saved = True End If Application.DisplayAlerts = True End With End Sub これは何のためのコードでしょうか? If .Name <> .FullName Then って、パスなしのBOOK名とパス付BOOK名が同じじゃないのは当然で、同じになるのは新規に作成したばかりで保存する前のファイルくらいしか思いつきません。これでは必ず上書きされてしまうと思いますが、どういう意図が考えられるのかお分かりの方教えていただけないでしょうか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

そんな事をするかどうかは分かりませんが VBAでそのコードをコピーした新しいBookを作成し、新しいブックを利用して一度でも保存すれば以後そのブックを利用するものとして自動保存設定とする。利用しても保存しなければ以後利用しないものとして保存しないというものとか。

mocodne
質問者

お礼

なるほど。ありがとうございます。

その他の回答 (2)

  • kon555
  • ベストアンサー率52% (1751/3360)
回答No.2

 たしか新規で開いたばかりの「Book1」は.FullNameも.Nameも同一になったはずなので、その部分の不一致判定で新規ブックかどうかを判定しているとか?  ただThisWorkbookと言う事は、そのブック自体が新規ブックである必要があるので、本質的には無意味に思いますね。  あとは私が把握していないだけで、.FullNameと.Nameが一致するケースがあるかどうかですね。

mocodne
質問者

お礼

ありがとうございます。.ほかに.FullNameと.Nameが一致するケースってなんでしょうね。

noname#252332
noname#252332
回答No.1

 未保存なら消失を防ぐために保存する、すでに保存してあるならタイムスタンプが変わらないようにそのまま終了する、という目的じゃないですか。

mocodne
質問者

お礼

ありがとうございます。 未保存であろうがなかろうが保存されてしまうと思うのですが。

関連するQ&A

  • VBA 保存方法を教えて下さい

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("×ボタンは使用できません。" & vbCr & _ "よろしいですか?", vbInformation + vbOKOnly) = vbOK Then Cancel = True End If End Sub 上記の様にEXCELワークブックに記述しましたが、 別に設置した「保存終了ボタン」で終了できなくなってしまいました。 Workbook_BeforeClose が邪魔しているようです。 どうすれば解決できるでしょうか? 「保存終了ボタン」に記述しているコードは下記です。 Sub 保存終了() ActiveWorkbook.Save CommandBars("Worksheet Menu Bar").Enabled = True Application.CommandBars("Standard").Visible = True Application.CommandBars("Formatting").Visible = True Application.CommandBars("Drawing").Visible = True With Application .DisplayFormulaBar = True .ShowWindowsInTaskbar = True End With Application.WindowState = xlMaximized Application.Quit MsgBox "終了します" End Sub 宜しくお願いします。

  • エクセルVBAでBOOKに読み取りパスワード設定

    エクセル2013です。 以下のコードで指定した任意のフォルダ内のエクセルに読み取りパスワードを設定できました。 しかし、そのフォルダの下にサブフォルダーがあった場合にサブフォルダ内のBOOKは対象になりません。どのように直せばサブフォルダも対象にできるようになるでしょうか?教えてください。 Sub TEST01()   Dim myfdr As String, fname As String   Dim mb As Workbook, wb As Workbook   Dim n As Long   With Application.FileDialog(msoFileDialogFolderPicker) '対象とするフォルダの指定      If .Show = True Then       myfdr = .SelectedItems(1)     Else       MsgBox "キャンセルします。"       Exit Sub     End If   End With   Set mb = ThisWorkbook 'このコピー先ブックをmbとする。   fname = Dir(myfdr & "\*.xls*") 'フォルダ内のExcelブックを検索   n = 2   Do Until fname = Empty '全て検索     Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。     With mb.Sheets("Sheet1") '転記       .Cells(n, "B").Value = wb.FullName       .Cells(n, "C").Value = wb.Sheets(1).Range("B1").Value     End With     n = n + 1 'カウント     Application.DisplayAlerts = False     wb.SaveAs Filename:=wb.FullName, Password:="emaxemax"     wb.Close     Application.DisplayAlerts = True     fname = Dir 'フォルダ内の次のExcelブックを検索   Loop '繰り返す   MsgBox n - 2 & "件処理しましました。" End Sub

  • このVBAコードの解説をお願いします。

    特定の行の中で同じものが続いたらセルを結合する、ということがやりたくて 以下のコードをネット上から探してきました。 上記の動作は実現できたのですが、自分でこのコードをみてもイマイチわかりません。 お分かりになる方、できれば1行ずつ解説してください。 よろしくお願いします。 Sub Sample() Dim myRng As Range, myRow As Long Set myRng = Range("A1") For myRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(myRow, 1) If .Value = .Offset(1).Value Then Set myRng = Union(myRng, .Offset(1)) Else Application.DisplayAlerts = False myRng.Merge Application.DisplayAlerts = True Set myRng = .Offset(1) End If End With Next End Sub

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • Excel VBAでのSaveCopyAsの挙動

    Excel 2016/2019を使っています。よろしくお願いします。 ブックに変更があった場合にバックアップを保存したいので、 上書きにならないように日付と連番をつけてバックアップ専用フォルダにSaveCopyAsを使って保存しようとしています。 明示的に「保存」アイコンをクリックすると期待通りの動作が行われます。しかし、保存せずに「x」印をクリックして閉じてしまった場合でも、変更があるならバックアップファイルを作りたいのですが、SaveCopyAsを通っているのにバックアップファイルが作成されません。 記載したコードは以下のとおりです。 ThisWorkbookオブジェクトに対して、 Public Sub Workbook_beforeClose(Cancel As Boolean) '変更があれば(ThisWorkBookを)保存 If ThisWorkBook.Saved = False Then ThisWorkBook.Save End If End Sub 'ThisWorkBookの保存時にバックアップを作成 Private Sub Workbook_BeforeSave(省略) If ThisWorkbook.Saved = False Then 'バックアップファイルのフルパスを作成  ThisWorkbook.SaveCopyAs "バックアップファイルフルパス" End Sub 何かヒントをお持ちの方みえられましたらご教示いただければ幸いです。

  • VBAマクロでエラーで進まない

    現在、開いてるファイルを一部加工してA1セルデーターをファイル名にして同じフォルダーに保存したいのですが「参照が不正または不完全」とエラーメッセージが出ます。教えて下さい。 Application.DisplayAlerts=True .SaveCopyAs.Path & "¥" & .Worksheet("依頼").Range("A1").Value & ".xls" End With ThisWorkbook.Saved = True

  • エクセル/BeforeCloseイベントで保存できない!?

    エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub

  • Excel VBAで確認なしで上書き保存

    起動中のBookでファイル名が Data.xlsのものを閉じたいと思いますが、 上書き確認メッセージを出さないように oExcel.DisplayAlerts = False を設定すると エラーになります。 CreateObject で作成した場合は、DisplayAlerts が使えるようですが、 すでに起動済みのBookを確認なしで上書き保存するにはどうしたらいい のでしょうか? Sub UnloadFile()   Dim myBook2 As Workbook   Dim myBook1 As Workbook    For Each myBook2 In Workbooks      If myBook2.Name = "Data.xls" Then        Set myBook1 = myBook2        myBook1.SaveAs myBook1.FullName        myBook1.Close      End If    Next myBook2    Set myBook1 = Nothing End Sub

  • 【Excel VBA】 ブッククローズ時の動作について

    環境: WindowsXP Office2003 ThisWorkBookモジュールに、 Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ブックの保存を要求しない ThisWorkbook.Saved = True End Sub と記述しているのですが、保存の有無を聞かれます。 しかしながら、ブックにより聞かれない場合もあります。 原因として考えられるのは、どのようなことでしょうか?

  • ワード2000のVBAについて

    ワード2000を使っています。 VBAで、ダイアログボックスを開き、指定したファイルのファイル名をフルパスで取得したいのですが、下記のコードでは、ファイル名しか取得できません。 どのようにしたら、フルパスを取得できるのでしょうか? たびたびすみませんが、誰か教えてください。 Dim Name With Dialogs(wdDialogFileOpen) If .Display = -1 Then Name = .Name End If End With MsgBox ("ファイル名は" & Name & "です。")

専門家に質問してみよう