Vba excel получить путь к папке

I am using MS Excel 2010 and trying to get the current directory using the below code,

    path = ActiveWorkbook.Path

But ActiveWorkbook.Path returns blank.

Jean-François Corbett's user avatar

asked Nov 6, 2013 at 22:26

Ullan's user avatar

1

When one opens an Excel document D:dbtmptest1.xlsm:

  • CurDir() returns C:Users[username]Documents

  • ActiveWorkbook.Path returns D:dbtmp

So CurDir() has a system default and can be changed.

ActiveWorkbook.Path does not change for the same saved Workbook.

For example, CurDir() changes when you do «File/Save As» command, and select a random directory in the File/Directory selection dialog. Then click on Cancel to skip saving. But CurDir() has already changed to the last selected directory.


[ADD]
Resume VBA for different applications

Access D:dbtmptest1.accdb, like duckboy81 commented:

  1. CurDir() => C:Users[username]Documents
  2. Application.CurrentProject.Path => D:dbtmp

Excel D:dbtmptest1.xlsm:

  1. CurDir() => C:Users[username]Documents
  2. ActiveWorkbook.Path => D:dbtmp
  3. Application.DefaultFilePath => C:Users[username]Documents

Outlook:

  1. CurDir() => C:WINDOWSSystem32
  2. Application.Session.Stores(1).Filepath => D:programdataOutlookmyOutlookDocX.pst

PowerPoint D:dbtmptest1.ppt:

  1. CurDir() => C:Users[username]Documents
  2. ActivePresentation.Path => D:dbtmp

Word D:dbtmptest1.docx:

  1. CurDir() => C:Users[username]Documents
  2. Application.ActiveDocument.Path => D:dbtmp
  3. Application.ActiveDocument.FullName => D:dbtmptest1.docx
  4. Application.StartupPath => C:users[username]appdataroamingmicrosoftwordstartup

answered Nov 6, 2013 at 22:47

jacouh's user avatar

jacouhjacouh

8,3275 gold badges30 silver badges43 bronze badges

3

You have several options depending on what you’re looking for.
Workbook.Path returns the path of a saved workbook. Application.Path returns the path to the Excel executable. CurDir returns the current working path, this probably defaults to your My Documents folder or similar.

You can also use the windows scripting shell object’s .CurrentDirectory property.

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

But that should get the same result as just

Debug.Print CurDir

answered Nov 6, 2013 at 22:35

AndASM's user avatar

AndASMAndASM

9,0961 gold badge20 silver badges33 bronze badges

It would seem likely that the ActiveWorkbook has not been saved…

Try CurDir() instead.

answered Nov 6, 2013 at 22:35

Monty Wild's user avatar

Monty WildMonty Wild

3,9311 gold badge21 silver badges35 bronze badges

1

Your code: path = ActiveWorkbook.Path

returns blank because you haven’t saved your workbook yet.

To overcome your problem, go back to the Excel sheet, save your sheet, and run your code again.

This time it will not show blank, but will show you the path where it is located (current folder)

I hope that helped.

answered Jun 12, 2016 at 15:09

Mohamed Tahir's user avatar

Use Application.ActiveWorkbook.Path for just the path itself (without the workbook name) or Application.ActiveWorkbook.FullName for the path with the workbook name.

answered Nov 9, 2015 at 8:06

Agus Sapurta Sijabat's user avatar

This is the VBA that I use to open the current path in an Explorer window:

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

Microsoft Documentation:

  • CurDir Function
  • Environ Function
  • Shell Function

answered Nov 18, 2018 at 7:55

ashleedawg's user avatar

ashleedawgashleedawg

20k8 gold badges73 silver badges104 bronze badges

If you really mean pure working Directory, this should suit for you.

Solution A:

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

But if don’t, this should be enough.

Solution B:

Dim ThisWorkbookPath As String

ThisWorkbookPath = ThisWorkbook.Path
MsgBox "Working-Directory = " & ThisWorkbookPath 

answered Nov 27, 2018 at 4:45

NOTSermsak's user avatar

NOTSermsakNOTSermsak

3561 gold badge8 silver badges8 bronze badges

