ディスクに保存せずにカスタム名でブックを作成することはできますか?デフォルトの「Workbookx」名は避けたいのですが、ユーザーにワークブックの保存を要求したくありません。一時的に自動的に保存すると、ユーザーが[保存]をクリックしても[名前を付けて保存...]ダイアログが表示されないため、混乱する可能性があります。
2 に答える
ブックを作成し、保存しないでください。ユーザーがブックを保存しようとすると、「名前を付けて保存」プロンプトが表示されます。また、ユーザーがファイルを閉じようとすると、閉じる前にファイルを保存するかどうか( [名前を付けて保存]ダイアログ)を確認するメッセージが表示されます。これで、このプロンプトの表示は、新しく作成されたブックにいくつかの変更を加えたという事実に依存します。
例えば
Sub Sample()
Dim wb As Workbook
Set wb = Workbooks.Add
End Sub
デフォルトでは、ワークブックの名前は「Book *」になりますが、ユーザーが「名前を付けて保存」を実行する機会が得られるため、これは実際には問題ではありません。
ファローアップ
Ctrl + Sを押すと、ブックが保存されていないかのように[名前を付けて保存...]ダイアログが表示されます。
私が考えることができる唯一の方法があると述べましたが、コードに取り組んでいる間、私は2つのオプションを思いつきました:)
方法1
a)新しいワークブックを作成する
b)たとえば、JAN2012.XLSMとしてユーザーのTempディレクトリに保存します
c)ファイルのプロパティを読み取り専用に変更します
d)ユーザーがCTRL + Sを押すと、Excelは名前を付けて保存を促します
Option Explicit
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH As Long = 260
Sub Sample()
Dim wb As Workbook
Set wb = Workbooks.Add
With wb
.SaveAs Filename:=TempPath & "JAN 2012.xlsm" _
, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
'.SaveAs Filename:=TempPath & "JAN 2012.xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
.ChangeFileAccess Mode:=xlReadOnly, WritePassword:="admin"
End With
End Sub
Function TempPath() As String
TempPath = String$(MAX_PATH, Chr$(0))
GetTempPath MAX_PATH, TempPath
TempPath = Replace(TempPath, Chr$(0), "")
End Function
WAY 2(複雑なやり方)
a)新しいワークブックを作成する
b)たとえば、JAN2012.XLSMとしてユーザーのTempディレクトリに保存します
c)Ctrl + Sを無効にし、名前を付けて保存のみを許可するコードを挿入します
アプリケーションイベントを使用して、ワークブックの作成と保存を管理できます。
詳細については、CPearsonのサイトのアプリケーションイベントを参照してください。
私の提案:新しいワークブックを管理するためのアプリケーションイベントハンドラーを使用してアドインを作成します。
アドインThisWorkbook
モジュール(またはPearsonによって説明されているクラスモジュールを使用)に、このコードを含めます
Option Explicit
' Establish object to handle events
Public WithEvents App As Application
Private Sub Workbook_Open()
Set App = Application
End Sub
' Handle new workbook
Private Sub App_NewWorkbook(ByVal Wb As Workbook)
MsgBox "New Book..."
Wb.SaveAs "Your Path and File Name Here"
End Sub
' Intercept save event
Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "Saving " & Wb.Name
End Sub