【问题标题】:Excel VBA - Subscript out of rangeExcel VBA - 下标超出范围
【发布时间】:2018-11-28 14:42:31
【问题描述】:

我需要帮助。编写以下代码以添加到列数据并存储在另一列中。当我执行代码时,它会在 for 循环中显示下标超出范围,并将其添加到数组值中。

请多多指教。

谢谢

Sub test()

    Dim W1, W2, R1, R2, R3, R4, R5 As Double
    Dim i, j, T As Integer
    Dim myRange As Double
    Dim Arr1 As Variant, Arr2 As Variant, Arr3 As Variant

    myRange1 = Worksheets("Sheet2").Range("M15", "M30")
    myRange2 = Worksheets("Sheet2").Range("N15", "N30")
    R1 = WorksheetFunction.Sum(myRange1)
    R2 = WorksheetFunction.Sum(myRange2)
    R3 = (R1 + R2)
    R4 = (R1 / R3) * 100
    R5 = (R2 / R3) * 100
    Range("M31") = R4
    Range("N31") = R5
    Arr1 = Range("M15:M30").Value
    Arr2 = Range("N15:N30").Value

    For i = LBound(Arr1) To UBound(Arr1)
        Arr3(i) = Arr1(i) + Arr2(i)
    Next

    T = 16
    For j = 1 To T
        Range("M" & 33 + j).Cells = Arr3
    Next

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    Arr3 永远不会 该错误是因为 Arr3 从未初始化为数组而引起的。 Arr1(i) 也会抛出错误,因为 Arr1 是一个二维数组;请改用Arr1(i, 1)

    ReDim Arr3(LBound(Arr1) To UBound(Arr1))
    For i = LBound(Arr1) To UBound(Arr1)
        Arr3(i) = Arr1(i, 1) + Arr2(i, 1)
    Next
    
    Dim W1, W2, R1, R2, R3, R4, R5 As Double
    

    在上面的声明中R5 的数据类型是 Double 其余的是 Variants。

    这里有一些视频会有所帮助:Excel VBA Introduction Part 3 - What to do When Things Go Wrong (Errors and Debugging)Excel VBA Introduction Part 34 - Type Declarations (User-Defined Types)Excel VBA Introduction Part 25 - Arrays

    【讨论】:

      【解决方案2】:
      1. 为范围引用使用明确的工作表名称
      2. 您在将范围读入数组时创建了一个二维数组,因此如果计划循环使用 Transpose,如图所示,将从传入的单列范围生成一维数组
      3. 声明和 Redim Arr3 以便为所有项目提供足够的空间

      代码:

      Option Explicit
      Public Sub TEST()
          Dim Arr1(), Arr2(), Arr3(), i As Long, ws As Worksheet
          Set ws = ThisWorkbook.Worksheets("Sheet1")
      
          Arr1 = Application.Transpose(ws.Range("M15:M30").Value)
          Arr2 = Application.Transpose(ws.Range("N15:N30").Value)
          ReDim Arr3(1 To UBound(Arr1))
          For i = LBound(Arr1) To UBound(Arr1)
              Arr3(i) = Arr1(i) + Arr2(i)
          Next
      End Sub
      

      【讨论】:

        【解决方案3】:

        你可以使用二维数组

        Public Sub TEST()    
            Dim Arr(), Arr3(), i As Long
            With ThisWorkbook.Worksheets("Sheet1").Range("M15:N30") ' reference wanted range in wanted sheet and workbook
                    Arr = .Value ' store referenced range values in an array
                    ReDim Arr3(1 To UBound(Arr, 1))
                    For i = 1 To UBound(Arr, 1)
                        Arr3(i) = Arr(i, 1) + Arr(i, 2)
                    Next
                .Offset(18).Resize(, 1).Value = Application.Transpose(Arr3) ' paste array values to referenced range offsetted 18 rows down and resize to one column
            End With
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-27
          • 2014-04-20
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多