数组 - 下标超出VBA范围

时间:2017-09-19 13:53:39

标签: excel vba excel-vba

我正在尝试将值存储在数组中。我正面临一个问题,它说下标超出了范围。

这是代码,

Sub Trial()

Dim HeaderArray() As Variant

Dim HeaderValue As String

Dim j As Long

Dim i as Long

set wk = Activeworkbook

lastrow_header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row

j = 1

      For i = 2 To lastrow_header_Config

         HeaderValue = Wk.Sheets("Config").Range("W" & i).Value

             If HeaderValue <> "" Then

              HeaderArray(j - 1) = HeaderValue // Subscript out of range error

             j = j + 1

             End If

      Next

End Sub

我犯的错误是什么。请建议。

3 个答案:

答案 0 :(得分:4)

在尝试将数据放入其中之前,您需要声明数组的大小。使用COUNTA查找包含您范围内数据的单元格数:

Sub Trial()

Dim HeaderArray() As Variant
Dim HeaderValue As String
Dim lastrow_Header_Config As Long
Dim j As Long
Dim i As Long

Set Wk = ActiveWorkbook

lastrow_Header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row
ReDim HeaderArray(Application.WorksheetFunction.CountA(Wk.Sheets("Config").Range("W2:W" & lastrow_Header_Config))-1) As Variant
j = 0

For i = 2 To lastrow_Header_Config
    HeaderValue = Wk.Sheets("Config").Range("W" & i).Value
    If HeaderValue <> "" Then
        HeaderArray(j) = HeaderValue
        j = j + 1
    End If
Next

End Sub

答案 1 :(得分:3)

试一下,看看它是如何为你工作的

密切关注 ReDim HeaderArray(j) 行和 ReDim Preserve HeaderArray(j)

Sub Trial()
    Dim HeaderArray() As Variant
    Dim HeaderValue As String
    Dim j As Long
    Dim i As Long
        Set Wk = ActiveWorkbook
        lastrow_header_Config = Wk.Sheets("Config").Cells(Rows.Count, "W").End(xlUp).Row
        j = 1
        ReDim HeaderArray(j)   '<============= initialize your array length
        For i = 2 To lastrow_header_Config
            HeaderValue = Wk.Sheets("Config").Range("W" & i).Value
            If HeaderValue <> "" Then
                ReDim Preserve HeaderArray(j) '<================= adjust your array length to accomodate the additional info
                HeaderArray(j - 1) = HeaderValue '// Subscript out of range error
                j = j + 1
            End If
        Next
End Sub

您也可以阅读使用option关键字。默认情况下,数组在索引0处具有第一个数据点,因此例如,数组(1)创建一个具有1个数据点的数组,但是要引用该数据点,您将使用数组(0)。如果您希望使用数组(1)引用数组中的第一个数据点,那么您可以在模块的最顶部使用 Option Base 1 关键字。

答案 2 :(得分:1)

第一遍j = 1。因此,您尝试将HeaderArray(0)设置为值,而HeaderArray可能基于1 您最终可以使用Option Base 0,或明确Redim HeaderArray(0 to 10)(或您需要的任何值)