Excel 使用自定义名称创建工作簿而不将其保存到磁盘

Excel 使用自定义名称创建工作簿而不将其保存到磁盘,excel,vba,Excel,Vba,是否可以使用自定义名称创建工作簿而不将其保存到磁盘?我希望避免使用默认的“工作簿x”名称,但不希望要求用户保存工作簿。如果我将其自动保存在某个临时文件中,用户单击“保存”时将不会出现“另存为…”对话框,这可能会造成混乱。只需创建工作簿,而不保存它,因此当用户尝试保存它时,用户将得到“另存为”提示。如果用户试图关闭该文件,则在关闭之前,用户将收到一条提示,提示用户是否要保存(同样是另存为对话框)该文件。现在,此提示的外观取决于您对新创建的工作簿进行了一些更改 比如说 Sub Sample()

是否可以使用自定义名称创建工作簿而不将其保存到磁盘?我希望避免使用默认的“工作簿x”名称,但不希望要求用户保存工作簿。如果我将其自动保存在某个临时文件中,用户单击“保存”时将不会出现“另存为…”对话框,这可能会造成混乱。

只需创建工作簿,而不保存它,因此当用户尝试保存它时,用户将得到“另存为”提示。如果用户试图关闭该文件,则在关闭之前,用户将收到一条提示,提示用户是否要保存(同样是另存为对话框)该文件。现在,此提示的外观取决于您对新创建的工作簿进行了一些更改

比如说

Sub Sample()
    Dim wb As Workbook

    Set wb = Workbooks.Add
End Sub
默认情况下,工作簿将命名为“Book*”,但这并不重要,因为用户将有机会执行“另存为”

跟进


按Ctrl+S。它将显示另存为。。。对话框,就像工作簿从未保存一样

虽然我提到我只能想到一种方法,但在编写代码时,我想到了两个选项:)

方式1

a) 创建新工作簿

b) 将其另存为JAN 2012.XLSM,保存到用户的临时目录

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
方法2(复杂的操作方法)

a) 创建新工作簿

b) 将其另存为JAN 2012.XLSM,保存到用户的临时目录


c) 插入代码以禁用Ctrl+S并仅允许另存为您可以使用应用程序事件来管理工作簿的创建和保存

有关更多信息,请参阅CPearson的网站

我的建议:创建带有应用程序事件处理程序的加载项以管理新工作簿:

在addin
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

西达斯,我想给这些工作簿起个不同于“x书”的名字。“我的宏”会创建一些工作簿,并将它们命名为“工作簿1”、“工作簿2”,这会让用户感到困惑。我想把工作手册命名为“2012年1月”、“2012年2月”等等。。。并让用户决定是否保存工作簿以及保存在何处。用户将如何保存工作簿?按Ctrl+S/Excel菜单或按Ctrl+S通过代码?显示另存为。。。对话框,就像工作簿从未保存过一样。在这种情况下,我只能想到一种解决方案。给我15分钟。我将发布代码:)为什么不将其保存在临时位置,并在第一次保存事件时调用saveas?