Excel中VB标超出范围修复宏

Excel中VB标超出范围修复宏

问题描述:

这里是navrecExcel中VB标超出范围修复宏

Public navrec(1 To 100000, 100) As Variant 


navrec(r,c) = Cells(r,c) 

声明我遇到标超出范围误差对上述环状线路以下程序

我试图内使用VB-Excel的有限工作知识修复此宏。我假设前面的循环范围'navreclr & navreclc正在引用太大的数据区域?

Sub import_navr() 

EntityList = mywkb.Sheets("Source Files").Range("nrlist") 
navreclr = 0 
days = 0 

fname = navrecloc 

If Dir(fname) = "" Then 
MsgBox ("Please save current PVAL. Macro will end") 
End 
End If 

Workbooks.Open fname, ReadOnly:=True 
Set tempbk = ActiveWorkbook 

navreclr = Cells(1048576, 1).End(xlUp).Row 
navreclc = Sheets(1).Cells(1, 1).End(xlToRight).Column 

For r = 1 To navreclr 
    For c = 1 To navreclc 
      navrec(r, c) = Cells(r, c) 
    Next c 
Next r 

For c = 1 To navreclc 
    If navrec(1, c) = "ENTITY_ID" Then einr = c 
    If navrec(1, c) = "SHARE_CLASS" Then scnr = c 
    If navrec(1, c) = "LEDGER_ITEMS" Then linr = c 
    If navrec(1, c) = "BALANCE_CHANGE" Then bcnr = c 
Next c 


Set ofs = CreateObject("Scripting.FileSystemObject") 
mywkb.Sheets("Source Files").Range("nrlist").Cells(1, 2) = ofs.GetFile(fname).Datelastmodified 

tempbk.Close savechanges:=False 

End Sub 

问题是您的数组navrec不是保存所有单元格的正确大小。您可以通过添加以下代码直接在上述循环解决这个问题(我已经包括下面的环):

ReDim navrec(navreclr, navreclc) As Variant 

For r = 1 To navreclr 
    For c = 1 To navreclc 
     navrec(r, c) = Cells(r, c) 
    Next c 
Next r 

当你确定你的动态数组的维度,在这个例子中,一般最好是也要动态地声明数组,而不是使用常量大小。尽量不要过度使用内存,除非有充分理由这样做。

您还需要在全局模块中声明变量dimensionless,否则将会出现一个错误,指出“Array already dimensioned。”。

替换:

Public navrec(1 To 100000, 100) As Variant 

Public navrec() As Variant 

消除这种错误。

+0

此过程是许多之一。 navrec的原始声明是'公共navrec(1到100000,100)作为Variant'我添加了您的调整,并且代码表明该变量已经被标注。我不确定是否应该编辑似乎是全球变数的公开声明。 – phillipsK 2014-10-06 23:32:18

+0

查看我的文章更新。声明'navrec'无量纲,它将工作。 – 2014-10-06 23:41:33

可以直接在一个操作中拾取的矩形阵列的值:

Set tempbk = Workbooks.Open(fname, ReadOnly:=True) 

With tempbk.Sheets(1) 
    'get row/col counts 
    navreclr = .Cells(.Rows.Count, 1).End(xlUp).Row 
    navreclc = .Cells(1, .Columns.Count).End(xlToLeft).Column 

    'assign range value to array 
    nacrec = .cells(1).Resize(navreclr, navreclc).Value 

End With