繁体   English   中英

使用列中的范围对相应值求和

[英]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)。

尝试使用VLOOKUPMATCH ,但不确定我是否朝着正确的方向前进。 我尝试的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 现在7G的 position , 10J的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM