Пытаюсь макросом скопировать из папки "Откуда" (в т.ч. всех подпапках) в папку "Куда" файлы Excel по условию (наличию в названии символа, например "+").
Нашел макрос который копирует все файлы Excel: [vba]
Код
Sub cop()
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "C:\Users\Мвидео\Desktop\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each iFile In Folder.Files If Right(iFile.Name, 5) = ".xlsx" Then iFile.Copy "C:\Users\Мвидео\Desktop\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba]
Но он не решает 2 вопроса:
1) Необходимо копирование файлов во всех подуровнях папки "Откда", т.е. пока берет верхний уровень только.
2) Необходимо копирование файлов Excel имя файлов которые содержат символ +
Первую часть даже не смог найти что-то подходящее как исправить.
Вторую часть попытался исправить 8 строку: [vba]
Код
If fso.GetFileName(fil.Path) Like "*+*.xlsx*" Then iFile.Copy "C:\Users\Мвидео\Desktop\Куда" & "\" & iFile.Name
[/vba] Не срабатывает.
Подскажите, пожалуйста, где нужно правильно допилить?
P.S. можете подсказать полезные ресурсы (на русском) со всеми кодами и их синтаксисами для обучения. Один нашел (ссылки на внешний ресурс нельзя выкладывать) но синтаксис выложен без примеров.
И снова здравствуйте!
Пытаюсь макросом скопировать из папки "Откуда" (в т.ч. всех подпапках) в папку "Куда" файлы Excel по условию (наличию в названии символа, например "+").
Нашел макрос который копирует все файлы Excel: [vba]
Код
Sub cop()
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "C:\Users\Мвидео\Desktop\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each iFile In Folder.Files If Right(iFile.Name, 5) = ".xlsx" Then iFile.Copy "C:\Users\Мвидео\Desktop\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba]
Но он не решает 2 вопроса:
1) Необходимо копирование файлов во всех подуровнях папки "Откда", т.е. пока берет верхний уровень только.
2) Необходимо копирование файлов Excel имя файлов которые содержат символ +
Первую часть даже не смог найти что-то подходящее как исправить.
Вторую часть попытался исправить 8 строку: [vba]
Код
If fso.GetFileName(fil.Path) Like "*+*.xlsx*" Then iFile.Copy "C:\Users\Мвидео\Desktop\Куда" & "\" & iFile.Name
[/vba] Не срабатывает.
Подскажите, пожалуйста, где нужно правильно допилить?
P.S. можете подсказать полезные ресурсы (на русском) со всеми кодами и их синтаксисами для обучения. Один нашел (ссылки на внешний ресурс нельзя выкладывать) но синтаксис выложен без примеров.Anis625
Сообщение отредактировал Anis625 - Среда, 16.01.2019, 21:54
это были не рекомендации, а цитаты из серии "найди 2 отличия" у вас в коде [vba]
Код
For Each iFile In Folder.Files
[/vba] задана переменная iFile, а внутри цикла почему-то пишете fil (видимо, не заметили при копировании из другого макроса) вам нужно было просто заменить в вашем макросе 8 строку на ту, что я написал
это были не рекомендации, а цитаты из серии "найди 2 отличия" у вас в коде [vba]
Код
For Each iFile In Folder.Files
[/vba] задана переменная iFile, а внутри цикла почему-то пишете fil (видимо, не заметили при копировании из другого макроса) вам нужно было просто заменить в вашем макросе 8 строку на ту, что я написал
Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%
ПутьКПапке$ = [c1] ' берём из ячейки c1 МаскаПоиска$ = [c2] ' берём из ячейки c2 ГлубинаПоиска% = Val([c3]) ' берём из ячейки c3 If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999 ' без ограничения по глубине
' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%)
[/vba]
если добавить в свою задачу было бы супер но сам поженить два макроса не смогу =(
krosav4ig,
Круууууто. Вот эту часть [vba]
Код
Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%
ПутьКПапке$ = [c1] ' берём из ячейки c1 МаскаПоиска$ = [c2] ' берём из ячейки c2 ГлубинаПоиска% = Val([c3]) ' берём из ячейки c3 If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999 ' без ограничения по глубине
' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%)
[/vba]
если добавить в свою задачу было бы супер но сам поженить два макроса не смогу =(Anis625
Сообщение отредактировал Anis625 - Среда, 16.01.2019, 23:34
Перепробовал разные варианты. Последний вариант sboy, даже на проверке макроса как есть без изменения у меня долго макрос отрабатывал мигая и потом завис Excel
=(
Перепробовал разные варианты. Последний вариант sboy, даже на проверке макроса как есть без изменения у меня долго макрос отрабатывал мигая и потом завис ExcelAnis625
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Dim sFolder As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 2) = Application.PathSeparator, "", Application.PathSeparator) Application.ScreenUpdating = False Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each iFile In Folder.Files If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba]
=( не срабатывает
Очередная попытка [vba]
Код
Sub cop2()
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Dim sFolder As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 2) = Application.PathSeparator, "", Application.PathSeparator) Application.ScreenUpdating = False Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each iFile In Folder.Files If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each SubFolder In Folder.SubFolders WScript.Echo SubFolder.Name If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba]
Запускаю макрос: Object required =(
Добавил строки:
[vba]
Код
Sub cop3()
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) For Each SubFolder In Folder.SubFolders WScript.Echo SubFolder.Name If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
Hugo, В интернете нашел: iFile - это название файла - донора Я думаю Вы лучше меня знаете. Не силен в написании макросов. Стараюсь найти подходящие макросы и адаптировать под свои вопросы. Когда захожу в тупик обращаюсь за помощью. Я по формулам Excel пока только.
Hugo, В интернете нашел: iFile - это название файла - донора Я думаю Вы лучше меня знаете. Не силен в написании макросов. Стараюсь найти подходящие макросы и адаптировать под свои вопросы. Когда захожу в тупик обращаюсь за помощью. Я по формулам Excel пока только.Anis625
Судя по коду - iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает? А ведь всего лишь одним постом выше всё есть... Внимательнее, тщательнее нужно.
Судя по коду - iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает? А ведь всего лишь одним постом выше всё есть... Внимательнее, тщательнее нужно.Hugo
Тыкать вас носом в одно и то-же в пределах одной темы - это перебор. Нет? (№№2 и 4) Для того, чтобы у файла было имя, которое может иметь, или не иметь что-то, неплохо бы иметь и сам файл. Не находите?
Тыкать вас носом в одно и то-же в пределах одной темы - это перебор. Нет? (№№2 и 4) Для того, чтобы у файла было имя, которое может иметь, или не иметь что-то, неплохо бы иметь и сам файл. Не находите?RAN
В соответствии с правилами наверно нужно было. Но в данному случае не выкладывал, т.к. у меня чистый файл Excel с кнопкой вызова макроса (который выложил).
В соответствии с правилами наверно нужно было. Но в данному случае не выкладывал, т.к. у меня чистый файл Excel с кнопкой вызова макроса (который выложил).
Тыкать вас носом в одно и то-же в пределах одной темы - это перебор. Нет? (№№2 и 4)
Согласен, что это перебор когда в этом хорошо разбираться. Учусь. А Вы когда первый сели за руль велосипеда, автомобиля у вас сразу хорошо получилось ехать? Или вам тоже говорили >1 раза как правильно нужно это делать?
Тыкать вас носом в одно и то-же в пределах одной темы - это перебор. Нет? (№№2 и 4)
Согласен, что это перебор когда в этом хорошо разбираться. Учусь. А Вы когда первый сели за руль велосипеда, автомобиля у вас сразу хорошо получилось ехать? Или вам тоже говорили >1 раза как правильно нужно это делать?Anis625
Set oFSO = CreateObject("scripting.filesystemobject")
CopyRecursive oFSO, sInPath, sOutPath, "*.xls*"
Set oFSO = Nothing End Sub Private Sub CopyRecursive(ByRef oFSO As Object, sCopyFrom$, sCopyTo$, sMask$) Dim oFile As Object, oFolder As Object Set oFolder = oFSO.GetFolder(sCopyFrom) For Each oFile In oFolder.Files If oFile.Name Like "*+*.xls*" Then oFile.Copy sCopyTo & "\" & oFile.Name Next For Each oFolder In oFolder.SubFolders CopyRecursive oFSO, oFolder.Path, sCopyTo, sMask Next Set oFile = Nothing Set oFolder = Nothing End Sub
[/vba]
[vba]
Код
Option Explicit Sub test() Dim sInPath$, sOutPath$, oFSO As Object
Set oFSO = CreateObject("scripting.filesystemobject")
CopyRecursive oFSO, sInPath, sOutPath, "*.xls*"
Set oFSO = Nothing End Sub Private Sub CopyRecursive(ByRef oFSO As Object, sCopyFrom$, sCopyTo$, sMask$) Dim oFile As Object, oFolder As Object Set oFolder = oFSO.GetFolder(sCopyFrom) For Each oFile In oFolder.Files If oFile.Name Like "*+*.xls*" Then oFile.Copy sCopyTo & "\" & oFile.Name Next For Each oFolder In oFolder.SubFolders CopyRecursive oFSO, oFolder.Path, sCopyTo, sMask Next Set oFile = Nothing Set oFolder = Nothing End Sub
Судя по коду - iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает?
Ребяты, но ведь этот код в таком виде (с учетом правки krosav4ig, ): Sub cop3() [vba]
Код
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba] Работает же. Он только берет папку без учета подпапок в ней. Попросил помочь. Дали рекомендации. Не получилось. Покопался в интернете еще раз. Нашел как применять SubFolders. Добавил две строки: [vba]
Код
For Each SubFolder In Folder.SubFolders WScript.Echo SubFolder.Name
[/vba] Не работает. Обратился еще раз за помощью.
RAN, Hugo, Вы чего с двух сторон сразу. Что я не так сделал?
Судя по коду - iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает?
Ребяты, но ведь этот код в таком виде (с учетом правки krosav4ig, ): Sub cop3() [vba]
Код
Dim fso As Object, Folder As Object, iFile As Object, iPath$ iPath = "D:\PQ\Копирование между папками\Откуда" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.GetFolder(iPath) If iFile.Name Like "*+*.xls*" Then iFile.Copy "D:\PQ\Копирование между папками\Куда" & "\" & iFile.Name Next Set iFile = Nothing Set Folder = Nothing Set fso = Nothing End Sub
[/vba] Работает же. Он только берет папку без учета подпапок в ней. Попросил помочь. Дали рекомендации. Не получилось. Покопался в интернете еще раз. Нашел как применять SubFolders. Добавил две строки: [vba]
Код
For Each SubFolder In Folder.SubFolders WScript.Echo SubFolder.Name
[/vba] Не работает. Обратился еще раз за помощью.
RAN, Hugo, Вы чего с двух сторон сразу. Что я не так сделал?Anis625