Simple Example below:

Sub openPath()
Dim path As String
path = Application.ActivePresentation.path
Shell Environ("windir") & "explorer.exe """ & path & "", vbNormalFocus
End Sub

Amit Verma's user avatar

Amit Verma

8,5408 gold badges34 silver badges40 bronze badges

answered Feb 9, 2021 at 10:46

mariuszm's user avatar

1

Use these codes and enjoy it.

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

And here you can call function:

Sub test()
Dim s
For Each s In GetDirectoryName("C:New folder")
Debug.Print s
Next
End Sub

answered Dec 1, 2014 at 8:44

josef's user avatar

josefjosef

8449 silver badges8 bronze badges

Содержание

  1. Объект FileSystemObject
  2. Синтаксис
  3. Примечания
  4. Методы
  5. Свойства
  6. См. также
  7. Поддержка и обратная связь
  8. Функция Dir
  9. Синтаксис
  10. Параметры
  11. Примечания
  12. См. также
  13. Поддержка и обратная связь
  14. Daily Dose of Excel
  15. Haphazardly Posted Excel Information and Other Stuff
  16. Get the Path to My Documents in VBA
  17. 23 thoughts on “ Get the Path to My Documents in VBA ”

Объект FileSystemObject

Предоставляет доступ к файловой системе компьютера.

Синтаксис

Scripting.FileSystemObject

Примечания

Приведенный ниже код иллюстрирует использование объекта FileSystemObject для возврата объекта TextStream, который можно читать, и в который можно записать данные.

  • Функция CreateObject возвращает объект FileSystemObject ( fs ).
  • Метод CreateTextFile создает файл в качестве объекта TextStream ( a ).
  • Метод WriteLine записывает строку текста в созданный текстовый файл.
  • Метод Close опустошает буфер и закрывает файл.

Методы

Метод Описание
BuildPath Добавляет имя в существующий путь.
CopyFile Копирует один или несколько файлов из одного расположения в другое.
CopyFolder Копирует одну или несколько папок из одного расположения в другое.
CreateFolder Создает новую папку.
CreateTextFile Создает текстовый файл и возвращает объект TextStream, который можно использовать для чтения или записи в файл.
DeleteFile Удаляет один или несколько указанных файлов.
DeleteFolder Удаляет одну или несколько указанных папок.
DriveExists Проверяет, существует ли указанный диск.
FileExists Проверяет, существует ли указанный файл.
FolderExists Проверяет, существует ли указанная папка.
GetAbsolutePathName Возвращает полный путь из корневого каталога диска для указанного пути.
GetBaseName Возвращает базовое имя указанного файла или папки.
GetDrive Возвращает объект Drive, соответствующий диску в указанном пути.
GetDriveName Возвращает имя диска указанного пути.
GetExtensionName Возвращает имя расширения файла для последнего компонента в указанном пути.
GetFile Возвращает объект файла для указанного пути.
GetFileName Возвращает имя файла или папки для последнего компонента в указанном пути.
GetFolder Возвращает объект Folder для указанного пути.
GetParentFolderName Возвращает имя родительской папки последнего компонента в указанном пути.
GetSpecialFolder Возвращает путь к некоторым специальным папкам Windows.
GetTempName Возвращает созданный случайным образом временный файл или папку.
Move Перемещает заданный файл или указанную папку из одного места в другое.
MoveFile Перемещает один или несколько файлов из одного места в другое.
MoveFolder Перемещает одну или несколько папок из одного места в другое.
OpenAsTextStream Открывает указанный файл и возвращает объект TextStream, который можно использовать для считывания, записи и дополнения данных в файле.
OpenTextFile Открывает файл и возвращает объект TextStream, который можно использовать для доступа к файлу.
WriteLine Записывает заданную строку и символ новой строки в файл TextStream.

Свойства

Свойство Описание
Drives Возвращает коллекцию всех объектов Drive на компьютере.
Name Устанавливает или возвращает имя указанного файла или заданной папки.
Path Возвращает путь для указанного файла, диска или указанной папки.
Size Для файлов возвращает размер указанного файла в байтах; для папок возвращает размер всех файлов и вложенных папок в байтах.
Type Возвращает сведения о типе файла или папки (например, для файлов с расширением .TXT возвращается «Text Document»).

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Функция Dir

Возвращает значение типа String, определяющее имя файла, каталога или папки, которое соответствует указанному шаблону, атрибуту файла либо метке тома диска.

Синтаксис

Dir [ (pathname, [ attributes ] ) ]

Синтаксис функции Dir состоит из следующих элементов.

Часть Описание
pathname Необязательный. Строковое выражение, указывающее имя файла; может включать каталог или папку, а также диск. Если файл, указанный параметром pathname, не найден, возвращается строка нулевой длины («»).
attributes Необязательный. Константа или числовое выражение, определяющее атрибуты файла. Если этот параметр опущен, возвращаются файлы, которые соответствуют параметру pathname, но не имеют атрибутов.

Параметры

Константа Значение Описание
vbNormal 0 (По умолчанию.) Определяет файлы без атрибутов.
vbReadOnly 1 В дополнение к файлам без атрибутов определяет файлы, доступные только для чтения.
vbHidden 2 Определяет скрытые файлы, а также файлы без атрибутов.
vbSystem 4 В дополнение к файлам без атрибутов определяет системные файлы. Недоступно в macOS.
vbVolume 8 Определяет метку тома; если указан какой-либо другой атрибут, параметр vbVolume игнорируется. Недоступно в macOS.
vbDirectory 16 В дополнение к файлам без атрибутов определяет каталоги (папки).
vbAlias 64 Указанное имя файла является псевдонимом. Доступно только в macOS.

Эти константы определены в Visual Basic для приложений и могут использоваться в коде вместо фактических значений.

Примечания

В Microsoft Windows и macOS Dir поддерживает использование подстановочных знаков с несколькими символами (*) и одним символом (?) для указания нескольких файлов.

Так как macOS не поддерживает использование подстановочных знаков, для определения группы файлов используйте тип файла. Чтобы вместо имен файлов указать тип файла, воспользуйтесь функцией MacID. Например, следующий оператор возвращает имя первого текстового файла в текущей папке:

Чтобы вывести следующий файл в папке, укажите пустую строку:

Если функция MacID используется с функцией Dir в Microsoft Windows, возникает ошибка.

Любое значение атрибута, превышающее 256, считается значением MacID.

Значение pathname необходимо указать при первом вызове функции Dir, иначе произойдет ошибка. Если задаются атрибуты файла, значение pathname также должно быть указано.

Функция Dir возвращает первое имя файла, соответствующее значению pathname. Для получения дополнительных имен файлов, соответствующих значению pathname, вызовите функцию Dir повторно без аргументов. Если других соответствий найдено не будет, функция Dir возвратит пустую строку («»). После возврата строки нулевой длины в последующих вызовах необходимо указывать значение pathname, иначе произойдет ошибка.

Значение pathname можно изменить без получения всех имен файлов, соответствующих текущему значению pathname. Однако нельзя осуществить рекурсивный вызов функции Dir. С помощью функции Dir с атрибутом vbDirectory невозможно последовательно возвращать подкаталоги.

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

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Daily Dose of Excel

Haphazardly Posted Excel Information and Other Stuff

Get the Path to My Documents in VBA

VBA has an Environ function. To get a list of all the Environ variables you can see, you can use the method at VBA Express. I use the USERPROFILE argument like this

You can also use the Windows API as described at My Documents + Environment Variables

23 thoughts on “ Get the Path to My Documents in VBA ”

One can also look up Excel VBA help for ‘environ’ (w/o the quotes) and get pretty exhaustive information including what I suspect is the “base” code for most examples one finds on various websites.

Your code gives an incorrect answer on my system. It returns “C:Documents and SettingsusernameMy Documents”, but that folder doesn’t exist on this computer. I have the “My Documents” folder on a different drive than the username folder. In fact, I don’t have a folder called “My Documents” anywhere. But, I can click on the “My Documents” folder that is on my desktop and it will show me the same files as if I navigated directly to “D:username”.

I did a quick search for an environment variable that would expose where this desktop folder actually points to, but I came up empty-handed.

