Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel宏VBA代码,用于计算字符串的平均值_Vba_Excel - Fatal编程技术网

Excel宏VBA代码,用于计算字符串的平均值

Excel宏VBA代码,用于计算字符串的平均值,vba,excel,Vba,Excel,我正在尝试创建一些VB代码来在Excel中创建宏。然而,我之前只使用过Python和Java,所以这是全新的,问题是我有一个单元格,其中包含一个数字列表,所有数字都用逗号分隔,并存储为字符串,例如12,5,7,9。这是从其他地方计算出来的。我希望能够遍历数字列表,将它们拆分,将它们转换为整数,然后根据它们的数量计算它们的平均值。我希望这适用于当前选定的单元格,并在下一个单元格中显示结果 这是我到目前为止所做的代码。它不工作,我无法测试它,因为在运行它时获取所需的错误对象。任何建议都很好。谢谢 S

我正在尝试创建一些VB代码来在Excel中创建宏。然而,我之前只使用过Python和Java,所以这是全新的,问题是我有一个单元格,其中包含一个数字列表,所有数字都用逗号分隔,并存储为字符串,例如12,5,7,9。这是从其他地方计算出来的。我希望能够遍历数字列表,将它们拆分,将它们转换为整数,然后根据它们的数量计算它们的平均值。我希望这适用于当前选定的单元格,并在下一个单元格中显示结果

这是我到目前为止所做的代码。它不工作,我无法测试它,因为在运行它时获取所需的错误对象。任何建议都很好。谢谢

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编写代码,我会记住这一点,再次感谢)