简体   繁体   English

Excel VBA-下标超出范围

[英]Excel VBA - Subscript out of range

I need help. 我需要帮助。 The below code is written to add to column data and store in another column. 编写以下代码,以添加到列数据并存储在另一列中。 When I execute the code it says subscript out of range in for loop where it adds to array values. 当我执行代码时,它说下标超出了for循环的范围,并在此添加了数组值。

Kindly give an advice. 请给个建议。

Thanks 谢谢

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

Arr3 is never The error is caused because Arr3 was never initialized as an array. 永远不会将Arr3出现该错误是因为从未将Arr3初始化为数组。 Arr1(i) will also throw an error because Arr1 is a 2 dimensional array; Arr1(i)也将引发错误,因为Arr1是二维数组。 use Arr1(i, 1) instead. 请改用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 

In the declaration above R5 's datatype is Double the rest are Variants. 在上面的声明中, R5的数据类型为Double,其余为变量。

在此处输入图片说明

Here are a few videos that will help: 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) and Excel VBA Introduction Part 25 - Arrays 以下是一些视频,这些视频将有所帮助: Excel VBA简介第3部分-出错时的处理方法(错误和调试)Excel VBA简介第34部分-类型声明(用户定义的类型)Excel VBA简介第25部分-数组

  1. Use explicit sheet name for Range references 使用明确的工作表名称作为范围引用
  2. You create a 2D array when reading a range into an array so use Transpose if planning on looping as shown as will generate a 1D array off the single column ranges being passed in 在将范围读入数组时会创建一个2D数组,因此,如果计划进行循环,请使用“转置”,如图所示,它将在传入的单列范围内生成一维数组
  3. Declare and Redim Arr3 so enough space for all items 声明和Redim Arr3,以便为所有项目留出足够的空间

Code: 码:

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

you could use a 2D array 您可以使用2D阵列

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM