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 重命名为更独特的名称,例如SaveNameG1Name。可能由于Name 与对象属性或Name 对象或具有相同定义名称的另一个变量混淆而出现问题。 【参考方案1】:

如果建议的名称为空,则问题出在 InitialFileName 设置为 Name。所以问题是Name 有时是空白的。 NameActiveWorkbook.Sheets("Analisis").Range("G1") 获取它的值。

其中两个不可靠的部分是:

    ActiveWorkbook 而不是 ThisWorkbookApplication.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 使用单元格值作为文件标题的主要内容,如果未能解决你的问题,请参考以下文章

将单元格颜色从工作表复制到具有相同单元格值的工作表

如何使用 Angular 6 + Handsontable 根据另一个单元格值仅更改一个单元格值?

使用单元格格式获取 JTable 整数单元格值

每次活动单元格更改行时更新单元格值

使用单元格值作为单元格范围进行计算

用另一个 Excel 工作表单元格值动态更新一个 Excel 工作表的单元格值