Как взять данные из одной таблицы Excel и добавить их в соответствующие строки в другой таблице? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть две таблицы Excel, таблица A имеет 4 столбца, таблица B имеет 13. Каждый из 4 столбцов таблицы A можно найти в таблице B. Они состоят из данных подсчета из переписей.Во время переписей люди подсчитывали виды, с которыми они столкнулись, и давали оценку, но они не записывали, когда не встречали виды.Я добавил в 0 за годы и места, где виды не были найдены с помощью сводных диаграмм / макросов.Но теперь у меня есть таблица A, которая включает в себя значения 0, но в ней отсутствуют все дополнительные данные из таблицы B. Таблицы выглядят примерно так (упрощенно):

Table A

species    location    year    value
Mango      A           2001    2
Mango      A           2002    3
Mango      A           2003    1
Avocado    A           2001    1
Avocado    A           2002    0
Avocado    A           2003    0
Mango      B           2001    0
Mango      B           2002    2
Mango      B           2003    20
Avocado    B           2001    25
Avocado    B           2002    80
Avocado    B           2003    0


Table B

species    location    year    value   month   day    group    uploaded?
Mango      A           2001    2       12      1      X        No     
Mango      A           2002    3       12      5      X        Yes      
Mango      A           2003    1       12      3      X        No
Avocado    A           2001    1       12      1      X        No
Mango      B           2002    2       12      6      Y        No
Mango      B           2003    20      12      7      Y        No
Avocado    B           2001    25      12      4      Y        No
Avocado    B           2002    80      12      6      Y        No

Вы можете видеть, что таблица B содержит всестроки в таблице A, которые имеют значения выше 0, но не содержат строк со значениями 0. Каждый комбинированный элемент год / местоположение в таблице B содержит одинаковые данные для всех остальных столбцов, кроме видов и значений.

Есть ли способ взять данные из таблицы B и поместить их в соответствующие строки в таблице A?Мне бы хотелось, чтобы это работало так, чтобы каждая комбинация местоположения / год в Таблице B была перенесена в каждую строку (включая строки с 0) в Таблице A. Я подумал, что, возможно, я мог бы что-то сделать со связями, но я не мог понять это.

Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 19 декабря 2018

Дополнительные столбцы

Для этого решения требуются адреса диапазонов, содержащих данные, номера двух столбцов сравниваемых диапазонов и количество добавляемых столбцов, т.е. количество последних столбцов от Range1 добыть добавленным в Range2.

До

enter image description here

После

enter image description here

Код

Sub AdditionalColumns()

  Const cStr1 As String = "A4:D15"        ' First Range
  Const cStr2 As String = "A21:H28"       ' Second Range
  Const cIntCol1 As Integer = 2           ' First Compare Column
  Const cIntCol2 As Integer = 3           ' Second Compare Column
  Const cIntAdd As Integer = 4            ' Additional Columns

  Dim vnt1 As Variant                     ' First Array
  Dim vnt2 As Variant                     ' Second Array
  Dim vntTarget As Variant                ' Target Array

  Dim i As Long                           ' First Array Row Counter
  Dim j As Long                           ' Second Array Row Counter
  Dim k As Long                           ' Target Array Column Counter

  With ThisWorkbook.Worksheets("Sheet1")

    vnt1 = .Range(cStr1)
    vnt2 = .Range(cStr2)

    ReDim vntTarget(1 To UBound(vnt1), 1 To cIntAdd)

    For i = 1 To UBound(vnt1)
      For j = 1 To UBound(vnt2)
        If vnt1(i, cIntCol1) = vnt2(j, cIntCol1) Then
          If vnt1(i, cIntCol2) = vnt2(j, cIntCol2) Then
            For k = 1 To cIntAdd
              vntTarget(i, k) = vnt2(j, k + UBound(vnt1, 2))
            Next
            Exit For
          End If
        End If
      Next
    Next

    .Cells(.Range(cStr1).Row, .Range(cStr1).Columns.Count _
        + .Range(cStr1).Column) _
        .Resize(UBound(vntTarget), UBound(vntTarget, 2)) = vntTarget

  End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...