Функция VBA DIR - Лесно обяснение с примери

VBA има някои полезни функции, които могат да изведат вашата автоматизация в Excel на следващото ниво.

Една такава функция е VBA DIR функция.

Макар и само по себе си, това може да изглежда като проста функция, която прави едно конкретно нещо.

Но когато го комбинирате с някои други полезни елементи на кодиращия език VBA, можете да създадете мощни неща (обхванати в примерите по -късно в този урок).

Какво прави VBA Dir функция?

Използвайте функцията VBA DIR, когато искате да получите името на файла или папката, като използвате името на пътя им.

За да ви дадем пример, ако имате Excel файл в папка, можете да използвате функцията VBA DIR, за да получите името на този Excel файл (или всеки друг тип файл).

Ами ако искам да получа имената на всички Excel файлове в папката (или всички файлове - било то Excel файл или не)?

Можете да направите и това!

Когато използвате функцията DIR веднъж, тя връща име на първия файл в папка. Сега, ако искате да получите имената и на втория, третия, четвъртия файл, можете да използвате функцията DIR отново (разгледана по -късно като пример).

Реж връща първото име на файла, което съответства на името на пътя. За да получите допълнителни имена на файлове, които съответстват на името на пътя, обадете се Реж отново без аргументи. Когато повече имена на файлове не съвпадат, Реж връща низ с нулева дължина („”). Разгледани в Примери 3 и 4 по -късно в този урок.

Синтаксис на VBA DIR функция

Dir [(име на път [, атрибути])]
  • pathname: Това е незадължителен аргумент. Това може да бъде името на файла, името на папката или името на директорията. Ако името на пътя не е намерено, функцията VBA DIR връща низ с нулева дължина (“”)
  • атрибути: Това е незадължителен аргумент. Можете да използвате този аргумент, за да посочите някои атрибути и функцията DIR ще върне имената на файловете въз основа на тези атрибути. Например, ако искате списък на всички скрити файлове или файлове само за четене (заедно с файлове без атрибути), трябва да посочите това в този аргумент.

Атрибути, достъпни за използване във функцията VBA DIR (можете да използвате един или повече от тях):

Постоянен Стойност Описание
vbНормално 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 има три заместващи знака:

  1. * (звездичка) - Той представлява произволен брой знаци. Например, 2019* ще ви даде имената на всички файлове с префикс2021-2022 в него.
  2. ? (въпросителен знак) - Той представлява един единствен знак. Например 2021-2022 г.? ще ви даде имената на всички файлове, които започват с 2021-2022 и имат още един знак в името (като 2021-2022A, 2021-2022B, 2021-2022C и т.н.)

Забележка: Има още един заместващ знак - тилда (~). Тъй като не се използва много, пропуснах обяснението му. Можете да прочетете повече за това тук, ако се интересувате.

Функция VBA DIR - Примери

Сега нека се потопим и да видим някои примери за използване на функцията VBA DIR.

Пример 1 - Получаване на името на файла от неговия път

Когато имате пътя на файл, можете да използвате функцията DIR, за да получите името на файла от него.

Например, кодът по -долу връща името на файла и го показва в поле за съобщение.

Sub GetFileNames () Dim FileName As 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") If FileName "" Тогава MsgBox Име на файла Друг MsgBox "Файл не съществува" Край, ако край Под

Пример 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.

Кодът по -долу изброява всички файлове и имена на папки в тестовата папка (която се намира на следния път - C: \ Users \ sumit \ Desktop \ Test \).

Използвам Debug.Print, за да покажа имената в прозореца Незабавен. Можете също да използвате това, за да изброите имената в поле за съобщение или в колона в Excel.

Sub GetAllFile & FolderNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \", vbDirectory) Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub

Цикълът До докато в горния код продължава, докато всички файлове и папки в дадения път бъдат покрити. Когато няма повече файлове/папки за покриване, FileName става нулев низ и цикълът спира.

Пример 4 - Вземете имената на всички файлове в папка

Можете да използвате кода по-долу, за да получите имената на всички файлове в папка/директория (а не имената на подпапките).

Sub GetAllFileNames () Dim FileName As String FileName = Dir ("C: \ Users \ sumit \ Desktop \ Test \") Do While 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 "" If GetAttr (PathName & FileNactory) = vb Debug.Print FileName End Ако 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 Име на файла Краен под

Обърнете внимание, че съм използвал * .xls * (звездичка от двете страни). Това ще гарантира, че всички версии на файловете на Excel са проверени (.xls, xlsx, .xlsm, .xlsb).

Пример 7 - Вземете имена на всички Excel файлове в папка

Използвайте кода по -долу, за да получите имената на всички файлове на Excel в папката Test.

Sub GetAllFileNames () Dim FolderName As String Dim FileName As String FolderName = "C: \ Users \ sumit \ Desktop \ Test \" FileName = Dir (FolderName & "*.xls*") Do While FileName "" Debug.Print FileName FileName = Dir () Loop End Sub

Докато функцията DIR връща името само на първия Excel файл, тъй като го извикваме отново в цикъла, той преминава през всички файлове и ни дава имената на всички Excel файлове.

Надявам се, че сте намерили този урок и примерите за полезни.

Кажете ми вашите мисли в секцията за коментари.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave