我需要帮助在VBA中创建动态数组

时间:2015-01-03 20:05:35

标签: arrays vba inputbox

有人可以帮助我解决以下问题吗? 基本上我必须使用inputbox创建一个动态数组,它要求一系列数字'til值为空(你按Enter或sth)。然后我必须确定平均值和总和。 在此先感谢!:)

2 个答案:

答案 0 :(得分:1)

为什么要使用数组呢?它变得混乱,ReDim有相当多的开销。

一个简单的循环可以做到这一点(注意缺少验证,但你明白了):

Dim valuesEntered As Integer
Dim total As Integer

valuesEntered = 0
total = 0

Dim inputValue As String
Do
    inputValue = InputBox("Enter a number or leave empty to stop.")

    If inputValue <> "" Then
        valuesEntered = valuesEntered + 1
        total = total + CInt(inputValue)
    End If
Loop Until inputValue = ""

MsgBox "Total: " & total & " / Average: " & (CDbl(total) / CDbl(valuesEntered))

然而如果必须对数组执行此操作,至少考虑使用Collection,因为它已经是动态构造。

答案 1 :(得分:1)

可以这样做,例如使用Application.InputBox函数,然后使用Application.WorksheetFunction.AverageApplication.WorksheetFunction.Sum

使用Application.InputBox的两个例子。

  • 使用Type = 1 (带有do-loop的示例,这可能就是您所要求的)
  • 使用Type = 64 (此处示例如何在一个步骤中插入所有数组值)

有关使用Application.InputBox的更多信息,例如:这里: http://codevba.com/excel/application_inputbox.htm#number (注意:此链接适用于Excel,因此如果此问题与Excel无关,请忽略它。)

Option Explicit

Sub WithInputBoxType1()
    Dim value, values
    Dim averageValue As Double
    Dim sumValue As Double

    On Error GoTo errHandler

    Do
        value = Application.InputBox(Prompt:="Enter number:", Type:=1)
        If value <> False Then
            If IsArray(values) Then
                ReDim Preserve values(UBound(values) + 1)
            Else
                ReDim values(0 To 0)
            End If
            values(UBound(values)) = value
        End If
    Loop While value

    If Not IsArray(values) Then _
        Exit Sub

    averageValue = Application.WorksheetFunction.Average(values)
    sumValue = Application.WorksheetFunction.Sum(values)

    Debug.Print "average = '" & averageValue & "', sum = '" & sumValue & "'"

    Exit Sub

errHandler:
    MsgBox Err.Description, vbExclamation
End Sub

Sub WithInputBoxType64()
    Dim values
    Dim averageValue As Double
    Dim sumValue As Double

    On Error GoTo errHandler

    values = Application.InputBox(Prompt:="Enter {1;2;3} etc. including the curly braces.", Type:=64)

    If values = False Then _
        Exit Sub

    averageValue = Application.WorksheetFunction.Average(values)
    sumValue = Application.WorksheetFunction.Sum(values)

    Debug.Print "average = '" & averageValue & "', sum = '" & sumValue & "'"

    Exit Sub

errHandler:
    MsgBox Err.Description, vbExclamation
End Sub