Страницы: 1
RSS
Макрос для объединения данных из файлов .dbf в один файл, Присылают с почты до 100 файлов в формате .dbf - их нужно объединить в один файл Excel для дальнейшей обработки
 
Здравствуйте форумчане и гости.
В VBA даже близко не понимаю. Помогите макросом для упрощения рутинной работы по объединению данных в одном файле.
Прилагаю файлы.
В файле 202506.xlsx как должно получится.
В архиве TEST.zip пример файлов для обработки.
Изменено: Muxa K - 02.07.2025 09:10:41
 
Muxa K, добрый день. Вариант.
Код
Sub ImportDBF()

    Dim wb As Workbook, new_wb As Workbook
    Dim filePath As String, fileName As String
    Dim copy_rng As Range, rng As Range
    Dim bNewOpen As Boolean
    bNewOpen = False
    
    Application.ScreenUpdating = False
    
    Set new_wb = Workbooks.Add       'создание новой книги
    Set copy_rng = new_wb.Sheets(1).Range("A1")

    filePath = "C:\Users\User\Desktop\1" ' < Укажите путь к папке
    
    fileName = Dir(filePath & "\*.dbf")
    
    
    ' Открытие DBF в Excel как отдельной книги в цикле
    Do Until fileName = ""
        Set wb = Workbooks.Open(filePath & "\" & fileName)
        
        ' Копирование содержимого на  лист
        If bNewOpen Then
            Set rng = wb.Sheets(1).UsedRange
            rng.Offset(1).Resize(rng.Rows.Count - 1).Copy Destination:=copy_rng
        Else
            Set rng = wb.Sheets(1).UsedRange
            rng.Copy Destination:=copy_rng
            bNewOpen = True
        End If
        
        ' Закрытие книги DBF без сохранения
        wb.Close False
        fileName = Dir()
        Set copy_rng = new_wb.Sheets(1).UsedRange
        Set copy_rng = new_wb.Sheets(1).Cells(copy_rng.Rows.Count + 1, "A")
    Loop
    Application.ScreenUpdating = True
        
End Sub
 
Большое спасибо Alex.
Цитата
Alex написал:
filePath = "C:\Users\User\Desktop\1" ' < Укажите путь к папке
Файл для сбора данных всегда будет находится с файлами .dbf в одном каталоге.
Подскажите пожалуйста, как изменить.
UPD:
Нарисовалась ещё одна задача (весь год было нормально и только сейчас заметили). В третьем столбце все цифры нужно поделить на 100.
Так есть

Так нужно:
Изменено: Muxa K - 02.07.2025 10:09:02
 
Muxa K, тогда есть вопросы:
1. как файлы будут добавляться в папку? К примеру, на сегодня есть 5 файлов. Мы их обработали и добавили в файл для сбора. Что с ними дальше происходит? Удаляются или остаются? Завтра пришли еще 3 файла. В файле сборки мы собираем только новые файлы или сбор всех 8 файлов заново?
 
Цитата
Alex написал:
как файлы будут добавляться в папку?
В конце месяца я выгружаю их в один каталог и всё - до следующего месяца. В следующем месяце новый каталог и новые файлы.
Цитата
Alex написал:
Удаляются или остаются?
Остаются.
Изменено: Muxa K - 02.07.2025 10:14:15
 
В коде (после поиска в Internet и методом научного тыка) изменил путь к файлу:
Код
filePath = "C:\Users\User\Desktop\1"

на:
Код
filePath = ThisWorkbook.Path

Вроде работает.
Осталось третий столбец разделить на 100 с двумя знаками после запятой.
Изменено: Muxa K - 02.07.2025 10:49:09
 
Muxa K, не до конца понял, что будет файлом сбора в следующих месяцах, данные прошлых периодов удаляются или остаются? Если будете удалять, то удаляйте без строки заголовков, если данные остаются, тогда ничего делать не нужно.
Во вложении.  
 
Цитата
Alex написал:
данные прошлых периодов удаляются или остаются?
Не совсем понял, что нужно.
При запуске макроса нужно всё, что ниже "шапки" таблицы затирать.
Я создаю каталог (например) Июнь.
Туда скидываю DBF файлы.
После этого тута же копирую Ваш файл для сбора.
Собираю всё в один файл и отдаю его в абонентский отдел для сверки по базе.
Всё.
Через месяц опять создаю каталог (например) Июль.
и т.д.
Сейчас буду пробовать.
Изменено: Muxa K - 02.07.2025 11:30:39
 
Muxa K,
Цитата
написал:
После этого тута же копирую Ваш файл для сбора.
Ну вот смотрите, Вы обработали данные прошлого месяца, т.е. в нем уже есть данные. Вы его скопировали в новый каталог, какие дальше действия с данными, которыми уже есть в этом файле? удаляете их или они остаются и просто добавляются новые данные текущего месяца в конец таблицы?
 
Цитата
Alex написал:
удаляете их или они остаются и просто добавляются новые данные текущего месяца в конец таблицы?
Удаляю.
При запуске макроса нужно всё, что ниже "шапки" таблицы затирать.
 
Muxa K,  
 
Alex, огромное спасибо!
Очень выручили.
Всё собирается идеально.
Подгрузка видимо идёт по имени файла и при обработке всех файлов за месяц некоторые даты не по порядку.


Это не критично, но если будет у Вас желание, - то было бы классно в последнем столбце отсортировать по дате
Ещё раз огромное Вам спасибо за помощь.
Изменено: Muxa K - 02.07.2025 12:02:26
 
Muxa K, добавьте строчки
Код
Set copy_rng = ws.UsedRange
copy_rng.Sort copy_rng.Cells(1, copy_rng.Columns.Count), xlAscending, Header:=xlYes

перед строкой в конце
Код
Application.ScreenUpdating = True
 
Цитата
Alex написал:
перед строкой в конце

Что-то я делаю не так.
Файл после заполнения приложил.

И подскажите пожалуйста - можно, как-то задать диапазон очистки на листе A2:J1000
Хочу для удобства девочкам сделать формулы в столбцах K:M Им после этого и делать ничего не придётся.
Изменено: Muxa K - 02.07.2025 14:44:31
 
Muxa K,
Цитата
написал:
можно, как-то задать диапазон очистки на листе A2:J1000
Добавил комментарий в файл.
Цитата
написал:
Что-то я делаю не так.
Проблема с используемым диапазон, в Вашем файле он определялся по-другому. Немного подправил.
 
Цитата
Alex написал:
Немного подправил.
Всё работает, как нужно.
Большое, человеческое спасибо!
 
Цитата
Muxa K написал:
Хочу для удобства девочкам сделать формулы в столбцах K:M Им после этого и делать ничего не придётся.
Код
Dim lstLine As Long, aSt As Worksheet
Set aSt = ActiveWorkbook.ActiveSheet
lstLine = aSt.Cells(Rows.Count, 1).End(xlUp).Row
aSt.Range(aSt.Cells(2, 11), aSt.Cells(lstLine, 11)).Formula2R1C1Local = "=ЕСЛИ(СУММПРОИЗВ(--ЕЧИСЛО(ПОИСК(ЦЕЛОЕ(RC[-1]);ЦЕЛОЕ(R1C[-1]:RC[-1]))))=1;ЦЕЛОЕ(RC[-1]);"""")"
aSt.Range(aSt.Cells(2, 12), aSt.Cells(lstLine, 12)).Formula2R1C1Local = "=ЕСЛИ(RC[-1]<>"""";СУММ((ЕСЛИ(ЕЧИСЛО(--R2C[-2]:R1000C[-2]);ЦЕЛОЕ(R2C[-2]:R1000C[-2]))=ЦЕЛОЕ(RC[-2]))*ЕСЛИ(ЕЧИСЛО(--R2C[-2]:R1000C[-2]);R2C[-9]:R1000C[-9]));"""")"
aSt.Range(aSt.Cells(2, 13), aSt.Cells(lstLine, 13)).Formula2R1C1Local = "=ЕСЛИОШИБКА(RC[-1]-RC[-1]*1%;"""")"
Страницы: 1
Читают тему
Наверх