代码之家  ›  专栏  ›  技术社区  ›  user3403745

如何从一个Excel表中获取数据并将其添加到其他表中的匹配行中?

  •  1
  • user3403745  · 技术社区  · 6 年前

    我有两个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的行)。我想也许我可以对关系做些什么,但我想不出来。

    感谢您的帮助。谢谢您!

    1 回复  |  直到 6 年前
        1
  •  1
  •   VBasic2008    6 年前

    附加列

    此解决方案需要包含数据的范围的地址、要比较的范围的两个列号和要添加的列数,即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