Вопрос или проблема
У меня есть файл .csv и главный файл excel. Главный файл содержит таблицу, и я хотел бы автоматически добавить данные из файла .csv в существующую таблицу. Данные имеют одинаковые заголовки и порядок столбцов. У меня есть следующий VBA, который добавляет данные .csv в следующую строку после таблицы, но данные не являются частью таблицы:
Sub Append_CSV_File()
Dim csvFileName As Variant
Dim destCell As Range
Set destCell = Worksheets("Sheet1").Cells(Rows.Count,
"E").End(xlUp).Offset(1) 'Sheet1
csvFileName = Application.GetOpenFilename(FileFilter:="CSV Files
(*.csv),*.csv", Title:="Select a CSV File", MultiSelect:=False)
If csvFileName = False Then Exit Sub
With destCell.Parent.QueryTables.Add(Connection:="TEXT;" & csvFileName,
Destination:=destCell)
.TextFileStartRow = 2
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
End With
destCell.Parent.QueryTables(1).Delete
End Sub
В таблице также есть столбцы справа от данных, которые вычисляют значение на основе импортированных данных. Есть ли способ автоматически скопировать формулы вниз по столбцу, когда новые данные добавляются?
У меня была такая же проблема, и я хотел объединить несколько (точнее, 16) csv файлов в одном списке. Массив, который я использовал, статический и есть более хорошие способы кодирования этого, но мне нужно было собрать конкретные файлы из числа csv файлов, которые находятся в папке.
Ваш код показался мне интересным, и я обновил код, который я собрал из других источников, чтобы получить рабочий набор кода.
Спасибо за то, что поделились своим кодом, как вы увидите, я использовал элемент вашего кода, чтобы найти следующую пустую строку для добавления.
Смотрите пример кода ниже, вам нужно будет добавить имена файлов и путь к каталогу файлов, а также обновить массив xFiles, чтобы он соответствовал количеству файлов, которые вы хотите импортировать и добавить:
Sub LoadDelimitedFiles()
Dim xStrPath As String
Dim xFile As String
Dim xCount As Long
Dim xFiles(15) As String
Dim destCell As Range
On Error GoTo ErrHandler
' добавлено обновление кода для выбора отдельных имен файлов, необходимых с сервера в папке
' Путь к папке
xStrPath = "<Insert Folder Location>"
' Название массива с именами csv файлов для содержимого файла
xFiles(0) = "<Filename1>"
xFiles(1) = "<Filename2>"
xFiles(2) = "<Filename3>"
xFiles(3) = "<Filename4>"
xFiles(4) = "<Filename5>"
xFiles(5) = "<Filename6>"
xFiles(6) = "<Filename7>"
xFiles(7) = "<Filename8>"
xFiles(8) = "<Filename9>"
xFiles(9) = "<Filename10>"
xFiles(10) = "<Filename11>"
xFiles(11) = "<Filename12>"
xFiles(12) = "<Filename13>"
xFiles(13) = "<Filename14>"
xFiles(14) = "<Filename15>"
xFiles(15) = "<Filename16>"
xCount = 0
If xStrPath = "" Then Exit Sub
Application.ScreenUpdating = False
' Очистка существующих данных листа
Columns("A:I").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
' Установка 1-го имени файла
xFile = Dir(xStrPath & xFiles(xCount) & ".csv")
' destCell содержит местоположение следующей ячейки, к которой нужно добавить данные следующего csv файла
Set destCell = Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(1)
Do While xCount <> 16
xFile = Dir(xStrPath & xFiles(xCount) & ".csv")
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" _
& xStrPath & xFile, Destination:=destCell)
.Name = "a" & xCount
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
Set destCell = Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(1)
xCount = xCount + 1
End With
Loop
' Удалить пустую верхнюю строку
Rows("1:1").Select
Selection.Delete Shift:=xlUp
Range("A1").Select
' Обновить экран, чтобы показать содержимое добавленных данных csv файла
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox "файлы не найдены", , "Сообщение об ошибке"
End Sub
Ответ или решение
Автоматический импорт данных из CSV-файла в существующую таблицу Excel
Если ваша задача заключается в том, чтобы автоматически импортировать данные из CSV-файла и добавить их в существующую таблицу Excel, вы можете использовать язык программирования VBA (Visual Basic for Applications). Данный ответ представляет собой комплексное руководство по созданию такого процесса, включая обработку формул, которые могут находиться в столбцах рядом с импортируемыми данными.
1. Подготовка окружения
Перед тем как начать, убедитесь, что у вас есть:
- Мастер-файл Excel с заранее настроенной таблицей.
- CSV-файлы, данные из которых вы хотите импортировать, имеют схожие заголовки и порядок столбцов с вашей таблицей в Excel.
2. Код на VBA
Предлагаю вам код на VBA, который будет отвечать за автоматизацию процесса импорта данных. Основные функции этого кода включают выбор CSV-файла, добавление данных в существующую таблицу и обновление формул.
Пример кода:
Sub Append_CSV_Data_To_Excel_Table()
Dim csvFileName As Variant
Dim destCell As Range
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1") ' Укажите имя вашего листа
' Выбор файла CSV
csvFileName = Application.GetOpenFilename(FileFilter:="CSV Files (*.csv),*.csv", Title:="Выберите CSV файл", MultiSelect:=False)
If csvFileName = False Then Exit Sub
' Определение следующей пустой строки после последней строки таблицы
Set destCell = ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1)
' Импорт данных из CSV
With ws.QueryTables.Add(Connection:="TEXT;" & csvFileName, Destination:=destCell)
.TextFileStartRow = 2
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
End With
' Очистка QueryTable после обновления
ws.QueryTables(1).Delete
' Копирование формул для обновления соседних столбцов
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' Последняя строка с данными
ws.Range("B2:B" & lastRow).FillDown ' Измените диапазон по необходимости в зависимости от расположения ваших формул
MsgBox "Данные успешно добавлены!", vbInformation
End Sub
3. Как это работает
-
Выбор CSV-файла: Код открывает диалог выбора файла, позволяя пользователю выбрать CSV-файл для импорта.
-
Определение следующей строки: Определяется первая пустая ячейка после последней заполненной строки в таблице Excel.
-
Добавление данных: Данные из CSV-файла импортируются в указанную ячейку (первая пустая строка).
-
Обновление формул: Формулы в соседних столбцах автоматически копируются вниз на столько строк, сколько было добавлено новых данных.
4. Обработка ошибок
Важно добавить обработку ошибок для надежной работы вашего кода. Пример использования:
On Error GoTo ErrorHandler
' Ваш код здесь
Exit Sub
ErrorHandler:
MsgBox "Произошла ошибка: " & Err.Description, vbExclamation
End Sub
5. Заключение
Используя предложенный код VBA, вы сможете автоматически импортировать данные из CSV-файла и добавлять их в существующую таблицу. Таким образом, вы исключите ручные операции, повысив эффективность работы. Настройте и адаптируйте код под свои нужды, и вы добьетесь создания мощного инструмента для работы с данными в Excel.