使用列中的范围对相应值求和
Using range from a column to sum corresponding values
我的数据有 2 列,第 C
列(字母 - A、B、C...)和 D
列(值 - 1、2、3...)。每个字母都有对应的值。
我想做的是从 C
列中找到 2 个单元格(例如“G”到“J”)来设置范围,然后使用此范围对 [= 列中的相应值求和=12=](即7+8+9+10=34)。
尝试使用 VLOOKUP
和 MATCH
,但不确定我的方向是否正确。我尝试的 MATCH
代码返回了 Error 2015
。
请原谅我的任何菜鸟错误,这周才开始学习 VBA 并且是 Whosebug 的新手。感谢您的帮助!
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
你正朝着正确的方向前进。下面提到的代码是你想要的。
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
您也可以使用 Excel 公式实现您想要的效果。
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
为了理解这一点,让我们创建一个基本公式,然后分解公式以了解它是如何工作的。
比方说,你的作品sheet看起来像
那么我们要的是=SUM(D7:D10)
?那么让我们分解一下。
公式可以分解为=SUM("D" & "7" & ":D" & "10")
。不要直接在单元格中输入它。不起作用。好的,接下来就是让它动态化,这样我们就可以获得 7
& 10
。现在 7
是 G
的位置,10
是 J
的位置,我们可以使用 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)
目前只是一个字符串。您必须使用 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
可能会 return 出错,因此我们可以使用 =IFERROR(FORMULA,"ERROR MESSAGE")
解决该问题
所以我们得到了最终的公式
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
one more question.. if i want to present the sum in another sheet in the same workbook, how should i change the formula?
假设数据在 Sheet1
中,所以另一个 sheet 中的公式看起来像
=SUM(Sheet1!D7:D10)
所以现在按照上面的逻辑,你会得到
=IFERROR(SUM(INDIRECT("Sheet1!D" & MATCH("G",Sheet1!C:C,0) & ":D" & MATCH("J",Sheet1!C:C,0))),"Not Found")
我的数据有 2 列,第 C
列(字母 - A、B、C...)和 D
列(值 - 1、2、3...)。每个字母都有对应的值。
我想做的是从 C
列中找到 2 个单元格(例如“G”到“J”)来设置范围,然后使用此范围对 [= 列中的相应值求和=12=](即7+8+9+10=34)。
尝试使用 VLOOKUP
和 MATCH
,但不确定我的方向是否正确。我尝试的 MATCH
代码返回了 Error 2015
。
请原谅我的任何菜鸟错误,这周才开始学习 VBA 并且是 Whosebug 的新手。感谢您的帮助!
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
你正朝着正确的方向前进。下面提到的代码是你想要的。
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
您也可以使用 Excel 公式实现您想要的效果。
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
为了理解这一点,让我们创建一个基本公式,然后分解公式以了解它是如何工作的。
比方说,你的作品sheet看起来像
那么我们要的是=SUM(D7:D10)
?那么让我们分解一下。
公式可以分解为=SUM("D" & "7" & ":D" & "10")
。不要直接在单元格中输入它。不起作用。好的,接下来就是让它动态化,这样我们就可以获得 7
& 10
。现在 7
是 G
的位置,10
是 J
的位置,我们可以使用 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)
目前只是一个字符串。您必须使用 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
可能会 return 出错,因此我们可以使用 =IFERROR(FORMULA,"ERROR MESSAGE")
所以我们得到了最终的公式
=IFERROR(SUM(INDIRECT("D" & MATCH("G",C:C,0) & ":D" & MATCH("J",C:C,0))),"Not Found")
one more question.. if i want to present the sum in another sheet in the same workbook, how should i change the formula?
假设数据在 Sheet1
中,所以另一个 sheet 中的公式看起来像
=SUM(Sheet1!D7:D10)
所以现在按照上面的逻辑,你会得到
=IFERROR(SUM(INDIRECT("Sheet1!D" & MATCH("G",Sheet1!C:C,0) & ":D" & MATCH("J",Sheet1!C:C,0))),"Not Found")