【问题标题】:How to take data from one excel table and add it to matching rows in a different table?如何从一个excel表中获取数据并将其添加到不同表中的匹配行?
【发布时间】:2018-12-19 15:50:46
【问题描述】:

我有两个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 的行)。我想也许我可以对关系做一些事情,但我想不通.

感谢任何帮助。谢谢!

【问题讨论】:

    标签: excel vba pivot-table excel-tables


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2014-07-20
      • 2014-12-08
      相关资源
      最近更新 更多