Динамический поиск отсутствующих значений между ListObjects

Я хотел бы перебрать столбец таблицы 1, и если значение отсутствует в том же имени столбца таблицы 2, то вставить его в конец таблицы 2. Приведенный ниже код вставляет точное количество строк из таблицы Table1, но вставляет значение только последней строки.

например Таблица 1:

Имя столбца Значение1 Значение2 Значение3 Значение4

После запуска макроса Table2 выглядит так:

Имя столбца Значение4 Значение4 Значение4 Значение4
Public Sub FindingMissingValues()
    Dim SourceTable As ListObject
    Dim TargetTable As ListObject
    Dim rngDataCell As Range
    
    Set SourceTable = Sheet1.ListObjects("Table1")
    Set TargetTable = Sheet2.ListObjects("Table2")
       
    For Each rngDataCell In SourceTable.ListColumns("Column Name").DataBodyRange.Rows
        If TargetTable.ListColumns("Column Name").DataBodyRange.Find(rngDataCell.Value, , , xlWhole) Is Nothing Then
            TargetTable.ListColumns("Column Name").DataBodyRange.Offset(1).Value = rngDataCell.Value
        End If
    Next rngDataCell
End Sub

Кажется, что он не ищет конкретные значения ячеек. Не могли бы вы посоветовать мне, что я делаю неправильно, пожалуйста?

Думаю, вам нужно сначала добавить строку во вторую таблицу, а затем добавить значение в эту последнюю строку столбца.

SJR 14.12.2020 10:32
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуй это. Согласно комментарию, подумайте, что вы сначала добавили строку во вторую таблицу, а затем вставили значение в нижнюю строку этого столбца.

Хороший гайд по столам здесь.

Public Sub FindingMissingValues()

Dim SourceTable As ListObject
Dim TargetTable As ListObject
Dim rngDataCell As Range

Set SourceTable = Sheet1.ListObjects("Table1")
Set TargetTable = Sheet2.ListObjects("Table2")
   
For Each rngDataCell In SourceTable.ListColumns("Column Name").DataBodyRange.Rows
    If TargetTable.ListColumns("Column Name").DataBodyRange.Find(rngDataCell.Value, , , xlWhole) Is Nothing Then
        TargetTable.ListRows.Add 'adds row at bottom of table
        TargetTable.ListColumns("Column Name").DataBodyRange.Cells(TargetTable.DataBodyRange.Rows.Count).Value = rngDataCell.Value
    End If
Next rngDataCell

End Sub

Другой способ, основанный на способности таблицы автоматически расширяться. Однако я бы согласился с ответом @SJR.

Option Explicit

Public Sub FindingMissingValues()
    Dim SourceTable As ListObject
    Dim TargetTable As ListObject
    Dim rngDataCell As Range
    Dim LastRow As Range
    
    Set SourceTable = Sheet1.ListObjects("Table1")
    Set TargetTable = Sheet2.ListObjects("Table2")
       
    For Each rngDataCell In SourceTable.ListColumns("Column Name").DataBodyRange.Rows
        If TargetTable.ListColumns("Column Name").DataBodyRange.Find(rngDataCell.Value, _
        , , xlWhole) Is Nothing Then
            
            Set LastRow = TargetTable.ListRows(TargetTable.ListRows.Count).Range
            
            TargetTable.ListColumns("Column Name").DataBodyRange.Cells(LastRow.Row + 1 _
            - TargetTable.HeaderRowRange.Row).Value = rngDataCell.Value
        End If
    Next rngDataCell
End Sub

Другие вопросы по теме