如何从一个 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
我有两个 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