VBAでの疑問
- 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名が同じじゃないのは当然で、同じになるのは新規に作成したばかりで保存する前のファイルくらいしか思いつきません。これでは必ず上書きされてしまうと思いますが、どういう意図が考えられるのかお分かりの方教えていただけないでしょうか?
- mocodne
- お礼率94% (66/70)
- Excel(エクセル)
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そんな事をするかどうかは分かりませんが VBAでそのコードをコピーした新しいBookを作成し、新しいブックを利用して一度でも保存すれば以後そのブックを利用するものとして自動保存設定とする。利用しても保存しなければ以後利用しないものとして保存しないというものとか。
その他の回答 (2)
- kon555
- ベストアンサー率52% (1751/3360)
たしか新規で開いたばかりの「Book1」は.FullNameも.Nameも同一になったはずなので、その部分の不一致判定で新規ブックかどうかを判定しているとか? ただThisWorkbookと言う事は、そのブック自体が新規ブックである必要があるので、本質的には無意味に思いますね。 あとは私が把握していないだけで、.FullNameと.Nameが一致するケースがあるかどうかですね。
お礼
ありがとうございます。.ほかに.FullNameと.Nameが一致するケースってなんでしょうね。
未保存なら消失を防ぐために保存する、すでに保存してあるならタイムスタンプが変わらないようにそのまま終了する、という目的じゃないですか。
お礼
ありがとうございます。 未保存であろうがなかろうが保存されてしまうと思うのですが。
関連する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 宜しくお願いします。
- ベストアンサー
- Visual Basic
- エクセル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
- ベストアンサー
- Excel(エクセル)
- この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つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?
- 締切済み
- Visual Basic
- 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 何かヒントをお持ちの方みえられましたらご教示いただければ幸いです。
- ベストアンサー
- Excel(エクセル)
- VBAマクロでエラーで進まない
現在、開いてるファイルを一部加工してA1セルデーターをファイル名にして同じフォルダーに保存したいのですが「参照が不正または不完全」とエラーメッセージが出ます。教えて下さい。 Application.DisplayAlerts=True .SaveCopyAs.Path & "¥" & .Worksheet("依頼").Range("A1").Value & ".xls" End With ThisWorkbook.Saved = True
- ベストアンサー
- Visual Basic
- エクセル/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 & "です。")
- ベストアンサー
- オフィス系ソフト
お礼
なるほど。ありがとうございます。