Подскажите, что делаю не так. И насколько это реально сделать через VBA? Или нужен Python?
Необходимо автоматизировать копирование данных из множества файлов в одной папке в единый файл.
1. В папке Upload\In лежат исходные файлы Excel. Их может быть 3, может быть 100. В каждом файле может быть 3 записи, а может быть 1000 записей.
2. Файл upload.xlsm содержит скрипт, который открывает по очереди каждый Excel из пункта 1 и копирует оттуда данные из поля СНИЛС: столбец E начиная с 20 строки. Цифры СНИЛСа могут быть записаны в формате ХХХ-ХХХ-ХХХ-ХХ или ХХХ-ХХХ-ХХХ ХХ
3. После этого этот файл upload.xlsm сохраняется со списком скопированных СНИЛС и обрабатывается внешней программой. На выходе получаем множество документов PDF сохранённых в папку Upload\Out
4. Каждый документ PDF в названии содержит ФИО заявителя в виде «Заявление_ФАМИЛИЯ_ИМЯ_ОТЧЕТВО_ГГГГ_ММ_ДД.pdf».
5. После этого запустить скрипт в файле checklist.xlsm который найдёт совпадения ФИО в файлах PDF и в исходных таблицах Upload\In выделит эти строки цветом.
6. Если строка не выделена цветом и нет файла PDF эту запись оператор проверить вручную
Структура папок:
C:\Upload
C:\Upload\In – содержит исходные файлы Excel с данными
C:\Upload\Out – содержит список сгенерированных файлов pdf
C:\Upload\upload.xlsm – файл в который надо собрать цифры из множества файлов в папке C:\Upload\checklist.xlsm – файл который проверить совпадения ФИО в PDF файлах и исходных таблицах.
Код в файле upload.xlsm. Что-то делаю не так, скрипт запускается, но не копирует данные
Код |
---|
Sub КопироватьСНИЛС() On Error GoTo ErrorHandler Dim sourceFolderPath As String Dim destinationFilePath As String Dim sourceFileName As String Dim destinationWorkbook As Workbook Dim sourceWorkbook As Workbook Dim destinationWorksheet As Worksheet Dim sourceWorksheet As Worksheet Dim lastRow As Long Dim i As Long ' путь к папке "In" и путь к файлу "upload.xlsm" sourceFolderPath = "C:\Upload\In\" destinationFilePath = "C:\Upload\upload.xlsm" ' Проверка существования файлов If Dir(destinationFilePath) = "" Then MsgBox "Файл 'upload.xlsm' не найден.", vbExclamation Exit Sub End If ' Открываем файл "upload.xlsm" Set destinationWorkbook = Workbooks.Open(destinationFilePath) Set destinationWorksheet = destinationWorkbook.Sheets(1) ' Проходим по всем файлам в папке "In" sourceFileName = Dir(sourceFolderPath & "*.xlsx") Do While sourceFileName <> "" ' Открываем текущий файл On Error Resume Next Set sourceWorkbook = Workbooks.Open(sourceFolderPath & sourceFileName) On Error GoTo ErrorHandler If Not sourceWorkbook Is Nothing Then Set sourceWorksheet = sourceWorkbook.Sheets(1) ' Находим последнюю заполненную строку в столбце E lastRow = sourceWorksheet.Cells(sourceWorksheet.Rows.Count, "E").End(xlUp).Row ' Копируем СНИЛС из столбца E в столбец B файла "upload.xlsm" For i = 20 To lastRow destinationWorksheet.Cells(i - 18, 2).Value = sourceWorksheet.Cells(i, 5).Value Next i ' Закрываем текущий файл sourceWorkbook.Close SaveChanges:=False End If ' Переходим к следующему файлу в папке "In" sourceFileName = Dir Loop ' Закрываем файл "upload.xlsm" с сохранением изменений destinationWorkbook.Close SaveChanges:=True ' Очищаем объекты Set destinationWorksheet = Nothing Set destinationWorkbook = Nothing Set sourceWorksheet = Nothing Set sourceWorkbook = Nothing Exit Sub ErrorHandler: MsgBox "Произошла ошибка: " & Err.Description, vbExclamation ' Обработка ошибки (закрытие файлов и т.д.) может быть добавлена здесь ' Очищаем объекты Set destinationWorksheet = Nothing Set destinationWorkbook = Nothing Set sourceWorksheet = Nothing Set sourceWorkbook = NothingEnd Sub |