Excel宏VBA代码,用于计算字符串的平均值
我正在尝试创建一些VB代码来在Excel中创建宏。然而,我之前只使用过Python和Java,所以这是全新的,问题是我有一个单元格,其中包含一个数字列表,所有数字都用逗号分隔,并存储为字符串,例如12,5,7,9。这是从其他地方计算出来的。我希望能够遍历数字列表,将它们拆分,将它们转换为整数,然后根据它们的数量计算它们的平均值。我希望这适用于当前选定的单元格,并在下一个单元格中显示结果 这是我到目前为止所做的代码。它不工作,我无法测试它,因为在运行它时获取所需的错误对象。任何建议都很好。谢谢Excel宏VBA代码,用于计算字符串的平均值,vba,excel,Vba,Excel,我正在尝试创建一些VB代码来在Excel中创建宏。然而,我之前只使用过Python和Java,所以这是全新的,问题是我有一个单元格,其中包含一个数字列表,所有数字都用逗号分隔,并存储为字符串,例如12,5,7,9。这是从其他地方计算出来的。我希望能够遍历数字列表,将它们拆分,将它们转换为整数,然后根据它们的数量计算它们的平均值。我希望这适用于当前选定的单元格,并在下一个单元格中显示结果 这是我到目前为止所做的代码。它不工作,我无法测试它,因为在运行它时获取所需的错误对象。任何建议都很好。谢谢 S
Sub CalculateAverage()
Dim contents As String
Dim cell As Range
Dim NumbersArray() As String
Set cell = ActiveCell.Select()
contents = Range(cell).value
NumbersArray = Split(contents, ",")
Dim count As Integer
Dim lengthOfArray As Integer
Dim first As Integer
Dim last As Integer
first = LBound(NumbersArray)
last = UBound(NumbersArray)
lengthOfArray = last - first
Dim total As Integer
Dim value As Integer
count = 0
While count <= lengthOfArray
total = total + CInt(NumbersArray(count))
count = count + 1
Wend
Dim average As Double
average = total / count
Range("A2").value = average
End Sub
Sub-CalculateAverage()
将内容设置为字符串
暗淡单元格作为范围
Dim NumbersArray()作为字符串
Set cell=ActiveCell.Select()
内容=范围(单元格).value
NumberArray=拆分(内容,“,”)
将计数设置为整数
作为整数的Dim lengthOfArray
首先将Dim设置为整数
最后变暗为整数
first=LBound(数字排列)
last=UBound(数字排列)
lengthOfArray=最后一个-第一个
将总计设置为整数
将值设置为整数
计数=0
计数时,尝试将设置单元格=活动单元格。选择()
更改为设置单元格=选择
和内容=范围(单元格)。值
更改为内容=单元格。值
或者只需删除Set cell=ActiveCell.Select()
行并将contents=Range(cell.value
更改为contents=Selection.value
注意:选择单个单元格时,该选项将起作用
以下代码将在“B”列中输入所选单个或多个单元格的平均值-仅限单列选择:
Sub CalculateAverage()
Dim contents As String
Dim cell As Range
Dim NumbersArray() As String
Dim c As Range
Set cell = Selection
For Each c In cell
contents = c.value
NumbersArray = Split(contents, ",")
Dim count As Integer
Dim lengthOfArray As Integer
Dim first As Integer
Dim last As Integer
first = LBound(NumbersArray)
last = UBound(NumbersArray)
lengthOfArray = last - first
Dim total As Integer
Dim value As Integer
total = 0
value = 0
count = 0
While count <= lengthOfArray
total = total + CInt(NumbersArray(count))
count = count + 1
Wend
Dim average As Double
average = 0
average = total / count
'Assuming your data is in column "A" average will be entered in column "B"
Cells(c.Row, "B").value = average
Next c
End Sub
Sub-CalculateAverage()
将内容设置为字符串
暗淡单元格作为范围
Dim NumbersArray()作为字符串
调光范围
设置单元格=选择
对于单元格中的每个c
内容=c值
NumberArray=拆分(内容,“,”)
将计数设置为整数
作为整数的Dim lengthOfArray
首先将Dim设置为整数
最后变暗为整数
first=LBound(数字排列)
last=UBound(数字排列)
lengthOfArray=最后一个-第一个
将总计设置为整数
将值设置为整数
总数=0
值=0
计数=0
当count时,我将使用一个用户定义的函数来实现这一点。比如:
Function CalculateAverage(s As String) As Double
Dim v As Variant, i As Long, total As Double
v = Split(s, ",")
For i = 0 To UBound(v) 'LBound(v) = 0
total = total + v(i) 'VBA will coerce the values to double
Next i
CalculateAverage = total / (UBound(v) + 1)
End Function
它的工作原理如下:
您可以直接从电子表格中使用此函数,但也可以从sub调用此函数
关于您的代码的几点注释:
1) 使用Long
而不是Integer
。整数很容易溢出
2除非您有充分的理由使用整数,否则对电子表格值使用双精度更为惯用。这只是一个示例,说明了如何使用计算
Sub test()
Debug.Print Evaluate("=Average(" & [A1].Value2 & ")")
End Sub
试验
您从哪里得到错误?谢谢,抱歉,无法再编辑了。我仍然会小心使用total=total+v(i)
,因为VBA也会使用+
连接字符串,所以如果您意外地将total
定义为一个变体,它可能会出错。(例如,通过使用Dim total,i等于
)。另外,类似于total=v(0)+v(1)
的操作也会失败,因为VBA将字符串连接起来,然后转换为double。这是一个很好的观点——尽管我认为显式声明total
就像double一样,但我正在小心处理它。事实上,这应该足够了。特别是因为学习如何在一行中声明变量(变量除外)并没有坏处。虽然当total被声明为double时,total=v(0)+v(1)
也会失败,所以它不是完全的傻瓜式(我刚刚经历过)很好。对于来自Python的人(比如@Kerry),应该指出,Evaluate
在VBA中是相当惯用的,并且没有像Python中的eval
那样的安全问题。(很抱歉有这么多评论——Stack Overflow连续两次向我发送了一条关于重新提交请求的错误消息,然后同时发布了一条三倍的评论)@JohnColeman我在VBA中有一些Expirence,但不熟悉Python,所以对我来说很难在您的评论中添加内容)。非常感谢。在Python标签上,任何使用eval
的答案都可能几乎自动被否决。Python的eval可以运行任意代码,因此安全问题即将发生()VBA的Evaluate
与Python的ast.literal_eval
——这通常被认为是eval
()@JohnColeman的安全替代品,如果有一天我会用Python编写代码,我会记住这一点,再次感谢)