1

我的数据有 2 列,列C(字母 - A、B、C ...)和列D(值 - 1、2、3 ...)。每个字母都有其对应的值。

我要做的是从列中找到2个单元格(例如“G”到“J”)C来设置范围,然后使用这个范围来求和列中的相应值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
4

2 回答 2

2

您也可以使用 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是 的位置,G10我们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则可以返回错误,因此我们可以使用=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")

于 2021-05-20T05:28:30.663 回答
1

你正朝着正确的方向前进。下面提到的代码是您想要的。

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
于 2021-05-20T04:09:32.363 回答