1

我有两个 Excel 表,表 A 有 4 列,表 B 有 13 列。表 A 中的 4 列中的每一列都可以在表 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 中的每个位置/年份组合传输到表 A 中的每一行(包括 0 的行)。我想也许我可以对关系做一些事情,但我想不通.

任何帮助表示赞赏。谢谢!

4

1 回答 1

1

附加列

该解决方案需要包含数据的范围的地址、要比较的范围的两个列号以及要添加的列数,即要添加到 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
于 2018-12-19T17:52:21.293 回答