如何从一个 excel table 中获取数据并将其添加到另一个 table 中的匹配行?

How to take data from one excel table and add it to matching rows in a different table?

我有两个 excel 表,Table A 有 4 列,Table B 有 13 列。Table A 中的 4 列中的每一列都可以在Table B. 它们由人口普查的计数数据组成。在普查期间,人们计算他们遇到的物种并给出一个值,但当他们没有遇到一个物种时,他们不会写下来。我在使用枢轴 charts/macros 未发现物种的年份和位置中添加了 0。但现在我的 Table A 包含 0 值,但它缺少来自 Table 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

您可以看到 Table B 包含 Table A 中值大于 0 但不包含值 0 的所有行。每个 year/location 组合Table B 除了物种和价值外,其他所有列的数据都相同。

有没有办法从 Table B 中获取数据并将其放入 Table A 中的适当行?我希望它能够工作,以便 Table B 中的每个 location/year 组合都将被传输到 Table A 中的每一行(包括带有 0 的行)。我想也许我可以做点什么有关系,但我想不通。

感谢任何帮助。谢谢!

其他列

此解决方案需要包含数据的范围的地址、要比较的范围的两个列号以及要添加的列数,即要添加到 Range2 的 Range1 的最后一列的数量。

之前

之后

代码

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