Environ is okay for some directory lookups, but to get them all, reliably, you need to use Windows APIs:

Private Declare Function SHGetFolderPath Lib “shfolder.dll” _
Alias “SHGetFolderPathA” _
( ByVal hwndOwner As Long , _
ByVal nFolder As Long , _
ByVal hToken As Long , _
ByVal dwReserved As Long , _
ByVal lpszPath As String ) As Long

Function MyDocumentsDir()
Dim sBuffer As String
sBuffer = Space$(260)
If SHGetFolderPath(&H0, &H5, -1, &H0, sBuffer) = 0 Then
MyDocumentsDir = Left$(sBuffer, lstrlenW(StrPtr(sBuffer)))
End If
End Function

Another way using Wscript:

MsgBox objFolders( “desktop” )
MsgBox objFolders( “allusersdesktop” )
MsgBox objFolders( “sendto” )
MsgBox objFolders( “startmenu” )
MsgBox objFolders( “recent” )
MsgBox objFolders( “favorites” )
MsgBox objFolders( “mydocuments” )
End Function

I had the environ function in my notes for a rainy day, can’t remember why I Googled it in the first place. being in application support where I get to tinker with all sorts of software I’m always interested in finding the ‘joins’ between them. Usually knowing the strengths and capabilities of different scripting languages and software, plus where they can be joined to feed one into the next, gives me the sort of quick and dirty answers I need.

But Dick specifies it as Environ$, why the $? is it purely optional or does it have a modifying effect?

It’s a habit I developed based on that article.

Mike, your code using Wscript correctly identified where the “My Documents” folder on my desktop actually resides on my computer. I’m sure you knew it would! Thank you for that.

I’ve done a couple minor one-off type spreadsheets that relied on nobody doing what I did to my home computer. That’s not optimal and was bound to backfire on me some day. Now I can fix the code.

The other part I like about it is that I can actually read and follow the code. I know I could incorporate that into my projects without wondering why it worked.

Omar:
“I can actually read and follow the code..I know I could incorporate that into my projects without wondering why it worked.”

You know…it’s funny you say that. I recently spent some time gathering some code examples for a class I’m giving and I realized that I often lean toward variations of code that I can read and understand. I’m sure that leaves me doing some things “inefficiently”. But I’m willing to trade some inefficiency for something I can read and explain to others.

I remember Bill Jelen once told me that Aladin Akyurek (a poster on his site) creates the most amazing array formulas to solve most problems. He tells people that if they ever get a formula from Aladin, just copy and paste it into the cell. Don’t worry how it works…it will just work. I can, of course, appreciate the charm of that statement, but I know it would frustrate me on some level to have some formula I don’t fully understand working in my spreadsheet.

I guess I feel the same way about code.

Mike, my lesson is some code (found on the internet from a trustworthy source) that I’m using to add and remove file folders. This particular code won’t remove a folder with a hidden or system file in it. Which means most folders that have had a picture in it that has been viewed using Thumbnails. Since the purpose of these folders is to contain pictures, well you get the idea. I end up copying the list of folders that need removing to a DOS batch file and delete them that way.

Since I don’t understand the code, I don’t know how to modify it, or whether it is even possible to modify it.

I had no idea you could access Wscript from VBA. I will be looking into that possibility to do this task.

I agree with Jon the only reliable way to get the system folders is with the API. Environ can certainly fail (as in not return an expected result) in some systems and WScript might be disabled (it’s also slow while the object is created).

For readability use the conventionally named constants, eg
Const CSIDL_PERSONAL = &H5 ‘ my documents
(ignore any “amp;” that might creep in before the “H”)

Thanks to Mike (Alexander) .. in the environment I’m working in we have roaming profiles and the my documents folder is set to a network folder, yours was the only method that actually picked up the right address so thanks a lot for posting it!

[…] Forums http://www.thecodecage.com/forumz/excel-vba-programming/160189-file-path.html#post579392 Daily Dose of Excel » Blog Archive » Get the Path to My Documents in VBA and here Locating Home My Documents Folder – Excel Help & Excel Macro Help […]

