2017-08-17 48 views
0

我希望有人可以帮助我这个。我使用VBA在Excel中创建模型,并希望使用自定义文件名填充“另存为”对话框。我有三段代码。首先是询问最终用户输入其设施的名称一个窗体:VBA ThisWorkbook.SaveAs文件名:= SaveAsName自定义名称(SaveAsName)不出现在对话框

Private Sub cmdNext_Click() 
strHospName = frmHospName.txtHospName.Value 

' Check for a usable hospital name 

If Len(strHospName) = 0 Then 
    frmHospName.Hide 
    MsgBox "Please provide the name of your facility.", vbCritical + vbOKOnly, "Missing Facility Name" 
    frmHospName.Show 
End If 

If (Len(strHospName) - Len(Trim(strHospName)) = Len(strHospName)) Then 
    frmHospName.Hide 
    MsgBox "Please provide the name of your facility.", vbCritical + vbOKOnly, "Missing Facility Name" 
    frmHospName.Show 
End If 

If strHospName Like "*[\/:*?""<>|]*" Then 
    frmHospName.Hide 
    MsgBox "Please enter your facility's name without any of the following characters: \/: * ? < > | ", vbCritical + vbOKOnly, "Invalid Facility Name" 
    frmHospName.Show 
End If 

Call SaveAsNameStore(strHospName, MyName) 

Set currForm = Me 
Unload Me 
End Sub 

第二件住了自己的模块和支票,看看这种模式已经被定制(定制模式不会看到frmHospName在打开工作簿,从而strHospName将不会分配),以及基于该检查,它创建的字符串SaveAsName:

Public strHospName As String 
Public SaveAsName As String 

Function MyName() As String 
    MyName = ThisWorkbook.Name 
End Function 

Sub SaveAsNameStore(strHospName As String, MyName As String) 
' This code creates a custom SaveAs name 
    Dim strModelDate As String 
    strModelDate = Format(Now, "mm-dd-yyyy") 
    If (Len(strHospName) - Len(Trim(strHospName)) = Len(strHospName)) Then 
     SaveAsName = MyName 
    Else 
     SaveAsName = strHospName & " customized economic model " & strModelDate 
    End If 
End Sub 

第三条居住在的ThisWorkbook和Workbook_BeforeSave适用SaveAsName:

Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 

''This code forces SaveAs with custom filename instead of Save to prevent overwriting the master model file 
''NEED TO UNCOMMENT PRIOR TO DELIVERY 

    Application.ScreenUpdating = False 

    If SaveAsUI = False Then 
     Cancel = True 
    ElseIf SaveAsUI = True Then 
     With Application.FileDialog(msoFileDialogSaveAs) 
      Application.EnableEvents = False 
      If .Show Then 
       ThisWorkbook.SaveAs Filename = SaveAsName 
      End If 
      Application.EnableEvents = True 
     End With 
     Cancel = True 
    End If 
End Sub 

问题是,当我单击“另存为”按钮时,自定义SaveAs名称不会填充到对话框中。我可以看到SaveAsName是通过立即窗口中的?SaveAsName正确生成的。对于语法,我试过ThisWorkbook.SaveAs Filename = SaveAsNameThisWorkbook.SaveAs Filename:=SaveAsName,两次都是相同的结果。

对不起,这个冗长的帖子。我希望你能提供任何帮助!

+0

为什么不简单地使用'Cancel = True'实现'BeforeSave',并让你的自定义“另存为”禁用应用程序事件并实际执行'ThisWorkbook.SaveAs'调用?看起来你是过于复杂的东西,除非我误解了某些东西......现在看起来你的'SaveAsNameStore'过程的名字在说谎 - 它不是*保存*任何真正的东西。 –

+1

@ Mat'sMug谢谢你的回复。 'SaveAsNameStore'存储自定义的另存为名称 - 我想我应该将它称为StoreSaveAsName来更清楚。 我不确定我是否理解你的评论的其余部分 - 请你详细说明一下吗? – kmprioli

+0

是的,绝对!不过,我会避免事件处理程序意大利面,并以编程方式保存工作簿 - 如果我理解正确的文件名已知,不知道为什么只有为用户弹出SaveAs对话框才能使用它。 –

回答

0

这是我用来做一个我目前工作的东西的备份,没有命名它是一回事。针对您的情况和变量轻松修改

Private Sub cmdBackupButton_Click() 
'__BACKUP THE CURRENT WORKBOOK___ 

Application.DisplayAlerts = False 
ActiveWorkbook.SaveCopyAs "C:\WhateverPathYouWant\myFile_backup.xlsb") 
Application.DisplayAlerts = True 

End Sub 

这消除了任何“另存为”对话,并且不需要任何交互。很简单。

+0

非常感谢! – kmprioli