Vba excel посчитать количество файлов в папке

Обновлено: 08.07.2024

Здравствуйте. Помогите пожалуйста!. Хочу создать пользовательский шаблон Word. В шаблоне есть таблица в одну строку, в таблице есть ячейка, где должен указываться порядковый номер документа. Нужен макрос, который подсчитает количество файлов определённого формата и в определённой папке и выведет сумму в ячейку для порядкового номера. Английский не знаю, в программировании - ноль. Нашёл подходящий макрос в интернете - только для Excel. Как переделать - естественно не знаю. И ещё просьба. Пожалуйста, укажите в программном коде место (строку) где можно поменять формат файла, путь к папке и ячейку, куда выводить сумму файлов. Может быть придётся изменять шаблон. Спасибо.

Образец.docx 15.16 Кб, 1 скачиваний с 2017-02-16

You don't have the permssions to download the attachments of this post.

2 Ответ от Fck_This 16.02.2017 13:37:57

Здравствуйте. Помогите пожалуйста! Спасибо.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

3 Ответ от rbgjdew 17.02.2017 06:41:31

Fck_This Спасибо большущее. Мир не без добрых людей! Буду пробовать делать шаблон.

4 Ответ от rbgjdew 17.02.2017 08:51:52

Здравствуйте. Помогите пожалуйста! Спасибо.

Добрый день. Скопировал код, вставил в окно кода, Изменил путь,формат,номер столбца, сохранил файл. Код не работает. Пишет: "Запрашиваемый номер семейства не существует" Подскажите пожалуйста, что я неправильно сделал?

Снимок VBA.jpg 70.81 Кб, 1 скачиваний с 2017-02-17

You don't have the permssions to download the attachments of this post.

5 Ответ от rbgjdew 17.02.2017 08:54:51

Запуск в VBA.jpg 228.65 Кб, 1 скачиваний с 2017-02-17

You don't have the permssions to download the attachments of this post.

6 Ответ от yshindin 17.02.2017 09:35:06

Подскажите пожалуйста, что я неправильно сделал?

Попробуйте для начала следующее
1. Вместо строки
Dim oFSO, oFolder As Object
укажите
Dim oFSO as Object, oFile as Object, oFolder as Object
Dim sName as String
2. В VBA-проекте (Alt+F11) выберите Tools > References и добавьте в список подключаемых ресурсов ссылку на "Microsoft Scripting Runtime"

7 Ответ от rbgjdew 17.02.2017 10:22:16

Подскажите пожалуйста, что я неправильно сделал?

Попробуйте для начала следующее
1. Вместо строки
Dim oFSO, oFolder As Object
укажите
Dim oFSO as Object, oFile as Object, oFolder as Object
Dim sName as String
2. В VBA-проекте (Alt+F11) выберите Tools > References и добавьте в список подключаемых ресурсов ссылку на "Microsoft Scripting Runtime"

8 Ответ от Fck_This 17.02.2017 10:25:40

Декларация особо не поменяет ничего. А вот библиотеку подключите.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

9 Ответ от rbgjdew 17.02.2017 10:41:50

Декларация особо не поменяет ничего. А вот библиотеку подключите.

Прошу прощения. Подскажите пожалуйста, что за библиотека

10 Ответ от yshindin 17.02.2017 10:52:54

Декларация особо не поменяет ничего. А вот библиотеку подключите.

Переменная oFile была не объявлена, поэтому ее тип по умолчанию Variant, что может противоречить выражению oFile.Name

Чтобы подключить "Microsoft Scripting Runtime", откройте редактор VBA, на вкладке Tools выберите References (привожу пример для английского варианта интерфейса), далее в списке ресурсов проекта отметьте флажок "Microsoft Scripting Runtime", сохраните изменение.

SelectingMicrosoftScriptingRuntime.jpg 89 Кб, 1 скачиваний с 2017-02-17

You don't have the permssions to download the attachments of this post.

11 Ответ от rbgjdew 17.02.2017 11:10:14

Декларация особо не поменяет ничего. А вот библиотеку подключите.

Переменная oFile была не объявлена, поэтому ее тип по умолчанию Variant, что может противоречить выражению oFile.Name

Чтобы подключить "Microsoft Scripting Runtime", откройте редактор VBA, на вкладке Tools выберите References (привожу пример для английского варианта интерфейса), далее в списке ресурсов проекта отметьте флажок "Microsoft Scripting Runtime", сохраните изменение.

Я сделал как вы сказали. Я нашёл эту библиотеку, поставил флажок, даже переместил её (библиотеку) наверх, она сейчас рядышком с уже отмеченными библиотеками (самая нижняя), нажал OK, сохранил файл.

Библиотеки.jpg 89.99 Кб, файл не был скачан.

You don't have the permssions to download the attachments of this post.

12 Ответ от rbgjdew 17.02.2017 11:29:17

Декларация особо не поменяет ничего. А вот библиотеку подключите.

Переменная oFile была не объявлена, поэтому ее тип по умолчанию Variant, что может противоречить выражению oFile.Name

Чтобы подключить "Microsoft Scripting Runtime", откройте редактор VBA, на вкладке Tools выберите References (привожу пример для английского варианта интерфейса), далее в списке ресурсов проекта отметьте флажок "Microsoft Scripting Runtime", сохраните изменение.

Я сделал как вы сказали. Я нашёл эту библиотеку, поставил флажок, даже переместил её (библиотеку) наверх, она сейчас рядышком с уже отмеченными библиотеками (самая нижняя), нажал OK, сохранил файл.

13 Ответ от yshindin 17.02.2017 11:32:13

Я проверил - макрос ругается на таблицу, которой нет в документе, т.е., ругается на предпоследнюю строку кода:

Именно в эту таблицу по замыслу автора надо поместить результат - число файлов в заданной папке.
Добавьте таблицу в конец документа ))

14 Ответ от rbgjdew 17.02.2017 11:48:39

Я проверил - макрос ругается на таблицу, которой нет в документе, т.е., ругается на предпоследнюю строку кода:

Именно в эту таблицу по замыслу автора надо поместить результат - число файлов в заданной папке.
Добавьте таблицу в конец документа ))

Удалил весь текст после таблицы, даже просмотрел и удалил непечатаемые знаки, запустил макрос из редактора - то-же самое. ошибка - 5941

15 Ответ от yshindin 17.02.2017 12:14:27

Удалил весь текст после таблицы, даже просмотрел и удалил непечатаемые знаки, запустил макрос из редактора - то-же самое. ошибка - 5941

Вот мой пример (в прицепе).
Выложите ваш документ, пжл, я посмотрю.

File_count.docm 37.8 Кб, 1 скачиваний с 2017-02-17

You don't have the permssions to download the attachments of this post.

16 Ответ от rbgjdew 17.02.2017 12:43:37

Удалил весь текст после таблицы, даже просмотрел и удалил непечатаемые знаки, запустил макрос из редактора - то-же самое. ошибка - 5941

Вот мой пример (в прицепе).
Выложите ваш документ, пжл, я посмотрю.

17 Ответ от rbgjdew 17.02.2017 13:22:51

Не знаю, нужно или нет - опишу подробно как создавался файл пример (см. пример в начале темы). Сначала по правому краю нарисовал таблицу ( не вставил "Вставка - таблица и т.д.) а именно нарисовал через это-же меню. Сл. нарисовал таблицу по центру (одна строка, пять столбцов), в первом столбце - обычный текст, во втором столбце - создавал выпадающий список, потом удалил, в третьем столбце - вставлял закладку (пример то-же нашёл на форуме, при открытии файла добавляется по 1 к цифре в таблице) потом закладку то-же удалил. В четвёртом столбце - опять обычный ткст. В пятом - вордовская дата с автом. обновлением. Она так и осталась в таблице. Когда чистил документ, почему-то не с первого раза удалялись таблицы. Может это всё как-то повлияло на то, что макрос не работал?

18 Ответ от yshindin 17.02.2017 14:22:22

Может это всё как-то повлияло на то, что макрос не работал?

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

19 Ответ от rbgjdew 18.02.2017 15:27:07

Здравствуйте. Разобрался, почему макрос не работал. Методом "тыка". В документе (см. образец в начале темы) две таблицы. В коде, (спасибо Fck_This) изначально указана Tables(1).Cell(1, 1), то есть табл.1 ячейка 1 в строке 1. Я же (в отредактированном коде) указал для ввода суммы файлов третью ячейку во второй таблице, вот он (VBA) и ругался. Исправил код Tables(2).Cell(1, 3) и сейчас всё работает как надо. Ещё раз всем большое спасибо!

20 Ответ от rbgjdew 18.02.2017 15:34:11

21 Ответ от yshindin 18.02.2017 16:22:01

22 Ответ от rbgjdew 18.02.2017 17:22:30

Спасибо!

23 Ответ от rbgjdew 18.02.2017 17:26:35

Так кажется правильней.

Похожие темы

Подсчёт файлов в папке

Тем, кто хочет освоить новые функции редактора Microcoft Word, безболезненно перейти от одной версии программы к другой или обменяться своим опытом работы в Ворде с другими пользователями, очень поможет во всем этом форум сайта Ворд Эксперт. На портале о Microsoft Office Word вы узнаете про: vba замена символов word.

На форуме обсуждаются проблемы настроек любых версий программы, участники делятся своими вариантами автоматизации работы, макросами и шаблонами для составления таблиц, различных операций редактирования и прочего. На портале о Microsoft Office Word вы узнаете про: word 7 номер страниц но не везде. Кроме готовых решений вы найдете и алгоритмы написания, справочную литературу. Также предусмотрена возможность подачи заявки на работу, связанную с Вордом. На портале о Microsoft Office Word вы узнаете про: сноски в ворде удалить 2010.


Специально для примера я создал папку, в которой разместил несколько файлов различных типов и две подпапки. Вот так они выглядят:

Папка с файлами и каталогами

Давайте рассмотрим несколько способов получения списка файлов.

Способ 1. Использование функции Dir

Этот способ хорош тем, что в данном случае мы не подключаем дополнительных библиотек, а пользуемся только предустановленным функционалом. Способ подойдет, если вам необходимо просто получить список файлов в папке и не нужно выводить их размер, определять тип файла, дату его создания/изменения и т.п. Тут мы получаем только наименования файлов и больше ничего.

Вот там код данной функции, который выводит на лист 1 перечень файлов.

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

Вот так выглядит результат работы функции. Программа записала список файлов на текущий лист Excel.

Вывод списка файлов на лист

Здесь мы не делали проверку на тип файла и вывели все файлы которые у нас были.

Если же необходимо отобрать только определенные типы файлов, например Excel файлы, то в нашем коде необходимо сделать дополнительную проверку:

Знак "*" означает любой набор символов. Таким образом, мы учли различные версии файлов Excel (xls, xlsx, xlsm).

Способ 2. Используем объект FileSystemObject

В данном случае мы будем не просто получать названия файлов, но также определять тип файла, получать его размер и дату создания. Для этого нам потребуется использовать объект FileSystemObject. Он предоставляет нам сведения о файловой системе компьютера.

Однако, чтобы начать его использовать придется подключить одну библиотеку. Не пугайтесь, она есть на всех компьютерах с Windows, потому скачивать ничего не придется. Чтобы подключить ее необходимо:

Теперь перейдем к коду. Он немного упростился:

Обратите внимание на переменные. Переменная FSO - это новый экземпляр объекта FileSystemObject. Тут мы его объявляем и сразу создаем. Директива New очень важна, многие тут допускают ошибку. Также создаем объекты MyFolder и iFile - это тоже объекты FileSystemObject

Далее делаем проверку на существование папки. В данном случае нам не нужна дополнительная функция , мы пользуемся методом FolderExists объекта (класса) FileSystemObject.

Ну и остается аналогично перебрать все файлы в директории. Тут удобно использовать цикл For Each - Next.

Результат работы программы следующий:

Получаем список файлов с помощью FileSystemObject

Способ 3. Создаем функцию, которая возвращает файлы в папке и подпапках

Напоследок разберем функцию, которая будет возвращать нам все файлы в текущей папке и во вложенных папках. Вообще это универсальная функция, которая подойдет на все случаи жизни. Смело копируйте ее в свой проект!

Итак перейдем к коду:

Разберем основные моменты этой функции. На вход она принимает один обязательный аргумент - это путь к папке Path. Также может принимать два необязательных параметра:

  • Filter - перечисление списка файлов, которые мы хотим получить. Перечислять необходимо через запятую, например "doc, xls*". Вы можете использовать символ "*" чтобы включить сравнение по шаблону. По умолчанию фильтр отсутствует и возвращаются все типы файлов.
  • Nesting - вложенность. Это максимальное число вложенных папок в которые "проваливается" алгоритм. По умолчанию равно 100.

В целом по алгоритму комментарии лишние, все должно быть понятно. Основной момент хочу обратить на строку 38.

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

Теперь когда наша функция готова, просто используем ее где нам требуется вот так:

Функция нам возвращает коллекцию файлов в папке и подпапках. Вот так:

Список файлов в папке и вложенных папках

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

olik111 » 11.01.2006 (Ср) 8:53

Как получить количество файлов в папке? Если можно в виде кода.

Sirik » 11.01.2006 (Ср) 10:25

hCORe » 11.01.2006 (Ср) 10:34

Угу. А количество будет List1.ListCount.

Либо заведи счетчик в цикле.

kif » 11.01.2006 (Ср) 10:56

Братья и сестры, что вы делаете.
Ведь вы же братья и сестры.

hCORe » 11.01.2006 (Ср) 11:18

RayShade » 11.01.2006 (Ср) 12:44

И это самое верное и простое решение этой проблемы.

Хакер » 11.01.2006 (Ср) 14:38

Полностью согласен с RayShade'ом. И почему никто не хочет использовать готовую коллекцию, а предпочитает городить циклы, объявлять кучу API и структур к ним. Непонимаю. —We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hCORe » 11.01.2006 (Ср) 15:10

Угу. И процессы перечислять при помощи WMI надо бы. Переделал. А еще сейчас подключил вместо обычных коллекций - VBScript Dictionary; на очереди использование WShell.Reg!

Хакер » 11.01.2006 (Ср) 15:40

[hCore писал(а) "зонт"]

Может быть зонД?

Единственный минус FSO это то, что но возвращает объем Long-функцией. Т.е. если объем больше чем 65536*65536 функция возвратит аля фигня.

Но всё изменится когда я выпущу PPL!

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hCORe » 11.01.2006 (Ср) 16:05

[off1]Потому смайлик и стоит, что через зонт . Понимаешь, на зонт наносится тонким слоем свежий концентрат MSDN. [/off1]

[off2]Мне почему-то больше нравится Dir() и FindFirstFile. Дешево и сердито.[/off2]
[off3]Совершенно не люблю FileListBox.[/off3]
[off4]С FSO дела не имел. Ну не нравятся мне лишние библиотеки. Опять же, проверять наличие и доступность FSO надо. То есть, автоматически - использовать позднее связывание. А с API легче. [/off4]
[off5]А, впрочем, дело вкуса.[/off5]

Хакер » 11.01.2006 (Ср) 16:19

Это то, что где-то через месяц появится в "Проектах жителей" и потрясёт мир

тоесть каждая переменная пишется в новую строку.

что надо сделать чтобы достать из всего файла только определенную строку.

использую такой код

Open langAdress & language & ".lng" For Input As 1

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

'Name: Poliglotto
'Version: 0
'Author: Winand
'Description: Adds multilanguage support to a VB application

Option Explicit
Public Langfile As String
Enum StrType
Caption = 0 'Static Captions
Message = 1 'Message Boxes
Tips = 2 'Tool Tips
Strings = 3 'Any other text in code
End Enum

'Msgbox Lite Multilingual
Public Function MsgBoxE( ByVal Prompt, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal StrIndex As Long = -1, Optional ByVal Param1 As String ) As VbMsgBoxResult
If StrIndex <> -1 And Langfile <> "" Then
Dim tmp As String
tmp = GetString(StrIndex, Message) 'Получаем строку (если есть)
If tmp <> "" Then Prompt = tmp
End If
If Not (Param1 = "" Then Prompt = Replace( CStr (Prompt), "%1", Param1)
MsgBoxE = MsgBox(Prompt, Buttons)
End Function

'Gets a string with a specified index from lang-file
Public Function PStr( ByVal Str As String , ByVal StrIndex As Long ) As String
If Langfile = "" Then PStr = Str: Exit Function
Dim tmp As String
tmp = GetString(StrIndex, Strings) 'Получаем строку (если есть)
If tmp <> "" Then PStr = tmp Else PStr = Str
End Function

'Gets a string of a specified type from lang-file
Private Function GetString( ByVal StrIndex As Long , Optional ByVal aType As StrType = Caption) As String
Dim Str As String
Select Case aType
Case Caption: Str = "Captions"
Case Message: Str = "Messages"
Case Tips: Str = "ToolTips"
Case Strings: Str = "Strings"
End Select
GetString = IniStringPrivate(Str, CStr (StrIndex), "", AppPath & Langfile)
End Function

Читайте также: