【问题标题】:Get File Path (ends with folder)获取文件路径(以文件夹结尾)
【发布时间】:2011-05-11 22:22:00
【问题描述】:

我知道如何让用户单击按钮导航到要打开的特定文件。

代码:

Private Sub CommandButton2_Click()
    Dim vaFiles As Variant

    vaFiles = Application.GetOpenFilename()

    ActiveSheet.Range("B9") = vaFiles
End Sub

我想要第二个按钮,让用户导航到文件夹以保存我的程序创建的.pdf 文件。

问题:GetOpenFilename 要求用户单击文件。如果文件夹中没有文件,则用户无能为力。

【问题讨论】:

    标签: excel vba file-io


    【解决方案1】:

    使用Application.FileDialog 对象

    Sub SelectFolder()
        Dim diaFolder As FileDialog
        Dim selected As Boolean
    
        ' Open the file dialog
        Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker)
        diaFolder.AllowMultiSelect = False
        selected = diaFolder.Show
    
        If selected Then
            MsgBox diaFolder.SelectedItems(1)
        End If
    
        Set diaFolder = Nothing
    End Sub
    

    【讨论】:

    • 需要确保在参考中选择了 Office [版本] 对象库(不同于 Access 库)。否则,您会收到“自动化错误”。
    【解决方案2】:

    添加了 ErrorHandler 以防用户点击取消按钮而不是选择文件夹。因此,您不会收到一条可怕的错误消息,而是收到一条消息,即必须选择一个文件夹,然后例程结束。下面的代码还将文件夹路径存储在范围名称中(仅链接到工作表上的单元格 A1)。

    Sub SelectFolder()
    
    Dim diaFolder As FileDialog
    
    'Open the file dialog
    On Error GoTo ErrorHandler
    Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker)
    diaFolder.AllowMultiSelect = False
    diaFolder.Title = "Select a folder then hit OK"
    diaFolder.Show
    Range("IC_Files_Path").Value = diaFolder.SelectedItems(1)
    Set diaFolder = Nothing
    Exit Sub
    
    ErrorHandler:
    Msg = "No folder selected, you must select a folder for program to run"
    Style = vbError
    Title = "Need to Select Folder"
    Response = MsgBox(Msg, Style, Title)
    
    End Sub
    

    【讨论】:

    • FileDialog 的.Show 方法返回TRUE(如果用户选择了一个或多个文件)或FALSE(如果用户单击取消按钮或关闭窗口)跨度>
    【解决方案3】:

    在 VBA 编辑器的工具菜单中,单击引用...向下滚动到“Microsoft Shell 控件和自动化”并选择它。

    Sub FolderSelection()
        Dim MyPath As String
        MyPath = SelectFolder("Select Folder", "")
        If Len(MyPath) Then
            MsgBox MyPath
        Else
            MsgBox "Cancel was pressed"
        End If
    End Sub
    
    'Both arguements are optional. The first is the dialog caption and
    'the second is is to specify the top-most visible folder in the
    'hierarchy. The default is "My Computer."
    
    Function SelectFolder(Optional Title As String, Optional TopFolder _
                             As String) As String
        Dim objShell As New Shell32.Shell
        Dim objFolder As Shell32.Folder
    
    'If you use 16384 instead of 1 on the next line,
    'files are also displayed
        Set objFolder = objShell.BrowseForFolder _
                                (0, Title, 1, TopFolder)
        If Not objFolder Is Nothing Then
            SelectFolder = objFolder.Items.Item.Path
        End If
    End Function
    

    Source Link.

    【讨论】:

      【解决方案4】:

      这可能会对您有所帮助:

      Sub SelectFolder()
          Dim diaFolder As FileDialog
          Dim Fname As String
      
          Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker)
          diaFolder.AllowMultiSelect = False
          diaFolder.Show
      
          Fname = diaFolder.SelectedItems(1)
      
          ActiveSheet.Range("B9") = Fname
      
      End Sub
      

      【讨论】:

      • 请正确缩进答案。
      【解决方案5】:

      如果你想默认浏览到一个文件夹: 例如“D:\Default_Folder” 只需初始化“InitialFileName”属性

      Dim diaFolder As FileDialog
      
      ' Open the file dialog
      Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker)
      diaFolder.AllowMultiSelect = False
      diaFolder.InitialFileName = "D:\Default_Folder"
      diaFolder.Show
      

      【讨论】:

        【解决方案6】:

        使用 Application.GetSaveAsFilename() 的方式与使用 Application.GetOpenFilename() 的方式相同

        【讨论】:

        • 如果文件夹是空的并且我点击“保存”按钮没有任何反应。我希望当您单击“保存”或“打开”按钮时,它会退出浏览器,然后在这种情况下,将文件路径保存到指定的单元格。感谢您的回复
        • 希望我对所发生事情的解释很清楚。如果我选择一个空文件夹作为目标保存路径,然后按“取消”,我指定单元格中的文本将变为“FALSE”。当我运行程序时它确实可以工作,但它没有告诉用户将 pdf 文件保存到哪个文件夹(尽管他们选择了它),并且当它被保存时,“FALSE”一词出现在开头,这样“FALSEOOutput_report .pdf”而不是“Output_report.pdf”。有人可以解释为什么它会这样工作吗?谢谢
        • @Jesse 如果单击取消,则该函数返回 false,否则返回文件名。我不确定为什么在某些情况下将 FALSE 连接到文件名的开头。部分混淆可能是这个函数只是为你获取一个文件名,它没有为你做任何保存。这部分取决于你的程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 2016-03-25
        • 2017-11-03
        相关资源
        最近更新 更多