为什么倒数第二行显示下标超出范围错误



任务是将来自不同文件的数据合并到一个文件中。要选择的范围是 4 个单元格的列向量,输出在数组(n*4 分布(中是必需

Option Explicit
Option Base 1

Sub RalphieReactor()
Dim filenames() As Variant, i As Integer, A() As Variant, j As Integer, nw As Integer
Dim twb As Workbook, awb As Workbook, userrange As Range, importrange As String
Set twb = ThisWorkbook
filenames = Application.GetOpenFilename(Title:="Open File(s)", MultiSelect:=True)
nw = UBound(filenames)
For i = 1 To nw
Workbooks.Open filenames(i)
Set awb = ActiveWorkbook
Set userrange = Application.InputBox(Prompt:="Range", Type:=8)
importrange = userrange.Address
For j = 1 To 4
A(i, j) = awb.Sheets(1).Range(importrange).Cells(i, j)
Next j

Next i
End Sub

声明A() As Variant具有 A 的含义将是Variant 类型的数组 - 但确切的大小尚未确定。在您的情况下,您无法声明大小,因为它取决于所选文件的数量,所以没关系。

但是,在使用此数组之前,必须指定其大小(因为 VBA 运行时需要保留一些内存空间,为此,它需要知道大小以计算需要多少内存(。如果不这样做,数组根本不包含任何成员,并且您会得到下标超出范围错误。幸运的是,您会收到此错误,这意味着 VBA 运行时会阻止将未保留的内容写入内存,从而导致可怕的事情(称为"堆栈溢出"或"堆溢出"(。

在 VBA 中,在运行时为错误分配内存的命令Redim。你需要一个二维数组,第一维是nw(所选文件的数量(,第二维是 4,所以语句是

Redim A(1 to nw, 1 to 4)

(你可以写Redim A(nw, 4)简称,但我认为最好指定下限和上限(。
在打开外部For循环之前,请将该语句放在正确的位置。

最新更新