Подтвердить что ты не робот

Как получить текущий рабочий каталог с помощью vba?

Я использую MS Excel 2010 и пытаюсь получить текущий каталог, используя приведенный ниже код,

    path = ActiveWorkbook.Path

Но ActiveWorkbook.Path возвращает пустое.

4b9b3361

Ответ 1

Я тестировал это:

Когда я открываю документ Excel D:\db\tmp\test1.xlsm:

  • CurDir() возвращает C:\Users\[username]\Documents

  • ActiveWorkbook.Path возвращает D:\db\tmp

Итак, CurDir() имеет системную настройку и может быть изменен.

ActiveWorkbook.Path не изменяется для одной и той же сохраненной рабочей книги.

Например, CurDir() изменяется, когда вы выполняете команду "Файл/Сохранить как" и выбираете случайный каталог в диалоговом окне выбора файла/каталога. Затем нажмите "Отмена", чтобы пропустить сохранение. Но CurDir() уже изменился на последний выбранный каталог.

Ответ 2

У вас есть несколько вариантов в зависимости от того, что вы ищете. Workbook.Path возвращает путь к сохраненной книге. Application.Path возвращает путь к исполняемому файлу Excel. CurDir возвращает текущий рабочий путь, вероятно, по умолчанию используется папка "Мои документы" или аналогичная.

Вы также можете использовать свойство оболочки оболочки сценариев .CurrentDirectory.

Set wshell = CreateObject("WScript.Shell")
Debug.Print wshell.CurrentDirectory

Но это должно получить тот же результат, что и просто

Debug.Print CurDir

Ответ 3

Казалось бы, что ActiveWorkbook не был сохранен...

Попробуйте CurDir().

Ответ 4

Ваш код: path = ActiveWorkbook.Path

возвращает пустое значение, так как вы еще не сохранили свою книгу.

Чтобы решить проблему, вернитесь к листу Excel, сохраните свой листок и снова запустите свой код.

На этот раз он не будет отображаться пустым, но покажет вам путь, где он находится (текущая папка)

Я надеюсь, что это помогло.

Ответ 5

Используйте Application.ActiveWorkbook.Path только для самого пути (без имени книги) или Application.ActiveWorkbook.FullName для пути с именем книги.

Ответ 6

Это VBA, который я использую, чтобы открыть текущий путь в окне проводника:

Shell Environ("windir") & "\explorer.exe """ & CurDir() & "",vbNormalFocus

Документация Microsoft:

Ответ 7

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

Решение А:

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 

Ответ 8

Извините за невнимательность, ребята,

я не такой профессиональный, как вы, ребята, но мне нужен простой код для определения существующего пути, чтобы использовать его для добавления другого имени листа в открытый код,

целью является создание инструмента объединения для нескольких фиксированных именованных листов,

мне нужно скопировать инструмент моего листа (Макро) в папку, содержащую (День 1, День 2, День 3,...), нажмите на кнопку Consalidate, связанную макросом копирования и вставки, и она объединит лист,

Я создал все это, но я не могу сделать так, чтобы он автоматически определял файлы День 1, День 2, День 3 в другой папке. Мне нужно вручную настраивать пути, по возможности, мне нужно автоматизировать эту часть,

ти

Ответ 9

Используйте эти коды и наслаждайтесь им.

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