Я хотел бы перебрать столбец таблицы 1, и если значение отсутствует в том же имени столбца таблицы 2, то вставить его в конец таблицы 2. Приведенный ниже код вставляет точное количество строк из таблицы Table1, но вставляет значение только последней строки.
например Таблица 1:
После запуска макроса Table2 выглядит так:
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
Кажется, что он не ищет конкретные значения ячеек. Не могли бы вы посоветовать мне, что я делаю неправильно, пожалуйста?
Попробуй это. Согласно комментарию, подумайте, что вы сначала добавили строку во вторую таблицу, а затем вставили значение в нижнюю строку этого столбца.
Хороший гайд по столам здесь.
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
Думаю, вам нужно сначала добавить строку во вторую таблицу, а затем добавить значение в эту последнюю строку столбца.