【问题标题】:How to define the length (number of elements) of an array with N elements in VBA如何在VBA中定义具有N个元素的数组的长度(元素数)
【发布时间】:2020-01-31 21:26:00
【问题描述】:

我刚刚开始学习使用 VBA,我正在编写 VBA 代码来查找具有 N 个元素的数组的平均值。我正在使用一开始定义的数组 A 对其进行测试。如果是 MATLAB 代码,我可以使用 N=Length(A);那会起作用,VBA有没有类似的功能? 注意:我使用的是 Option Base 1,我收到“运行时错误 '13':类型不匹配”

代码如下:

选项基础 1

Sub Question1()

    A = [12,9,8,12,16,19,3,2,5,20]
    i = 1
    Dim N As Integer
    N = UBound(A)

    summ = A(1)

    For i = 1 To (N - 1)
        summ = summ + A(i + 1)
    Next i

    AVG = summ / N

    MsgBox "Average is: " & AVG

End Sub

谢谢。

【问题讨论】:

    标签: excel vba


    【解决方案1】:
    1. 声明所有变量(考虑使用Option Explicit)。
    2. 使用Array() 而不是[]

    Option Base 1
    Option Explicit
    
    Sub Question1()
        Dim A()
        A = Array(12, 9, 8, 12, 16, 19, 3, 2, 5, 20)
    
        Dim i As Long
        i = 1
    
        Dim N As Long
        N = UBound(A)
    
        Dim summ As Double
        summ = A(1)
    
        For i = 1 To (N - 1)
            summ = summ + A(i + 1)
        Next i
    
        Dim AVG As Double
        AVG = summ / N
    
        MsgBox "Average is: " & AVG
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      首先,Dim A As Variant - 始终声明您的变量,始终以 Option Explicit 开头您的模块。您也可以默认开启此功能(工具 > 选项 > 需要变量声明)。

      接下来,相信你可能想要the Array function

      A = Array(12,9,8,12,16,19,3,2,5,20)
      

      在 VBA 中使用 [] 具有完全不同的含义 - 例如,[A1] 将(在 Excel VBA 中)引用 ActiveSheet 的单元格 A1

      【讨论】:

        【解决方案3】:

        你不需要在 Excel 中这样做,你可以使用这样的工作表函数:

        Option Explicit
        Sub Test()
        
            Dim A As Variant
            A = Array(12,9,8,12,16,19,3,2,5,20)
        
            Dim AVG As Single
            AVG = Application.Average(A)
            MsgBox "Average is: " & AVG
        
        End Sub
        
        1. 在模块顶部始终使用Option Explicit 强制 自己声明所有变量。

        2. 不要使用integer,使用Long

        3. UBound(array) 给出最后一个成员的索引,LBound(array) 给出第一个成员的索引。
        4. 您可以使用可以在工作表上使用的相同公式,例如 Application.WorksheetFunction.YourFormula,但如果您跳过 WorksheetFunction 并将值提供给数组,则不会引发错误(如果有的话)。

        虽然你的方式是这样的:

        Sub Test2()
        
            Dim A As Variant
            A = [12,9,8,12,16,19,3,2,5,20]
        
            Dim i As Long, Summ As Long
            For i = 1 To UBound(A)
                Summ = Summ + A(i)
            Next i
        
            AVG = Summ / UBound(A)
        
            MsgBox "Average is: " & AVG
        
        End Sub
        

        【讨论】:

          【解决方案4】:

          首先,由于您使用的是 Excel VBA,因此无需使用任何特殊代码来计算数组的平均值。你可以使用WorksheetFunction.Average

          Option Explicit
          
          Sub Question1()
              Dim a() As Variant ' has to be a variant array, since that's what the `Array` function returns.
              Dim i As Integer
              Dim summ As Integer
              Dim avg As Double
          
              a = Array(12, 9, 8, 12, 16, 19, 3, 2, 5, 20)
          
              avg = Excel.WorksheetFunction.Average(a)
          
              MsgBox "Average is: " & avg
          
          End Sub
          

          如果您希望您的代码更便携(即不必依赖 Excel 的工作表函数),那么我建议您将平均计算拆分为一个单独的函数,您可以使用任何数组和任何基数调用。要计算数组的长度,您需要同时使用LBoundUBound,如文档中的here

          n = UBound(a) - LBound(a) + 1
          

          当然,假设 a 是一个数组,这将始终有效,无论您的数组是从 0 开始、从 1 开始还是完全不同的数组。

          由于无论如何您都在遍历数组以获取总和,因此您也可以使用该循环来获取长度。像这样的:

          Option Explicit
          
          ' assuming that arr is an array containing things we can sum, to get an average.
          Public Function ArrayAverage(arr As Variant) As Double
              Dim n As Long, sum As Double
              Dim i As Long
          
              n = 0: sum = 0
              For i = LBound(arr) To UBound(arr)
                  n = n + 1
                  sum = sum + arr(i)
              Next i
          
              ArrayAverage = sum / n
          End Function
          
          Public Sub Question1()
              Dim a() As Variant, avg As Double
          
              a = Array(12, 9, 8, 12, 16, 19, 3, 2, 5, 20)
              avg = ArrayAverage(a)
              MsgBox "Average is: " & avg
          End Sub
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-12
            • 1970-01-01
            • 1970-01-01
            • 2017-12-08
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            相关资源
            最近更新 更多