GetSaveAsFilename 使用单元格值作为文件标题
Posted
技术标签:
【中文标题】GetSaveAsFilename 使用单元格值作为文件标题【英文标题】:GetSaveAsFilename using a cell value as file title 【发布时间】:2021-11-11 16:05:13 【问题描述】:请帮忙! 我正在使用“GetSaveAsFilname”函数使用特定单元格的值作为标题来保存我的文件,这是由公式创建的。 我不是唯一一个使用该文件的人,因此保存路径大多数由用户选择。 大多数时候它可以工作,但有时标题是空白的,用户需要从零开始写下来。 在我的代码下面:
Sub SaveTool()
Dim Name As String
Dim sFileSaveName As Variant
Name = ActiveWorkbook.Sheets("Analisis").Range("G1")
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=Name, FileFilter:="Excel Files (*.xlsm), *.xlsm")
If sFileSaveName <> False Then
ActiveWorkbook.SaveAs sFileSaveName
End If
End Sub
【问题讨论】:
尝试将Name
重命名为更独特的名称,例如SaveName
或G1Name
。可能由于Name
与对象属性或Name 对象或具有相同定义名称的另一个变量混淆而出现问题。
【参考方案1】:
如果建议的名称为空,则问题出在 InitialFileName
设置为 Name
。所以问题是Name
有时是空白的。 Name
从 ActiveWorkbook.Sheets("Analisis").Range("G1")
获取它的值。
其中两个不可靠的部分是:
ActiveWorkbook
而不是 ThisWorkbook
或 Application.Workbooks(index)
。如果用户在执行宏之前单击了其他工作簿,则 ActiveWorkbook
可能指向不相关的工作簿。
Sheets("Analisis").Range("G1")
对用户编辑开放。如果工作表没有受到保护,则用户可能无意中删除了该单元格中包含的文本。
我建议使用一行来检查Name
是否为空白,并在Name
确实为空白的情况下为Name
提供默认值。
Sub SaveTool()
Dim Name As String
Dim sFileSaveName As Variant
Name = ActiveWorkbook.Sheets("Analisis").Range("G1")
If Trim(Name) = "" Then Name = "DefaultFileName"
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=Name, FileFilter:="Excel Files (*.xlsm), *.xlsm")
If sFileSaveName <> False Then
ActiveWorkbook.SaveAs sFileSaveName
End If
End Sub
我添加了一个测试,也许可以帮助您调试为什么这似乎对您和您的文件不起作用:
打开一个空白工作簿并尝试此代码 - 在弹出窗口中按“保存”而不输入任何内容:
Sub test()
With ThisWorkbook.Sheets.Add
.Name = "Analisis"
.Range("G1").Value = "Test_File_Name"
End With
Dim Name As String
Dim sFileSaveName As Variant
Name = "Test_File_Name"
Debug.Print "1a - " & Name
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=Name, FileFilter:="Excel Files (*.xlsm), *.xlsm")
Debug.Print "1b - " & sFileSaveName
Name = ThisWorkbook.Sheets("Analisis").Range("G1").Value
Debug.Print "2a - " & Name
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=Name, FileFilter:="Excel Files (*.xlsm), *.xlsm")
Debug.Print "2b - " & sFileSaveName
End Sub
输出应该是:
'1a - Test_File_Name
'1b - C:\Users\Username\Documents\Test_File_Name.xlsm
'2a - Test_File_Name
'2b - C:\Users\Username\Documents\Test_File_Name.xlsm
现在从测试中删除With
块并将代码放入您的项目文件中。输出的差异应该可以帮助您缩小问题的原因。
【讨论】:
你好@Toddleson。感谢你的回答。我更改为 ThisWorkbook 并添加了检查行,但我仍然在空白处获得名称。我添加了一个带有消息框的行来测试名称是否从单元格中复制,它被阻止的工作表,我在框上得到了名字,但在另存为窗口上没有。 @Henry274 我添加了故障排除测试脚本,请看我修改后的答案 你好@Toddleson。我按照您的建议进行了测试,空白文件上的输出与您的相同。当我将测试添加到我的代码中时,我得到了这个输出:'1a - Test_File_Name
'1b - C:\Users\Username\Downloads
'2a -
'2b - C:\Users\Username\Downloads
使用 excel 打开的 las 文件夹是下载。我不知道为什么 Name 变量的值显示为空白,当我将它放在消息框上时,它会显示单元格上的信息。 (我不是 VBA 专家,您的帮助很棒)。
请在您的原始帖子中添加带有消息框的调试代码示例。那里可能有一些关于为什么文本显示在MessageBox
而不是GetSaveAsFilename
的线索【参考方案2】:
名字上的特殊字符被赋值的问题! 我添加了一个用空格删除它们的功能,现在它可以工作了! 这是最终代码:
Function ValidFileName(text As String) As String
text = Replace(text, "\", "")
text = Replace(text, "/", "")
text = Replace(text, "[", "")
text = Replace(text, "]", "")
text = Replace(text, ":", "")
text = Replace(text, "?", "")
text = Replace(text, ".", "")
text = Replace(text, ",", "")
ValidFileName = text
End Function
Sub SaveTool()
Dim ToolName As String
Dim sFileSaveName As Variant
ToolName = ValidFileName(ThisWorkbook.Sheets("Analisis").Range("G1").Value)
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=ToolName, FileFilter:="Excel Files (*.xlsm), *.xlsm")
If sFileSaveName <> False Then
ActiveWorkbook.SaveAs sFileSaveName
End If
End Sub
感谢@Toddleson 的帮助!
【讨论】:
以上是关于GetSaveAsFilename 使用单元格值作为文件标题的主要内容,如果未能解决你的问题,请参考以下文章