VBA имеет несколько полезных функций, которые могут поднять вашу автоматизацию в Excel на новый уровень.
Одной из таких функций является Функция VBA DIR.
Хотя само по себе это может показаться простой функцией, которая выполняет одну конкретную задачу.
Но когда вы комбинируете его с некоторыми другими полезными элементами языка кодирования VBA, вы можете создавать мощные вещи (рассмотренные в примерах далее в этом руководстве).
Что делает функция VBA Dir?
Используйте функцию VBA DIR, если вы хотите получить имя файла или папки, используя их путь.
В качестве примера: если у вас есть файл Excel в папке, вы можете использовать функцию VBA DIR, чтобы получить имя этого файла Excel (или любого другого типа файла).
Что, если я хочу получить имена всех файлов Excel в папке (или всех файлов - будь то файл Excel или нет)?
Вы тоже можете это сделать!
Когда вы используете функцию DIR один раз, она возвращает имя первого файла в папке. Теперь, если вы хотите получить имена второго, третьего и четвертого файлов, вы можете снова использовать функцию DIR (в качестве примера она будет рассмотрена позже).
Dir возвращает первое имя файла, которое соответствует пути. Чтобы получить любые дополнительные имена файлов, соответствующие имени пути, вызовите Dir снова без аргументов. Когда имена файлов больше не совпадают, Dir возвращает строку нулевой длины («»). Рассматривается в примерах 3 и 4 далее в этом руководстве.Синтаксис функции VBA DIR
Dir [(путь [, атрибуты])]
- путь: Это необязательный аргумент. Это может быть имя файла, имя папки или имя каталога. Если путь не найден, функция VBA DIR возвращает строку нулевой длины («»).
- атрибуты: Это необязательный аргумент. Вы можете использовать этот аргумент, чтобы указать некоторые атрибуты, и функция DIR вернет имена файлов на основе этих атрибутов. Например, если вам нужен список всех скрытых файлов или файлов, доступных только для чтения (вместе с файлами без атрибутов), вам необходимо указать это в этом аргументе.
Атрибуты, доступные для использования в функции VBA DIR (вы можете использовать один или несколько из них):
Постоянный | Стоимость | Описание |
vbNormal | 0 | (По умолчанию) Указывает файлы без атрибутов. |
vbReadOnly | 1 | Задает файлы, доступные только для чтения, в дополнение к файлам без атрибутов. |
vbHidden | 2 | Задает скрытые файлы в дополнение к файлам без атрибутов. |
VbSystem | 4 | Задает системные файлы в дополнение к файлам без атрибутов. Недоступно на Macintosh. |
vbVolume | 8 | Задает метку тома; если указан любой другой атрибут, vbVolume игнорируется. Недоступно на Macintosh. |
vbDirectory | 16 | Задает каталоги или папки в дополнение к файлам без атрибутов. |
vbAlias | 64 | Указанное имя файла является псевдонимом. Доступно только на Macintosh. |
Использование подстановочных знаков с функцией DIR
Если вы работаете с Windows, вы также можете использовать подстановочные знаки в функции DIR.
Обратите внимание, что вы не можете использовать их при работе с VBA в Macintosh.
Использование подстановочных знаков может быть полезно в следующих случаях:
- Вы хотите получить имена файлов определенного типа (например, .XLSX или .PPTX)
- Когда у вас есть определенный суффикс / префикс в именах файлов и вы хотите получить имена этих файлов / папок / каталогов. Например, если вам нужны имена всех файлов с префиксом 2021-2022 в нем, вы можете сделать это с помощью подстановочных знаков.
В Excel есть три подстановочных символа:
- * (звездочка) - Он представляет собой любое количество символов. Например, 2019* даст вам имена всех файлов с префиксом 2021-2022 в нем.
- ? (вопросительный знак) - Он представляет собой один-единственный персонаж. Например, 2021-2022? даст вам имена всех файлов, которые начинаются с 2021-2022 и содержат еще один символ в имени (например, 2021-2022A, 2021-2022B, 2021-2022C и т. д.)
Примечание: есть еще один подстановочный знак - тильда (~). Поскольку он используется нечасто, я пропустил его объяснение. Если интересно, вы можете прочитать об этом здесь.
Функция VBA DIR - Примеры
Теперь давайте погрузимся в несколько примеров использования функции VBA DIR.
Пример 1 - Получение имени файла по его пути
Если у вас есть путь к файлу, вы можете использовать функцию DIR, чтобы получить от него имя файла.
Например, приведенный ниже код возвращает имя файла и показывает его в окне сообщения.
Sub GetFileNames () Dim FileName как String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") MsgBox FileName End Sub
В приведенном выше коде используется переменная FileName для хранения имени файла, возвращаемого функцией DIR. Затем он использует окно сообщения для отображения имени файла (как показано ниже).
А что будет, если файла не существует?
В этом случае функция DIR вернет пустую строку.
В приведенном ниже коде используется оператор If Then Else, чтобы проверить, существует ли файл или нет. Если файл не существует, отображается окно сообщения с текстом «Файл не существует», в противном случае отображается имя файла.
Sub CheckFileExistence () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \ Excel File A.xlsx") Если FileName "" Then MsgBox FileName Else MsgBox "File Doesn't Exist" End If End Sub
Пример 2. Проверьте, существует ли каталог (и создайте, если его нет)
Приведенный ниже код проверяет, существует ли папка «Test».
Окно сообщения используется для отображения сообщения, если папка существует или не существует.
Sub CheckDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) If CheckDir "" Тогда MsgBox CheckDir & "существует" Else MsgBox "Каталог не существует "End If End Sub
Вы можете дополнительно уточнить этот код, чтобы проверить, существует ли папка или нет, и если это не так, вы можете использовать VBA для создания этой папки.
Ниже приведен код, в котором используется Функция MkDir для создания папки, если ее не существует.
Sub CreateDirectory () Dim PathName As String Dim CheckDir As String PathName = "C: \ Users \ sumit \ Desktop \ Test" CheckDir = Dir (PathName, vbDirectory) If CheckDir "" Тогда MsgBox CheckDir & "папка существует" Else MkDir PathName MsgBox «Создана папка с таким именем» & CheckDir End If End Sub
Пример 3 - Получение имен всех файлов и папок в каталоге
Если вы хотите получить список всех имен файлов и папок в каталоге, вы можете использовать функцию DIR.
В приведенном ниже коде перечислены все файлы и имена папок в папке Test (которая находится по следующему пути - C: \ Users \ sumit \ Desktop \ Test \).
Я использую Debug.Print, чтобы отображать имена в окне Immediate. Вы также можете использовать это, чтобы перечислить имена в окне сообщения или в столбце Excel.
Sub GetAllFile & FolderNames () Dim FileName как String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \", vbDirectory) Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Цикл Do While в приведенном выше коде продолжается до тех пор, пока не будут покрыты все файлы и папки по заданному пути. Когда больше нет файлов / папок для покрытия, FileName становится пустой строкой, и цикл останавливается.
Пример 4 - Получить имена всех файлов в папке
Вы можете использовать приведенный ниже код, чтобы получить имена всех файлов в папке / каталоге (а не имена подпапок).
Sub GetAllFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \") Выполнить, пока FileName "" Debug.Print FileName FileName = Dir () Loop End Sub
Этот код похож на код, использованный в примере 3, с одним незначительным отличием.
В этом коде я не указал vbDirectory в функции DIR. Когда вы укажете vbDirectory, он даст вам имена всех файлов, а также папок.
Если вы не укажете vbDirectory, функция DIR выдаст вам только имена файлов.
Примечание: Если вы хотите получить имена всех файлов в основной папке и подпапках, вы не можете использовать функцию DIR (поскольку она не рекурсивная). Для этого вы можете либо использовать Power Query (кодирование не требуется), либо использовать объект файловой системы в VBA (с рекурсией).
Пример 5 - Получить имена всех подпапок в папке
Приведенный ниже код даст вам имена всех подпапок в указанной папке.
Он использует Функция GetAtr в VBA, что позволяет нам проверить, является ли имя, возвращаемое функцией DIR, именем файла или папки / каталога.
Sub GetSubFolderNames () Dim FileName As String Dim PathName As String PathName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (PathName, vbDirectory) Do While FileName "" Если GetAttr (PathName & FileName) = vbDirectory, то Debug.Print Имя файла End If FileName = Dir () Loop End Sub
Опять же, я использую Debug.Print, чтобы получить имена в непосредственном окне. Вы можете получить их в окне сообщения или в Excel (изменив код соответствующим образом).
Пример 6 - Получение первого файла Excel из папки
С помощью функции DIR вы можете указать расширение файла или любой суффикс / префикс, который вы хотите в возвращаемом имени файла.
В приведенном ниже коде будет отображаться имя первого файла Excel в папке Test.
Sub GetFirstExcelFileName () Dim FileName As String Dim PathName As String PathName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (PathName & "* .xls *") MsgBox FileName End Sub
Обратите внимание, что я использовал * .xls * (знак звездочки с обеих сторон). Это обеспечит проверку всех версий файлов Excel (.xls, xlsx, .xlsm, .xlsb).
Пример 7 - Получить имена всех файлов Excel в папке
Используйте приведенный ниже код, чтобы получить имена всех файлов Excel в папке Test.
Sub GetAllFileNames () Dim FolderName как String Dim FileName As String FolderName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (FolderName & "* .xls *") Сделать, пока FileName "" Debug.Print FileName FileName = Dir () Подпрограмма конца цикла
Хотя функция DIR возвращает имя только первого файла Excel, поскольку мы снова вызываем его в цикле, она просматривает все файлы и дает нам имена всех файлов Excel.
Надеюсь, вы нашли этот учебник и примеры полезными.
Сообщите мне свои мысли в разделе комментариев.