Проблема со средством выбора папок — VBA

#excel #vba #directory

#excel #vba #каталог

Вопрос:

Я использую msoFileDialogFolderPicker, чтобы получить путь к папке и имя папки, просмотрев и выбрав нужную папку, где откроется диалоговое окно, и пользователь должен выбрать папку, нажав OK в диалоговом окне.

Если выбрана папка и нажата кнопка OK, полный путь к папке сохраняется в переменной Folderpth. Если нажать кнопку Отмена, переменная Folderpth будет пустой.

Моя проблема в том, что если пользователь нажимает OK даже без выбора папки, этот конкретный путь к каталогу сохраняется в переменной Folderpth .

Вот код, который я использую,

 Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker)

With diaFolder
    
    diaFolder.Title = "Select the source folder"
    diaFolder.AllowMultiSelect = False
    
    If diaFolder.Show = -1 Then
    
        Folderpth = .SelectedItems.Item(1)
        
        splitting = Split(Folderpth, "", 9)

        counter = UBound(splitting)

        foldername = splitting(counter)
        
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        
        Set objFolder = objFSO.GetFolder(Folderpth)
        
            Else
            
                MsgBox "Please select the Source folder"
                
                Folderpth = ""
                
                Exit Sub
                
            End If
        
End With

  

Если пользователь переходит к папке, в которой его вложенная папка является его требуемой папкой, но без выбора требуемой папки, если он нажмет ok, путь, захваченный будет неправильным. Я хочу переопределить путь к папке, не выбирая его.

Возможно ли это

Комментарии:

1. Ничего не выбирая, вы выбираете текущую папку. Почему вы хотите это предотвратить?

2. Не уверен, что Excel всегда будет открывать dialouge по пути к книге, но если это так, может быть, вы могли бы сделать if Folderpth = Application.ActiveWorkbook.path then Folderpth = Nothing или что-то в этом роде.

3. @ChristoferWeber Этот путь используется снова, и именно поэтому он влияет на остальную часть программы.

4. Вот идея. При запуске msoFileDialogFolderPicker сохраните начальный путь в переменной. Когда пользователь нажмет ok, сопоставьте его с новым путем. Если пути совпадают, сообщите пользователю, что путь тот же, и хотел бы он продолжить? Все просто

5. Кроме того, поскольку вы используете With diaFolder , diaFolder.Title вероятно, должно быть просто .Title , и то же самое для других.

Ответ №1:

Ограничение начального имени файла

  • Как я (неправильно) понял ваш вопрос, это не то, что вы просили, но это может помочь вам достичь желаемого результата. Я некоторое время играл без результата.
  • Значение InitialPath переменной должно быть введено без разделителя конечного пути ( ).

Код

 Option Explicit

Sub fp()
    
    Dim InitialPath As String
    InitialPath = "C:"

    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Source Folder Selection"
        .AllowMultiSelect = False
        .InitialFileName = InitialPath amp; Application.PathSeparator
        Debug.Print "Initial File Name: " amp; .InitialFileName
        If .Show <> -1 Then
        ' User pressed 'Cancel'.
            MsgBox "Next time please select the source folder"
            Exit Sub
        Else
        ' User pressed 'OK', but didn't change the Initial Path.
            Dim FolderPath As String
            FolderPath = .SelectedItems.Item(1)
            If Right(InitialPath, 1) = ":" Then
                InitialPath = InitialPath amp; Application.PathSeparator
            End If
            If FolderPath = InitialPath Then
                MsgBox "'" amp; FolderPath amp; "' is not allowed."
                Exit Sub
            End If
        End If
    End With
    
    ' User pressed 'OK' selecting a path different than Initial Path.
    ' Continue...
    Debug.Print "FolderPath: " amp; FolderPath
    
    ' Either:
    Dim SplitArray As Variant
    SplitArray = Split(FolderPath, Application.PathSeparator)
    Dim FolderName As String
    If UBound(SplitArray) = 1 And SplitArray(0) = "" Then
        FolderName = SplitArray(0)
    Else
        FolderName = SplitArray(UBound(SplitArray))
    End If
    Debug.Print "Split: " amp; FolderName
    
    'or:
    With CreateObject("Scripting.FileSystemObject")
        FolderName = .getFolder(FolderPath).Name
    End With
    Debug.Print "FileSystemObject: " amp; FolderName
    
End Sub