Добрый день. На форуме не нашел подходящий ответ по данному вопросу. Задача состоит в том что есть папка с файлами и их нужно переместить в другую папку с особым названием. Пример: Файл из "Колонка А" должен переместиться в папку с названием из "Колонка B" Заранее спасибо за помощь.
в файле недостаточно данных а) нужно знать полный путь к исходным файлам (или знать как его вычислить) б) нужно знать полное имя нового файла (путь + имя) используйте FileSystemObject:
Код
Set fso = CreateObject("Scripting.FileSystemObject")
а потом в цикле:
Set f2 = fso.GetFile("c:\testfile.txt")
f2.Move "c:\tmp\testfile.txt"
вместо "c:\testfile.txt" и "c:\tmp\testfile.txt" - вычислить и подставить свои значения.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
читайте #2 - нужны ПОЛНЫЕ имена, пути как к исходным файлам, так и к папкам, куда их следует переместить D;\1234567890123 - это полный путь к файлу??? а перемещать куда D:\Папка1???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Sub MoveFiles()
Dim fso, f, r: r = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Do While Not IsEmpty(Cells(r, 1))
Set f = fso.GetFile("d:\") & Cells(r, 1): f.Move "d:\" & Cells(r, 2): r = r + 1
Loop
End Sub
в корне диска d должны находиться: 1) файлы с такими именами, как указано в колонке А 2) папки с такими именами, как указано в колонке В правой кнопкой по ярлыку листа с данными исходный текс скопируйте туда макрос и выполните удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
извините, я сам наконец-то выполнил код. было 2 ошибки(( опечатка в строке Set f = ... и для f.Move нужно полное имя (только имени папки недостаточно, хотя стандартная DOS Move ЧТО КУДА понимает если куда указано имя существующей папки - перенести файл нужно в эту папку а не переименовывать в КУДА) предложение поспорить - отменяется)
Код
Sub MoveFiles()
Dim fso, f, r: r = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Do While Not IsEmpty(Cells(r, 1))
Set f = fso.GetFile("d:\" & Cells(r, 1))
f.Move "d:\" & Cells(r, 2) & "\" & Cells(r, 1)
r = r + 1
Loop
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
kuklp Леш, привет. Возможно так чуть проще(но с АПИ): Код:
Код
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
Sub bb()
Const ROOT = "d:\"
Dim c
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)).Cells
MakeSureDirectoryPathExists ROOT & c & "\"
Next
End Sub
http://excelvba.ru/code/MkDir Создание папок с подпапками макросом VBA Макросы VBA Excel Обработка файлов Функции WinAPI Средства Windows Работа с файлами
Как известно, VBA-функция MkDir может создать только папку в существующем каталоге (папке). Например, код MkDir "C:\Папка\" отработает корректно в любом случае (создаст указанную папку), а код MkDir "C:\Папка\Подпапка\Каталог\" выдаст ошибку Run-time error '76': Path not found (потому что невозможно создать каталог Подпапка в несуществующем ещё каталоге Папка)
Можно, конечно, использовать несколько функций MkDir подряд - но это усложняет код. Самый простой способ решения проблемы - использование WinAPI-функции SHCreateDirectoryEx, которая может создать все нужные папки и подпапки за один запуск.
Код
Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" _
(ByVal hwnd As Long, ByVal pszPath As String, _
ByVal psa As Any) As Long
Sub CreateFolderWithSubfolders(ByVal ПутьСоздаваемойПапки$)
' функция получает в качестве параметра путь к папке
' если такой папки ещё нет - она создаётся
' может создаваться сразу несколько подпапок
If Len(Dir(ПутьСоздаваемойПапки$, vbDirectory)) = 0 Then ' если папка отсутствует
SHCreateDirectoryEx Application.hwnd, ПутьСоздаваемойПапки$, ByVal 0& ' создаём путь
End If
End Sub
Пример использования функции SHCreateDirectoryEx:
Код
Sub ПримерИспользованияCreateFolderWithSubfolders()
' этот макрос создаст на диске C папку "Создаваемая папка",
' в ней - подпапку "Подпапка", а в последней - подпапку 1234
Путь = "C:\Создаваемая папка\Подпапка\1234\"
CreateFolderWithSubfolders Путь
End Sub
можно оставить как написано но если все файлы переносятся в одну папку, то нету смысла проверять наличие этой папки на каждом шаге цикла можно эту строку вынести перед Do, она выполнится 1 раз (хотя все это не существенно и Вы не заметите разницы в скорости выполнения макроса)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко, Игорь, столкнулся с такой ситуацией, при перемещение в папки все ок, но когда эти же папки(уже с файлами) перемещаю еще в другие папки то пишет что не находит данные, в чем проблема может быть?
проблема в том, что папка и файл - это разные обьекты для FileSystemObject
и проблема №2, а точнее это глобальная проблема и это проблема №1 - не полное описание задачи)) это стандартная ситуация, когда сформулирована задача, предложено ее решение, и тут... пользователь начинает из рукавов доставать тузы и подкидывать а случается и такое - у пользователя джокер! тогда начальное решение вообще не в тему!! и нужно все! переписать(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Sub ParseClientFile()
'Присваиваем переменную номеру заказа в активной книге и проверяем его заполнение
Set Order = Range("V6")
If Order = 0 Then
MsgBox "Заполните номер заказа по шаблону:" + vbCrLf + " Год - Номер заказа" + vbCrLf + vbCrLf + "Например: 2022-555", 16, "Ошибка! Макрос остановлен"
Exit Sub
End If
'Присваиваем переменную активной книге
Set bookserver = ActiveWorkbook
'Сколько будет листов в книге
Dim mCount
mCount = 12
Dim avFile
'Переменная для пути файла
ChDrive Left(ThisWorkbook.Path, 1)
'по умолчанию к выбору доступны файлы Excel(xls,xlsx,xlsm,xlsb)
avFile = Application.GetOpenFilename _
("Excel files(*.xls*),*.xls*", 1, "Выберите файл бланка заказа для обработки", , False)
ChDrive Left(ThisWorkbook.Path, 1)
If VarType(avFile) = vbBoolean Then
Exit Sub
'была нажата кнопка отмены = выход из процедуры
End If
'Открываем клиентскую книгу
Set bookclient = Workbooks.Open(avFile)
'Проверка на совпадение версий бланка заказа и обработчика
Set bookclientversion = Range("Z45")
bookserver.Worksheets("Данные заказа").Activate
Set bookserverversion = Range("Z45")
If bookclientversion = bookserverversion Then
Else
MsgBox "Версии файлов не совпадают, требуется ручной ввод!" + vbCrLf + "Макрос остановлен"
Exit Sub
End If
'Снимаем защиту листа "Данные заказа"
bookserver.Worksheets("Данные заказа").Activate
ActiveSheet.Unprotect password:=""
'Начало копирования диапазонов данных с клиентского файла в расчётный
'Конец копирования диапазонов данных с клиентского файла в расчётный
bookserver.Worksheets("Данные заказа").Activate
Application.DisplayAlerts = False
bookclient.Close
'Создаем папку в этой же директории что и bookserver
MsgBox avFile
Dim fso As Object
Set fso = CreateObject("Scripting.FilesystemObject")
Set folderNew = Range("C45")
If Not fso.FolderExists(ThisWorkbook.Path & "\" & folderNew.Value) Then
fso.CreateFolder (ThisWorkbook.Path & "\" & folderNew.Value)
End If
Set fso = CreateObject("Scripting.FilesystemObject")
On Error Resume Next
fso.MoveFile avFile, ThisWorkbook.Path & "\" & folderNew.Value
'Закрываем клиентскую книгу
'Сохраняем файл с новым именем перезаписывая уже имеющийся
Dim sFolder As String, sFileName As String
sFolder = ThisWorkbook.Path & "\" & folderNew.Value & "\"
sFileName = [C45]
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=sFolder & sFileName & ".xlsm"
Application.DisplayAlerts = True
'Приступаем к формированию csv-файлов для базиса
'Присваиваем переменную активной книге
Set bookclient = ActiveWorkbook
'Активируем активную книгу
bookclient.Worksheets("Данные заказа").Activate
'Начало обработки листов "М*+1"
'Конец обработки листов "М*+1"
'Сохраняем файл перезаписывая уже имеющийся
Application.DisplayAlerts = False
ChDrive Left(ThisWorkbook.Path, 1)
ThisWorkbook.Save
Application.DisplayAlerts = True
'Application.DisplayAlerts = False
'bookclient.Close
Application.Quit
End Sub
Что-то пошло не так, в предыдущем сообщений, мой текст не сохранился, только код (
В общем! Есть "файл-обработчик" - наша часть, только для чтения который (т.е. перезаписать его нельзя) Есть "файл-источник" - клиентская часть, заполняет клиент, отправляет нам
Суть макроса! Получаем "файл-источник", открываем "файл-обработчик", запускаем макрос, в диалоге выбираем "файл-источник", макрос парсит файл и пересохраняет "файл-обработчик" с нужным именем уже из нового "файла-обработчика" формируются .csv-файлы для дальнейшей обработки другой программой
Сейчас появились задачи по допиливанию макроса, и я никак не могу с ними справиться((
1. Появилась задача, чтобы файл сохранялся в новую папку с нужным именем относительно директории в которой лежит "файл-обработчик" - сделано Часть кода 71 - 77
2. И необходимо, чтобы "файл-источник" перемещался после обработки в эту же созданную папку Бьюсь уже целый день, не могу решить ((((((( Помогите пожалуйста
Код макроса упросил, убрал оттуда циклы и всю лишнюю информацию