Вопрос или проблема
Я новичок в пакетном сценарии и нуждаюсь в помощи.
Я хочу скопировать содержимое файла 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"
}
}
Объяснение скрипта:
-
Установка путей к папкам: Скрипт определяет массив с путями к нужным папкам. Добавьте остальные папки до
Folder40
. -
Цикл по каждой папке: Для каждой папки он проверяет наличие файлов
A.csv
иB.xls
. -
Работа с Excel: Создается экземпляр Excel, и открывается файл
B.xls
. Затем считываются данные изA.csv
с помощьюImport-Csv
. -
Стирание существующих данных: Пробегается по всем записям из CSV и вставляются данные в первую вкладку
GenData
, сначала очищая любые старые данные. -
Сохранение и закрытие: После добавления данных файл Excel сохраняется, а затем закрывается.
-
Вывод информации: На экран выводится сообщение о статусе выполнения.
Дополнительно:
- Убедитесь, что у вас установлены соответствующие разрешения для запуска PowerShell и работы с COM-объектами, если у вас возникают проблемы с привилегиями.
- Для работы этого скрипта необходимо, чтобы Excel был установлен на вашем компьютере.
Запустите этот PowerShell-скрипт, чтобы скопировать данные из ваших файлов, сохраняя при этом все макросы и другие листы в Excel.