Я использую MS Excel 2010 и пытаюсь получить текущий каталог, используя приведенный ниже код,
path = ActiveWorkbook.Path
Но ActiveWorkbook.Path возвращает пустое.
Я использую MS Excel 2010 и пытаюсь получить текущий каталог, используя приведенный ниже код,
path = ActiveWorkbook.Path
Но ActiveWorkbook.Path возвращает пустое.
Я тестировал это:
Когда я открываю документ Excel D:\db\tmp\test1.xlsm
:
CurDir()
возвращает C:\Users\[username]\Documents
ActiveWorkbook.Path
возвращает D:\db\tmp
Итак, CurDir()
имеет системную настройку и может быть изменен.
ActiveWorkbook.Path
не изменяется для одной и той же сохраненной рабочей книги.
Например, CurDir()
изменяется, когда вы выполняете команду "Файл/Сохранить как" и выбираете случайный каталог в диалоговом окне выбора файла/каталога. Затем нажмите "Отмена", чтобы пропустить сохранение. Но CurDir()
уже изменился на последний выбранный каталог.
У вас есть несколько вариантов в зависимости от того, что вы ищете.
Workbook.Path
возвращает путь к сохраненной книге. Application.Path
возвращает путь к исполняемому файлу Excel. CurDir
возвращает текущий рабочий путь, вероятно, по умолчанию используется папка "Мои документы" или аналогичная.
Вы также можете использовать свойство оболочки оболочки сценариев .CurrentDirectory.
Set wshell = CreateObject("WScript.Shell")
Debug.Print wshell.CurrentDirectory
Но это должно получить тот же результат, что и просто
Debug.Print CurDir
Казалось бы, что ActiveWorkbook не был сохранен...
Попробуйте CurDir()
.
Ваш код: path = ActiveWorkbook.Path
возвращает пустое значение, так как вы еще не сохранили свою книгу.
Чтобы решить проблему, вернитесь к листу Excel, сохраните свой листок и снова запустите свой код.
На этот раз он не будет отображаться пустым, но покажет вам путь, где он находится (текущая папка)
Я надеюсь, что это помогло.
Используйте Application.ActiveWorkbook.Path
только для самого пути (без имени книги) или Application.ActiveWorkbook.FullName
для пути с именем книги.
Это VBA, который я использую, чтобы открыть текущий путь в окне проводника:
Shell Environ("windir") & "\explorer.exe """ & CurDir() & "",vbNormalFocus
Документация Microsoft:
Если вы действительно имеете в виду чистый рабочий каталог, это должно подойти вам.
Решение А:
Dim ParentPath As String: ParentPath = "\"
Dim ThisWorkbookPath As String
Dim ThisWorkbookPathParts, Part As Variant
Dim Count, Parts As Long
ThisWorkbookPath = ThisWorkbook.Path
ThisWorkbookPathParts = Split(ThisWorkbookPath, _
Application.PathSeparator)
Parts = UBound(ThisWorkbookPathParts)
Count = 0
For Each Part In ThisWorkbookPathParts
If Count > 0 Then
ParentPath = ParentPath & Part & "\"
End If
Count = Count + 1
If Count = Parts Then Exit For
Next
MsgBox "File-Drive = " & ThisWorkbookPathParts _
(LBound(ThisWorkbookPathParts))
MsgBox "Parent-Path = " & ParentPath
Но если нет, этого должно быть достаточно.
Решение Б:
Dim ThisWorkbookPath As String
ThisWorkbookPath = ThisWorkbook.Path
MsgBox "Working-Directory = " & ThisWorkbookPath
Извините за невнимательность, ребята,
я не такой профессиональный, как вы, ребята, но мне нужен простой код для определения существующего пути, чтобы использовать его для добавления другого имени листа в открытый код,
целью является создание инструмента объединения для нескольких фиксированных именованных листов,
мне нужно скопировать инструмент моего листа (Макро) в папку, содержащую (День 1, День 2, День 3,...), нажмите на кнопку Consalidate, связанную макросом копирования и вставки, и она объединит лист,
Я создал все это, но я не могу сделать так, чтобы он автоматически определял файлы День 1, День 2, День 3 в другой папке. Мне нужно вручную настраивать пути, по возможности, мне нужно автоматизировать эту часть,
ти
Используйте эти коды и наслаждайтесь им.
Public Function GetDirectoryName(ByVal source As String) As String()
Dim fso, oFolder, oSubfolder, oFile, queue As Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set queue = New Collection
Dim source_file() As String
Dim i As Integer
queue.Add fso.GetFolder(source) 'obviously replace
Do While queue.Count > 0
Set oFolder = queue(1)
queue.Remove 1 'dequeue
'...insert any folder processing code here...
For Each oSubfolder In oFolder.SubFolders
queue.Add oSubfolder 'enqueue
Next oSubfolder
For Each oFile In oFolder.Files
'...insert any file processing code here...
'Debug.Print oFile
i = i + 1
ReDim Preserve source_file(i)
source_file(i) = oFile
Next oFile
Loop
GetDirectoryName = source_file
End Function
И здесь вы можете вызвать функцию:
Sub test()
Dim s
For Each s In GetDirectoryName("C:\New folder")
Debug.Print s
Next
End Sub