Нужен пакетный скрипт для копирования данных из A.csv в B.xls

Вопрос или проблема

Я новичок в пакетном сценарии и нуждаюсь в помощи.

Я хочу скопировать содержимое файла A.csv в первый рабочий лист с именем “GenData” в существующем файле XLS B.xls.

B.xls содержит некоторые макросы на своем втором рабочем листе для генерации графиков из данных, скопированных на его первый рабочий лист.

Оба файла A.csv и B.xls находятся в одной папке. Также я хочу повторить это для около 40 папок, содержащих эти два файла.

C:\Desktop\Abby\Folder1\A.csv

C:\Desktop\Abby\Folder40\A.csv

PS: Я не хочу конвертировать A.csv в B.xls, так как в B.xls есть другие рабочие листы, которые я хочу сохранить. Я хочу скопировать содержимое A.csv на существующий первый рабочий лист файла B.xls.

Я пробовал несколько сценариев, но существующий файл B.xls перезаписывается, и генерация графиков на втором рабочем листе не работает.

Вы можете использовать PowerShell для чтения CSV и сохранения в Excel…

Посмотрите пост этого человека… Конвертирование CSV файла или файлов в рабочую книгу Excel

Я бы использовал надстройку Power Query от Microsoft для этого. Она может импортировать данные из файлов или даже папок с файлами. Она также может справиться с необходимыми преобразованиями по пути.

Вот хороший пост в блоге, показывающий, как Power Query обрабатывает папку с CSV файлами:

http://devinknightsql.com/2013/08/13/extracting-data-from-multiple-files-with-power-query/

Просто размышляю, но неужели более знающий меня в VBA скриптах сможет подсказать, есть ли способ вызвать функцию Excel «импорт из текста» в макросе?

Кажется, что, за исключением вызова из скрипта, функция «импорт из текста» делает именно то, что нужно. Она помещает все данные CSV на новый лист и оставляет все остальное нетронутым.

Я знаю, что это не совсем то, что вы ищете, но если вы не найдете решение с вызовом скрипта, возможно, это то, что вам нужно?

введите описание изображения здесь

Ответ или решение

Для решения вашей задачи по копированию данных из файла A.csv в существующий файл Excel B.xls с помощью пакетного сценария (batch script), предлагаю использовать PowerShell. Поскольку полномочий для работы с Excel из пакетного файла могут быть ограничены, PowerShell позволит вам удобно взаимодействовать с Excel и избежать перезаписи существующего файла.

Вот пример скрипта, который выполнит вашу задачу:

# Путь к папкам с файлами
$folders = "C:\Desktop\Abby\Folder1", "C:\Desktop\Abby\Folder2", "C:\Desktop\Abby\Folder3"  # Добавьте остальные папки до Folder40

foreach ($folder in $folders) {
    # Полные пути к файлам
    $csvFilePath = Join-Path $folder "A.csv"
    $xlsFilePath = Join-Path $folder "B.xls"

    # Проверяем, существуют ли файлы
    if (Test-Path $csvFilePath -and Test-Path $xlsFilePath) {
        # Создаем объект Excel
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false

        # Открываем файл Excel
        $workbook = $excel.Workbooks.Open($xlsFilePath)

        # Открываем файл CSV
        $csvData = Import-Csv -Path $csvFilePath

        # Удаляем существующие данные в первом листе и добавляем новые
        $worksheet = $workbook.Worksheets.Item("GenData")
        $worksheet.Cells.Clear()

        $row = 1
        foreach ($record in $csvData) {
            $col = 1
            foreach ($field in $record.PSObject.Properties) {
                $worksheet.Cells.Item($row, $col) = $field.Value
                $col++
            }
            $row++
        }

        # Сохраняем изменения и закрываем файл
        $workbook.Save()
        $workbook.Close()
        $excel.Quit()

        Write-Host "Данные из $csvFilePath успешно скопированы в $xlsFilePath."
    } else {
        Write-Host "Файлы не найдены в папке: $folder"
    }
}

Объяснение скрипта:

  1. Установка путей к папкам: Скрипт определяет массив с путями к нужным папкам. Добавьте остальные папки до Folder40.

  2. Цикл по каждой папке: Для каждой папки он проверяет наличие файлов A.csv и B.xls.

  3. Работа с Excel: Создается экземпляр Excel, и открывается файл B.xls. Затем считываются данные из A.csv с помощью Import-Csv.

  4. Стирание существующих данных: Пробегается по всем записям из CSV и вставляются данные в первую вкладку GenData, сначала очищая любые старые данные.

  5. Сохранение и закрытие: После добавления данных файл Excel сохраняется, а затем закрывается.

  6. Вывод информации: На экран выводится сообщение о статусе выполнения.

Дополнительно:

  • Убедитесь, что у вас установлены соответствующие разрешения для запуска PowerShell и работы с COM-объектами, если у вас возникают проблемы с привилегиями.
  • Для работы этого скрипта необходимо, чтобы Excel был установлен на вашем компьютере.

Запустите этот PowerShell-скрипт, чтобы скопировать данные из ваших файлов, сохраняя при этом все макросы и другие листы в Excel.

Оцените материал
Добавить комментарий

Капча загружается...