我希望有人可以帮助我这个。我使用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 = SaveAsName
和ThisWorkbook.SaveAs Filename:=SaveAsName
,两次都是相同的结果。
对不起,这个冗长的帖子。我希望你能提供任何帮助!
为什么不简单地使用'Cancel = True'实现'BeforeSave',并让你的自定义“另存为”禁用应用程序事件并实际执行'ThisWorkbook.SaveAs'调用?看起来你是过于复杂的东西,除非我误解了某些东西......现在看起来你的'SaveAsNameStore'过程的名字在说谎 - 它不是*保存*任何真正的东西。 –
@ Mat'sMug谢谢你的回复。 'SaveAsNameStore'存储自定义的另存为名称 - 我想我应该将它称为StoreSaveAsName来更清楚。 我不确定我是否理解你的评论的其余部分 - 请你详细说明一下吗? – kmprioli
是的,绝对!不过,我会避免事件处理程序意大利面,并以编程方式保存工作簿 - 如果我理解正确的文件名已知,不知道为什么只有为用户弹出SaveAs对话框才能使用它。 –