Как автоматически импортировать данные из CSV-файла и добавить их к существующей таблице Excel

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

У меня есть файл .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. Как это работает

  1. Выбор CSV-файла: Код открывает диалог выбора файла, позволяя пользователю выбрать CSV-файл для импорта.

  2. Определение следующей строки: Определяется первая пустая ячейка после последней заполненной строки в таблице Excel.

  3. Добавление данных: Данные из CSV-файла импортируются в указанную ячейку (первая пустая строка).

  4. Обновление формул: Формулы в соседних столбцах автоматически копируются вниз на столько строк, сколько было добавлено новых данных.

4. Обработка ошибок

Важно добавить обработку ошибок для надежной работы вашего кода. Пример использования:

On Error GoTo ErrorHandler
' Ваш код здесь
Exit Sub
ErrorHandler:
    MsgBox "Произошла ошибка: " & Err.Description, vbExclamation
End Sub

5. Заключение

Используя предложенный код VBA, вы сможете автоматически импортировать данные из CSV-файла и добавлять их в существующую таблицу. Таким образом, вы исключите ручные операции, повысив эффективность работы. Настройте и адаптируйте код под свои нужды, и вы добьетесь создания мощного инструмента для работы с данными в Excel.

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

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