To be sure, the code should probably look like the following (it’s missing an extra “\” &

Источник

I have a macro-enabled WorkBook. I need to specify the current folder in which the macro-enabled file is present as the path. I tried setting

path = ActiveWorkbook.Path

and

path = CurDir()

but neither of these work for me. Any idea on this?

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Apr 18, 2012 at 18:27

user1270123's user avatar

9

If the path you want is the one to the workbook running the macro, and that workbook has been saved, then

ThisWorkbook.Path

is what you would use.

answered Apr 18, 2012 at 19:04

Tim Williams's user avatar

Tim WilliamsTim Williams

150k8 gold badges96 silver badges124 bronze badges

0

I thought I had misunderstood but I was right. In this scenario, it will be ActiveWorkbook.Path

But the main issue was not here. The problem was with these 2 lines of code

strFile = Dir(strPath & "*.csv")

Which should have written as

strFile = Dir(strPath & "*.csv")

and

With .QueryTables.Add(Connection:="TEXT;" & strPath & strFile, _

Which should have written as

With .QueryTables.Add(Connection:="TEXT;" & strPath & "" & strFile, _

answered Apr 18, 2012 at 20:14

Siddharth Rout's user avatar

Siddharth RoutSiddharth Rout

146k17 gold badges206 silver badges250 bronze badges

 

voice

Пользователь

Сообщений: 23
Регистрация: 24.06.2016

Доброго времени суток! У меня следующая проблема:

Есть файл, который копируется на разные ПК и, соответственно, запускается с разных мест. С этим же файлом в папке присутствует подпапка, содержащая файлы.
Пример:
D:WorkN100Excel.xls
D:WorkN100Data1
D:WorkN100Data2

В VBA у меня есть скрипт, который открывает эти файлы и копирует их содержимое в данный Excel. Но там конкретный путь, и при перемещении папки в другое место он работать не будет. Как сделать так, чтобы при изменении пути к файлу Excel данные копировались? Папка Data и файлы в ней всегда имеют постоянные имена. Наример:
F:JobN101Excel.xls
F:JobN101Data1
F:JobN101Data2

Надеюсь я изложить суть вопроса ясно…
Очень надеюсь на вашу помощь!

 

dmt.

Пользователь

Сообщений: 91
Регистрация: 23.06.2014

#2

07.12.2016 22:23:11

Добрый день!

Цитата
voice написал:
при перемещении папки в другое место он работать не будет.

Перемещение осуществляется вашим скриптом или уже пользователем?

 

voice

Пользователь

Сообщений: 23
Регистрация: 24.06.2016

Пользователем. То есть с этими данными работают люди на разных ПК с разными путями. И я хочу сделать кнопку, при нажатии которой данные будут копироваться независимо от пути. То есть, например, Excel определяет из какой папки он открыт и обращается уже к этой папке дальше. В данное случае к подпапке, но мне кажется, что это уже нюансы  

 

dmt.

Пользователь

Сообщений: 91
Регистрация: 23.06.2014

Единственное, что сразу приходит на ум, так это в файлы, которые копируются добавить макрос, который при открытии файла пользователем (независимо от того где находится данный файл) будет передавать путь в общий файл, но для этого пользователь должен давать согласие на запуск макросов при открытии файла. После того как вы будете нажимать кнопку ваш макрос уже будет проходить по путям переданным из ранее открытых файлов пользователями.

Изменено: dmt.07.12.2016 22:32:55

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#5

07.12.2016 22:33:30

Код
pth = thisworkbook.path & "data"
fLnm1 = pth & "01"
fLnm2 = pth & "02"

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

voice

Пользователь

Сообщений: 23
Регистрация: 24.06.2016

#6

07.12.2016 22:34:05

Цитата
dmt. написал:
Единственное, что сразу приходит на ум, так это в файлы, которые копируются добавить макрос…

Невозможно, так как файлы в подпапке не экселевские… Их приходится открывать через Excel, выбирать разделители и т.п.

Изменено: voice07.12.2016 22:41:31

 

voice

Пользователь

Сообщений: 23
Регистрация: 24.06.2016

Ігор Гончаренко, скажите, а если я сделаю таким образом:
ThisWorkbook.Path & «Data1»  ‘когда ссылаюсь уже к конкретному файлу
То моя задача решится? По-моему должна

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#8

07.12.2016 22:55:12

Цитата
То моя задача решится? По-моему должна

Перед тем, как спросить, нужно попробовать, да?

Конкретный файл с именем 01? Нужно добавить расширение.

 

voice

Пользователь

Сообщений: 23
Регистрация: 24.06.2016

#9

07.12.2016 22:57:28

Цитата
vikttur написал:
Перед тем, как спросить, нужно попробовать, да?

Полностью согласен.
Спасибо всем

  • Список файлов
  • Работа с файлами

Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип/расширение выбираемого файла)

Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.

Функция GetFolderPath работает также, только служит для вывода диалогового окна выбора папки.

Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
                       Optional ByVal InitialPath As String = "c:") As String
    ' функция выводит диалоговое окно выбора папки с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
    Dim PS As String: PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        GetFolderPath = .SelectedItems(1)
        If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function
 
Sub ПримерИспользования_GetFolderPath()
    ПутьКПапке = GetFolderPath("Заголовок окна", ThisWorkbook.Path)   ' запрашиваем имя папки
    If ПутьКПапке = "" Then Exit Sub    ' выход, если пользователь отказался от выбора папки
    MsgBox "Выбрана папка: " & ПутьКПапке, vbInformation
End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
                     Optional ByVal InitialPath As String = "c:", _
                     Optional ByVal FilterDescription As String = "Книги Excel", _
                     Optional ByVal FilterExtention As String = "*.xls*") As String
    ' функция выводит диалоговое окно выбора файла с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
    ' для фильтра можно указать описание и расширение выбираемых файлов
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
    End With
