作为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
这可能吗?
答案 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
答案 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