Страницы: 1 2 След.
RSS
Перемещение файлов через VBA
 
Добрый день.
На форуме не нашел подходящий ответ по данному вопросу.
Задача состоит в том что есть папка с файлами и их нужно переместить в другую папку с особым названием.
Пример:
Файл из "Колонка А" должен переместиться в папку с названием из "Колонка B"
Заранее спасибо за помощь.
Изменено: sambor - 05.01.2017 12:20:19
 
в файле недостаточно данных
а) нужно знать полный путь к исходным файлам (или знать как его вычислить)
б) нужно знать полное имя нового файла (путь + имя)
используйте 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" - вычислить и подставить свои значения.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
sambor, получите в другом столбце список консольных команд для выполнения этой задачи с помощью формулы
Код
="move "&A1&" " &B1
Скопируйте столбец, вставьте в Блокнот, сохраните как .bat в папке с файлами и запустите.
Изменено: Казанский - 05.01.2017 12:50:07
 
Ігор Гончаренко,
Смотрите, в Колоне А это фото их нужно переместить в папку под названием из Колоны B
Они лежат на диске D, но их много.
 
читайте #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) папки с такими именами, как указано в колонке В
правой кнопкой по ярлыку листа с данными
исходный текс
скопируйте туда макрос и выполните
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
И если название папок будет не по порядку, то это повлияет на код?
Спасибо
Изменено: sambor - 05.01.2017 15:06:33
 
порядок может быть произвольный, а
Цитата
в корне диска d должны находиться:
1) файлы с такими именами, как указано в колонке А
2) папки с такими именами, как указано в колонке В
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
Ошибка
 
в сообщении #9 русским языком написано "file not found"
нет такого файла!
не удобно, но повторю 3-й раз:
Цитата
в корне диска d должны находиться:
1) файлы с такими именами, как указано в колонке А
2) папки с такими именами, как указано в колонке В
Изменено: Ігор Гончаренко - 05.01.2017 15:21:28
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, я вот тестирую ваш код.
Файлы вроде на месте.
Папки тоже на своем месте.
-При запуске макроса пишет, что файл не найден.
 
Ігор Гончаренко, ttt480,
Да, я уже и название менял, не работает.
 
давайте поспорим, что файла с именем, написанным в ячейке А1 нет в корне диска D
у Вас в компьютере нет такого файла
D:\1234567890123
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, вот только что залезал на диск D - и воочию, своими глазами видел файл D:\1234567890123
 
Ігор Гончаренко,
Название прописывал изначально полное:
D:\1234567890123.jpg
Если Вы про это
Изменено: sambor - 05.01.2017 15:38:59
 
извините, я сам наконец-то выполнил код. было 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
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
БОМБА)))Спасибо
 
Ігор Гончаренко, да мощный макрос.
 
Ігор Гончаренко,
А если нет такой папки на диске,  но чтоб она сама создала, такое возможно?  
 
добавьте строку
Код
...   
Set f = fso.GetFile("d:\" & Cells(r, 1))
If Dir("d:\" & Cells(r, 2), vbDirectory) = "" Then MkDir "d:\" & Cells(r, 2)
f.Move ...
Изменено: Ігор Гончаренко - 05.01.2017 16:07:08
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Скрытый текст
Изменено: Hugo - 05.01.2017 21:55:42
 
Ігор Гончаренко,
Игорь, а если файлы с колоны А разные, а папка в колоне В одинаковые, от этого макрос измениться?  
 
можно оставить как написано
но если все файлы переносятся в одну папку, то нету смысла проверять наличие этой папки на каждом шаге цикла
можно эту строку вынести перед 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
Изменено: Артем Черкасов - 29.06.2022 13:33:47
 
Что-то пошло не так, в предыдущем сообщений, мой текст не сохранился, только код (

В общем!
Есть "файл-обработчик" - наша часть, только для чтения который (т.е. перезаписать его нельзя)
Есть "файл-источник" - клиентская часть, заполняет клиент, отправляет нам

Суть макроса! Получаем "файл-источник", открываем "файл-обработчик", запускаем макрос, в диалоге выбираем "файл-источник", макрос парсит файл и пересохраняет "файл-обработчик" с нужным именем уже из нового "файла-обработчика" формируются .csv-файлы для дальнейшей обработки другой программой

Сейчас появились задачи по допиливанию макроса, и я никак не могу с ними справиться((

1. Появилась задача, чтобы файл сохранялся в новую папку с нужным именем относительно директории в которой лежит "файл-обработчик" - сделано
Часть кода 71 - 77

2. И необходимо, чтобы "файл-источник" перемещался после обработки в эту же созданную папку
Бьюсь уже целый день, не могу решить (((((((
Помогите пожалуйста


Код макроса упросил, убрал оттуда циклы и всю лишнюю информацию
 
Цитата
Артем Черкасов написал:
fso.MoveFile
Страницы: 1 2 След.
Наверх