End Function
 
Sub ПримерИспользования_GetFilePath()
    ИмяФайла = GetFilePath("Выберите файл Word", , "Документы Word", "*.doc") ' запрашиваем имя файла
    If ИмяФайла = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub

Ниже представлены функции для вызова диалоговых окон выбора файлов и папок средствами VBA.

Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и типрасширение выбираемого файла)

Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.

Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.

Function GetFileName(Optional ByVal Title As String = "Выберите файл для обработки", _
                     Optional ByVal InitialPath, _
                     Optional ByVal MyFilter As String = "Книги Excel (*.xls*),") As String
    ' функция выводит диалоговое окно выбора папки с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
    If Not IsMissing(InitialPath) Then
        On Error Resume Next: ChDrive Left(InitialPath, 1)
        ChDir InitialPath    ' выбираем стартовую папку
    End If
    res = Application.GetOpenFilename(MyFilter, , Title, "Открыть")  ' вывод диалогового окна
    GetFileName = IIf(VarType(res) = vbBoolean, "", res)    ' пустая строка при отказе от выбора
End Function
 
Sub ПримерИспользования_GetFileName()
    ИмяФайла = GetFileName("Заголовок окна", ThisWorkbook.Path)   ' запрашиваем имя файла
    ' ===================== другие варианты вызова функции =====================
    ' текстовые файлы, стартовая папка не указана
    '       ИмяФайла = GetFileName("Выберите текстовый файл", , "Текстовые файлы (*.txt),")
    ' файлы любого типа из папки "C:Windows"
    '       ИмяФайла = GetFileName(, "C:Windows", "")
    ' ==========================================================================

    If ИмяФайла = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", _
                       Optional ByVal InitialPath As String = "c:") As String
    ' функция выводит диалоговое окно выбора папки с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранной папке, или пустую строку в случае отказа от выбора
    Dim PS As String: PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        GetFolderPath = .SelectedItems(1)
        If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function
 
Sub ПримерИспользования_GetFolderPath()
    ПутьКПапке = GetFolderPath("Заголовок окна", ThisWorkbook.Path)   ' запрашиваем имя папки
    ' ===================== другие варианты вызова функции =====================
    ' стартовая папка не указана, заголовок окна по умолчанию
    '       ПутьКПапке = GetFolderPath
    ' обзор папок начинается с папки "Рабочий стол"
    '       СтартоваяПапка = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    '       ПутьКПапке = GetFolderPath("Выберите папку на рабочем столе", СтартоваяПапка)
    ' ==========================================================================

    If ПутьКПапке = "" Then Exit Sub    ' выход, если пользователь отказался от выбора папки
    MsgBox "Выбрана папка: " & ПутьКПапке, vbInformation
End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
                     Optional ByVal InitialPath As String = "c:", _
                     Optional ByVal FilterDescription As String = "Книги Excel", _
                     Optional ByVal FilterExtention As String = "*.xls*") As String
    ' функция выводит диалоговое окно выбора файла с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
    ' для фильтра можно указать описание и расширение выбираемых файлов
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
    End With
End Function
 
Sub ПримерИспользования_GetFilePath()
     ИмяФайла = GetFilePath("Выберите файл Word", , "Документы Word", "*.doc") ' запрашиваем имя файла
    ' ===================== другие варианты вызова функции =====================
    ' текстовые файлы, стартовая папка не указана
    '       ИмяФайла = GetFilePath("Выберите текстовый файл", , "Текстовые файлы", "*.txt")
    ' файлы любого типа из папки "C:Windows"
    '       ИмяФайла = GetFilePath(, "C:Windows", , "*")
    ' ==========================================================================

    If ИмяФайла = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    MsgBox "Выбран файл: " & ИмяФайла, vbInformation
End Sub
Function GetFilenamesCollection(Optional ByVal Title As String = "Выберите файлы для обработки", _
                             Optional ByVal InitialPath As String = "c:") As FileDialogSelectedItems
    ' функция выводит диалоговое окно выбора нескольких файлов с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает массив путей к выбранным файлам, или пустую строку в случае отказа от выбора
    With Application.FileDialog(3) ' msoFileDialogFilePicker
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        Set GetFilenamesCollection = .SelectedItems
    End With
End Function
 
Sub ПримерИспользования_GetFilenamesCollection()
    Dim СписокФайлов As FileDialogSelectedItems
    Set СписокФайлов = GetFilenamesCollection("Заголовок окна", ThisWorkbook.Path)   ' выводим окно выбора
    ' ===================== другие варианты вызова функции =====================
    ' стартовая папка не указана, заголовок окна по умолчанию
           Set СписокФайлов = GetFilenamesCollection
    ' обзор файлов начинается с папки "Рабочий стол"
           СтартоваяПапка = CreateObject("WScript.Shell").SpecialFolders("Desktop")
           Set СписокФайлов = GetFilenamesCollection("Выберите файлы на рабочем столе", СтартоваяПапка)
    ' ==========================================================================

    If СписокФайлов Is Nothing Then Exit Sub  ' выход, если пользователь отказался от выбора файлов
    For Each File In СписокФайлов
        Debug.Print File
    Next
End Sub

Ещё один вариант кода (который я использую) для выбора файла
Его отличие — функция запоминает папку, из которой последний раз выбирался файл,
и при повторном запуске диалогового окна выбора файла,
обзор папок будет начат с той папки, откуда последний раз был взят файл.

Sub AttachFile_test()    ' пример использования
    Filename$ = GetFilePath()
    If Filename$ = "" Then Exit Sub
    MsgBox "Выбран файл: " & Filename$
End Sub
 
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
                     Optional ByVal InitialPath As String = "c:", _
                     Optional ByVal FilterDescription As String = "Файлы счетов", _
                     Optional ByVal FilterExtention As String = "*.*") As String
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title:
        .InitialFileName = GetSetting(Application.Name, "GetFilePath", "folder", InitialPath)
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1)
        folder$ = Left(.SelectedItems(1), InStrRev(.SelectedItems(1), ""))
        SaveSetting Application.Name, "GetFilePath", "folder", folder$
    End With
End Function
  • 214439 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Понравилась статья? Поделить с друзьями:
  • Vba excel получить имя файла без расширения
  • Vba excel посчитать количество символов в строке
  • Vba excel получить имя текущей книги
  • Vba excel посчитать количество заполненных ячеек в столбце
  • Vba excel получить имя пользователя