[英]Using range from a column to sum corresponding values
我的数据有 2 列, C
列(字母 - A、B、C...)和D
列(值 - 1、2、3...)。 每个字母都有其对应的值。
我要做的是从C
列中找到 2 个单元格(例如“G”到“J”)来设置范围,然后使用这个范围来求和D
列中的相应值(即 7+8+9+ 10=34)。
尝试使用VLOOKUP
和MATCH
,但不确定我是否朝着正确的方向前进。 我尝试的MATCH
代码返回Error 2015
。
请原谅我的任何新手错误,这周刚开始学习 VBA 和 stackoverflow 的新手。 谢谢您的帮助!
Sub loop1()
'Dynamic range for cells with data
Dim LastRow As Long
LastRow = Worksheets("HU").Cells(Rows.Count, 2).End(xlUp).Row '
LastRow1 = LastRow - 1
Rng = "C1:D" & LastRow1
matchrng = "C1:C" & LastRow1
'Locate start cell in data
alphabet_start = "G"
locate_start = Application.Match(alphabet_start, matchrng, 0)
'Determine end cell
alphabet_end = "J"
'WIP_end = Application.VLookup(alphabet_end, myrange, 2, False)
End Sub
您也可以使用 Excel 公式来实现您想要的。
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
为了理解这一点,让我们创建一个基本公式,然后分解公式以了解它是如何工作的。
假设,您的工作表看起来像
所以我们想要的是=SUM(D7:D10)
? 所以让我们打破这个。
该公式可以分解为=SUM("D" & "7" & ":D" & "10")
。 暂时不要直接在单元格中输入。 不起作用。 好的,接下来就是让它动态化,这样我们就可以得到7
& 10
。 现在7
是G
的 position , 10
是J
的 position ,我们可以使用MATCH
获得。 例如
MATCH("G",C:C,0) and
MATCH("J",C:C,0)
所以公式现在可以写成
=SUM("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))
"D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0)
is just a string at the moment. 您必须使用INDIRECT
告诉 excel 将其视为一个范围。 所以字符串现在变成了
INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))
然后将其放入SUM
公式中。
SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0)))
最后一件事。 如果未找到匹配项, MATCH
会返回错误,因此我们可以使用=IFERROR(FORMULA,"ERROR MESSAGE")
解决该问题
所以我们得到了最终的公式
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
还有一个问题..如果我想在同一个工作簿的另一张表中显示总和,我应该如何更改公式?
假设数据在Sheet1
,所以另一张表中的公式看起来像
=SUM(Sheet1!D7:D10)
所以现在按照上面的逻辑,你会得到
=IFERROR(SUM(INDIRECT("Sheet1,D" & MATCH("G":Sheet1,C:C,0) & ":D" & MATCH("J",Sheet1,C:C,0))),"Not Found")
你正朝着正确的方向前进。 下面提到的代码是您想要的。
Sub loop1()
'Dynamic range for cells with data
Dim LastRow As Long, locate_start As Variant, locate_end As Variant, matchrng As Range
Dim alphabet_start As String, alphabet_end As String
LastRow = Worksheets("HU").Cells(Rows.Count, 3).End(xlUp).Row '<== Last row of data in Column C
Set matchrng = ThisWorkbook.Worksheets("HU").Range("C1:C" & LastRow) '<== Set range to Search
'Locate start cell in data
alphabet_start = "G"
locate_start = Application.Match(alphabet_start, matchrng, 0) '<== First position
'Determine end cell
alphabet_end = "J"
locate_end = Application.Match(alphabet_end, matchrng, 0) '<== Last Position
'If not is error to handle error If alphabet_start or alphabet_end is not found
If Not IsError(locate_start) And Not IsError(locate_end) Then
' Here output is at the end of column D after empty space. You may change as required
ThisWorkbook.Worksheets("HU").Range("D" & LastRow + 2) = _
Application.Sum(ThisWorkbook.Worksheets("HU").Range(Cells(locate_start, 4), Cells(locate_end, 4)))
End If
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.