#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