Excel VBA:在大于0的行中查找第一个值,并在以下4个单元格中求和

时间:2016-01-15 12:57:34

标签: excel vba excel-vba

作为VBA Excel的完全初学者,我希望能够做到以下几点:

我想在一行中找到大于0的第一个值,然后对同一行中的以下4个单元格求和。所以

Animal1    0    0    1    2    3    0    1
Animal2    3    3    0    1    4    2    0
Animal3    0    0    0    0    0    1    0

结果

Animal1    7
Animal2    11
Animal3    1

这可能吗?

3 个答案:

答案 0 :(得分:2)

(你的问题描述并不符合你的例子。我把这个问题解释为连续4个元素之一,它以第一个数字大于0开头。如果我的解释错了 - 以下代码需要调整。)

您可以使用用户定义的函数(即UDF - 旨在用作电子表格函数的VBA函数)来执行此操作:

Function SumAfter(R As Range, n As Long) As Variant
    'Sums the (at most) n elements beginning with the first occurence of
    'a strictly positive number in the range R,
    'which is assumed to be 1-dimensional.
    'If all numbers are zero or negative -- returns a #VALUE! error

    Dim i As Long, j As Long, m As Long
    Dim total As Variant

    m = R.Cells.Count
    For i = 1 To m
        If R.Cells(i).Value > 0 Then
            For j = i To Application.Min(m, i + n - 1)
                total = total + R.Cells(j)
            Next j
            SumAfter = total
            Exit Function
        End If
    Next i
    'error condition if you reach here
     SumAfter = CVErr(xlErrValue)
End Function

如果您的示例数据位于A1:H3,那么将公式=SumAfter(B1:H1,4)放在I1中并向下复制将按预期工作。请注意,代码比问题描述稍微宽泛一些。如果您打算使用VBA,您可以尽可能灵活地使您的子/功能。另请注意,如果您正在编写UDF,那么如果输入违反了预期,最好考虑要返回的错误类型。请参阅this以获得精彩的讨论(来自Chip Pearson的网站 - 这是Excel VBA程序员的绝佳资源)。

ON EDIT:如果你想要将大于0的第一个单元格添加到接下来的4个单元格(总和中的5个单元格),那么我给出的函数按原样工作,但使用=SumAfter(B1:H1,5)代替{ {1}}。

答案 1 :(得分:2)

这是您如何获得所需结果的变体之一:

 Sub test()
        Dim cl As Range, cl2 As Range, k, Dic As Object, i%: i = 1
        Set Dic = CreateObject("Scripting.Dictionary")
        For Each cl In ActiveSheet.UsedRange.Columns(1).Cells
            For Each cl2 In Range(Cells(cl.Row, 2), Cells(cl.Row, 8))
                If cl2.Value2 > 0 Then
                    Dic.Add i, cl.Value2 & "|" & Application.Sum(Range(cl2, cl2.Offset(, 4)))
                    i = i + 1
                    Exit For
                End If
        Next cl2, cl
        Workbooks.Add: i = 1
        For Each k In Dic
            Cells(i, "A").Value2 = Split(Dic(k), "|")(0)
            Cells(i, "b").Value2 = CDec(Split(Dic(k), "|")(1))
            i = i + 1
        Next k
    End Sub

enter image description here

答案 2 :(得分:0)

以下是我要使用的内容,我不知道您使用过的任何单元格位置,因此您需要自行更改。

未来参考这不是一个代码编写网站,如果你是VBA的新手,我建议先做一些简单的事情,出现一个消息框,使用代码移动到不同的单元格,尝试一些if statments和/或loop 。当你开始使用varibles(布尔,字符串,整数等)时,你可以看到你可以走多远。正如我想说的那样,"如果你能在excel中做到这一点,代码可以做得更好"

如果代码不起作用或者不适合你的需要那么改变它就可以了,当我使用它时它适用于我但我不是你也没有你的电子表格

将其粘贴到您的vba中,然后使用F8逐步查看它是如何工作的以及是否要使用它。

Sub test()

[A1].Select ' assuming it starts in column A1

'loops till it reachs the end of the cells or till it hits a blank cell
Do Until ActiveCell.Value = ""

ActiveCell.Offset(0, 1).Select

'adds up the value of the cells going right and removes the previous cell to clean up
Do Until ActiveCell.Value = ""
x = x + ActiveCell.Value
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).ClearContents
Loop

'goes back to the begining and ends tallyed up value
Selection.End(xlToLeft).Select
ActiveCell.Offset(0, 1).Value = x

'moves down one to next row
ActiveCell.Offset(1, 0).Select

Loop

End Sub