Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68

Раскладчик файлов (сохраненных по определенной маске) по нужным папкам

07.02.2015, 09:50. Показов 5630. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть раскладчик, который писался под определенную задачу, но его необходимо слегка переделать.
Суть: мы имеем много файлов, которые сохраняются по маске: 1234-1234-12345-1-12345678-12345678.rtf, где 1234 - это основная директория (при чем их будет несколько), содержащая в себе подпапки 12345 (соответственно их тоже будет много).
Папки и подпапки будут заранее созданы, макросу необходимо только сделать следующее:
берем из файла 1234 и ищем такую папку, если она есть, то берем из файла 12345, если она тоже есть, то наш файл помещаем в эту подпапку, если не нашлось, то можно создать.
Часть этого реализовано в раскладчике, а часть нужно доработать.
Данный раскладчик работает по принципу (есть папка в которой есть папка свод и подпапки с номерами 1234): сохраняется файл абвгде_1234, где 1234 - наша директория куда надо поместить файл, если папка есть он кидает файл, если нет, то создает папку и кидает файл.
В прикладываемом раскладчике есть функция архивирования, ее убирать не нужно, пусть она останется для удобстав пользования.
Все файлы и сам раскладчик прикрепляю.
Заранее спасибо.
Вложения
Тип файла: rar работа (1).rar (56.7 Кб, 33 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2015, 09:50
Ответы с готовыми решениями:

Раскидать по папкам с переименованием файлов по маске
Добрый день. Помогите пожалуйста. Необходимо общую кучу файлов типа yymmdd_000_имяфайла.xls разбросать по папкам с именами...

Поиск файлов по определенной маске
Подскажите, плиз, как сделать сабж. Т.е. мне нужно найти все файлы с расширением *.txt на диске C: и D: Заранее ВАМ благодарен.

Проверка имен файлов на соответствие определенной маске
Имеются сотни файлов, имена которых необходимо проверять на соответствие стандартам для разных клиентов. Для Клиента 1, имя должно...

32
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
01.03.2015, 14:44
Студворк — интернет-сервис помощи студентам
Да сработает. И по старому принципу сработает с другими индексами.
Лучше приводить конкретную группу примеров имен для всяких случаев.
Только надо понимать, что если действующий разделитель попадает внутрь какой-то "группы", то группа разбивается на истинные группы.
Пробуйте и сами комбинировать настройки и тестировать результаты.
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
01.03.2015, 15:20  [ТС]
Я наверное не могу чего-то понять, можно использовать этот код для файлов, которые имеют начало 12345678_1 и просто имеющие слово в названии.
Все одним раскладчиком или все-таки что-то переписывать?
Если да, то объясните в каком направлении копать(((

Добавлено через 3 минуты
У нас два вида файлов.
Первый вид: 12345678_1_АБВ название (разная длина) -(или _, или пробел)1234-(или _)5678.pdf
Второй вид: название (разная длина) -(или _, или пробел)1234-(или _)5678.pdf

Может я что не так объясняю?
Вы тогда поправьте меня.
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
01.03.2015, 21:49
Конкретики нет. "Или" все портят.
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
01.03.2015, 22:15  [ТС]
подскажите тогда как сделать так, чтобы файлы раскладывались независимо от имени файла, соответственно "имя файла 1234-5678.pdf" останется.
это реально?

Добавлено через 1 минуту
папки будут разделяться строго символом "-".
без нижнего подчеркивания, потому что у нас 12345678_1 уже имеет этот символ.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
02.03.2015, 02:15
Кафедра «Раскладка файлов». Институт усовершенствования MS Office-менеджеров!
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
02.03.2015, 10:31
Если строго "-", то то все уже должно было работать, и не надо было дальше городить огород, а надо было просто попробовать.
Вот вариант с обратной нумерацией, только увольте меня разжевывать теперь и это.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Option Explicit     '  Обязательное объявление переменных
Option Compare Text ' Большие и маленькие буквы в символьных переменных будут трактоваться как одинаковые.
 
' Теперь 12345678_1_имя_1234_5678, где 1234 главная папка, а 5678 внутри этой головной, причем "имя" длина переменная.
Sub CopyFile()
    Const Ext1$ = ".rtf" ' Расширение архивируемых файлов
    Const Ext2$ = ".rar" ' Расширение файла архива
    ' 0 1 2 3 4 5 6 7 8 9  прямая  нумерация блоков основы имени текстового файла, начиная с 0 (без расширения)
    ' 9 8 7 6 5 4 3 2 1 0  обратная нумерация блоков основы имени текстового файла, начиная с конца с 0 (без расширения)
    ' *-*-*-*-*-*-*-*-*-*   Шаблон имени, архивируемого файла, каждый блок может быть переменной длины, блоки старших нумеров могут отсутствовать.
    Const PrymayaNumeraciya As Boolean = False ' Так как в последних служаях мы нумеруем с конца
    Const iFolger% = 1 ' Номер (от 0) папки в шаблоне имени файла
    Const iSubFolger% = 0 ' Номер (от 0) подпапки в шаблоне имени файла
    Const razd1$ = "_" ' Основной разделитель блоков в имени текстового файла
    Const razd2$ = "-" ' Дополнительный разделитель блоков в имени текстового файла, если не нужен - то сделать его одинаковым с основным.
    Const razd3$ = " " ' Еще один дополнительный разделитель блоков в имени текстового файла, если не нужен - то сделать его одинаковым с основным.
    Dim fso As Object, CurrFolderObject As Object, FolderObject As Object, file As Object, folder As Object, subfolder As Object
    Dim Shablon1$, Shablon2$, CurrFolderString$, FolderString$, Department$, DopDepartment$, WinRarApp$, ShellCommand$, FileName$, strTemp$
    Dim succes%, UserDate As Date, ArrayTemp
    If Not IsDate(Worksheets(1).Cells(5, 2).Value) Then
        MsgBox ("Не верный формат даты")
        Exit Sub
    End If
    Shablon1 = "*" & Ext1 & """"
    Shablon2 = "*" & Ext2
    UserDate = CDate(Worksheets(1).Cells(5, 2).Value)
    CurrFolderString = Worksheets(1).Cells(1, 2).Value
    FolderString = Worksheets(1).Cells(2, 2).Value
    WinRarApp = Worksheets(1).Cells(4, 2).Value
    If CurrFolderString = "" Or FolderString = "" Or WinRarApp = "" Then
        MsgBox ("Не все поля заполнены")
        Exit Sub
    End If
    If Trim$(CurrFolderString) = "" Or Trim$(FolderString) = "" Then
        MsgBox ("Пустые значения пути директорий")
        Exit Sub
    End If
    If Dir(CurrFolderString, vbDirectory) = "" Then
        MsgBox ("Отсутствует директория 'Каталог для обработки'")
        Exit Sub
    End If
    If Dir(FolderString, vbDirectory) = "" Then
        MsgBox ("Отсутствует директория 'Каталог для сохранения'")
        Exit Sub
    End If
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set CurrFolderObject = fso.GetFolder(CurrFolderString)
    Set FolderObject = fso.GetFolder(FolderString)
    For Each file In CurrFolderObject.Files
        strTemp = file.Name
        If strTemp Like "*" & Ext1 Then
            strTemp = Replace$(strTemp, Ext1, "")
            strTemp = Replace$(strTemp, razd2, razd1)
            strTemp = Replace$(strTemp, razd3, razd1)
            ArrayTemp = Split(strTemp, razd1)
            If PrymayaNumeraciya = True Then
                Department = ArrayTemp(iFolger)
                DopDepartment = ArrayTemp(iSubFolger)
            Else
                Department = ArrayTemp(UBound(ArrayTemp) - iFolger)
                DopDepartment = ArrayTemp(UBound(ArrayTemp) - iSubFolger)
            End If
            strTemp = FolderString & "\" & Department
            If Dir(strTemp, vbDirectory) = "" Then MkDir strTemp
            strTemp = FolderString & "\" & Department & "\" & DopDepartment
            If Dir(strTemp, vbDirectory) = "" Then MkDir strTemp
            fso.CopyFile CurrFolderString & "\" & file.Name, FolderString & "\" & Department & "\" & DopDepartment & "\" & file.Name, True
        End If
    Next
    For Each folder In FolderObject.subfolders
        For Each subfolder In folder.subfolders
            FileName = Format(UserDate, "yyyy.mm.dd") & " " & Split(subfolder, "\")(UBound(Split(subfolder, "\"))) & Ext2
            If Dir(subfolder & "\" & FileName, vbNormal) <> "" Then
               fso.DeleteFile subfolder & "\" & FileName, True
            End If
            ShellCommand = WinRarApp & " a -ep """ & subfolder & "\" & FileName & """ """ & subfolder & "\*" & Ext1 & """"
            succes = Shell(ShellCommand, vbHide)
            For Each file In subfolder.Files
                If Not file.Name Like "*" & Ext2 Then file.Delete
            Next
        Next
    Next
    MsgBox ("Готово")
End Sub
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
13.03.2015, 17:15  [ТС]
Я вот тоже сделал, из Вашего кода.
А как сделать так, чтобы файл, который находятся в папке, скрытый Thumbs.db его пропускал?
А то он на нем стопорится и не идет дальше, выдавая ошибку(
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
26.03.2015, 12:22  [ТС]
Добрый день, не могли ли Вы мне подсказать, как сделать так, чтобы раскладывал все файлы, сохраненные по данным маскам.
Вы мне очень помогли с раскладчиком.
Дело в том, что сохраняемые файлы бывают в формате pdf, tif, jpg.
Из-за этого он раскладывает только один формат файлов, а нужно все и почему-то не все архивирует.
Подскажите пожалуйста, буду очень признателен.

Добавлено через 2 часа 58 минут
Цитата Сообщение от KoGG Посмотреть сообщение
If Not file.Name Like "*" & Ext2 Then file.Delete
и проблема в этой строке, не удаляются файлы, которые раскладываются, не срабатывает file.Delete
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
26.03.2015, 15:34
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Option Explicit     '  Обязательное объявление переменных
Option Compare Text ' Большие и маленькие буквы в символьных переменных будут трактоваться как одинаковые.
 
Sub CopyFile()
    Dim Ext1: Ext1 = Array(".rtf", ".tif", ".jpg", ".pdf") ' Расширение архивируемых файлов
    Const Ext2$ = ".rar" ' Расширение файла архива
    ' 0 1 2 3 4 5 6 7 8 9  прямая  нумерация блоков основы имени текстового файла, начиная с 0 (без расширения)
    ' 9 8 7 6 5 4 3 2 1 0  обратная нумерация блоков основы имени текстового файла, начиная с конца с 0 (без расширения)
    ' *-*-*-*-*-*-*-*-*-*   Шаблон имени, архивируемого файла, каждый блок может быть переменной длины, блоки старших нумеров могут отсутствовать.
    Const PrymayaNumeraciya As Boolean = False ' Так как в последних служаях мы нумеруем с конца
    Const iFolger% = 1 ' Номер (от 0) папки в шаблоне имени файла
    Const iSubFolger% = 0 ' Номер (от 0) подпапки в шаблоне имени файла
    Const razd1$ = "-" ' Основной разделитель блоков в имени текстового файла
    Const razd2$ = "-" ' Дополнительный разделитель блоков в имени текстового файла, если не нужен - то сделать его одинаковым с основным.
    Const razd3$ = " " ' Еще один дополнительный разделитель блоков в имени текстового файла, если не нужен - то сделать его одинаковым с основным.
    Dim i&, j%, fso As Object, CurrFolderObject As Object, FolderObject As Object, file As Object, folder As Object, subfolder As Object
    Dim CurrFolderString$, FolderString$, Department$, DopDepartment$, WinRarApp$, ShellCommand$, FileName$, strTemp$
    Dim succes%, UserDate As Date, ArrayTemp
    If Not IsDate(Worksheets(1).Cells(5, 2).Value) Then
        MsgBox ("Не верный формат даты")
        Exit Sub
    End If
    UserDate = CDate(Worksheets(1).Cells(5, 2).Value)
    CurrFolderString = Worksheets(1).Cells(1, 2).Value
    FolderString = Worksheets(1).Cells(2, 2).Value
    WinRarApp = Worksheets(1).Cells(4, 2).Value
    If CurrFolderString = "" Or FolderString = "" Or WinRarApp = "" Then
        MsgBox ("Не все поля заполнены")
        Exit Sub
    End If
    If Trim$(CurrFolderString) = "" Or Trim$(FolderString) = "" Then
        MsgBox ("Пустые значения пути директорий")
        Exit Sub
    End If
    If Dir(CurrFolderString, vbDirectory) = "" Then
        MsgBox ("Отсутствует директория 'Каталог для обработки'")
        Exit Sub
    End If
    If Dir(FolderString, vbDirectory) = "" Then
        MsgBox ("Отсутствует директория 'Каталог для сохранения'")
        Exit Sub
    End If
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set CurrFolderObject = fso.GetFolder(CurrFolderString)
    Set FolderObject = fso.GetFolder(FolderString)
    For Each file In CurrFolderObject.Files
        strTemp = file.Name
        For i = 0 To UBound(Ext1)
            If strTemp Like "*" & Ext1(i) Then
                strTemp = Replace$(strTemp, Ext1(i), "")
                strTemp = Replace$(strTemp, razd2, razd1)
                strTemp = Replace$(strTemp, razd3, razd1)
                ArrayTemp = Split(strTemp, razd1)
                If PrymayaNumeraciya = True Then
                    Department = ArrayTemp(iFolger)
                    DopDepartment = ArrayTemp(iSubFolger)
                Else
                    Department = ArrayTemp(UBound(ArrayTemp) - iFolger)
                    DopDepartment = ArrayTemp(UBound(ArrayTemp) - iSubFolger)
                End If
                strTemp = FolderString & "\" & Department
                If Dir(strTemp, vbDirectory) = "" Then MkDir strTemp
                strTemp = FolderString & "\" & Department & "\" & DopDepartment
                If Dir(strTemp, vbDirectory) = "" Then MkDir strTemp
                fso.CopyFile CurrFolderString & "\" & file.Name, FolderString & "\" & Department & "\" & DopDepartment & "\" & file.Name, True
            End If
        Next i
    Next
    For Each folder In FolderObject.subfolders
        For Each subfolder In folder.subfolders
            FileName = Format(UserDate, "yyyy.mm.dd") & " " & Split(subfolder, "\")(UBound(Split(subfolder, "\"))) & Ext2
            If Dir(subfolder & "\" & FileName, vbNormal) <> "" Then
               fso.DeleteFile subfolder & "\" & FileName, True
            End If
            For i = 0 To UBound(Ext1)
                ShellCommand = WinRarApp & " a -ep """ & subfolder & "\" & FileName & """ """ & subfolder & "\*" & Ext1(i) & """"
                succes = Shell(ShellCommand, vbHide)
                For j = 1 To 20: DoEvents: Next
            Next i
            For Each file In subfolder.Files
                If Not file.Name Like "*" & Ext2 Then file.Delete
            Next
        Next
    Next
    MsgBox ("Готово")
End Sub
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
30.03.2015, 10:44  [ТС]
Цитата Сообщение от KoGG Посмотреть сообщение
file.Delete
вот на этом часто встает и не удаляет файлы, после этого и не архивирует.
в чем может быть проблема?
название файла в порядке, как быть?
точнее не часто, а постоянно и каждый раз на разных моментах.
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
31.03.2015, 11:00
Проблема в медленной архивации. Архиватор еще добавляет файл в архив, а мы пытаемся его удалить.
Можно попробовать увеличить число циклов DoEvents
Visual Basic
1
For j = 1 To 200: DoEvents: Next
Еще возможно в папке появляются временные файлы, надо их отследить и такие файлы не пытаться удалять.
0
72 / 0 / 0
Регистрация: 19.06.2014
Сообщений: 68
31.03.2015, 11:13  [ТС]
Увеличил до 1000 уже, все равно такая же ошибка(
Каким образом их можно отслеживать?
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
31.03.2015, 14:22
Можно попробовать увеличить до 10000, но макрос вероятно будет медленно работать.
Отслеживать глазами, открыть нужную папку и смотреть в процессе работы.
Лучше вручную что-либо большое архивировать и наблюдать, что там творит архиватор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2015, 14:22

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

Загрузка сохранённых файлов
Что сделать,чтобы сохранённые файлы(музыка) после скачки никуда не загружались,а оставались просто на панели задач?Дальше я сама решу куда...

Не видно перо в сохраненных файлов
В самом фотошопе при сохранении видно, что нарисовано пером, а в сохраненном файле нет. Как сохранить, чтобы перо было видно.

HP 1018 декодирование файлов сохраненных после печати
Приветствую. Есть файлы теневого копирования которые создаются на сколько я понимаю драйвером принтера при отправки документа на печать....

Вывод в отчете по определенной маске
Добрый день. Подскажите пожалуйста. Есть БД с локациями. Как сделать так, чтобы в отчете Mezzonine отображались данные таким...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru