从分割数组中填充数组的不一致性
我正在为使用VBA为Excel创建的程序苦苦挣扎。该程序的最终目的是基于用户通过用户列表框选择其中一个元素来将文本文件的特定元素读入Excel电子表格。请参阅我的代码,下面是我的程序部分有关1)使用作业集编号填充列表框以及2)从非常大的逗号分隔文本文件填充包含所需数据的特定数组:从分割数组中填充数组的不一致性
Private Sub UserForm_Initialize()
'Declare variables
Const CMMData As String = "\\ATSTORE01\CMMData\21064D\21064D-OP400.dat"
Dim strSN() As String
Dim strSet() As String
Dim strFF() As String
Dim strVHCC() As String
Dim strVHCCMID() As String
Dim strVHCVMID() As String
Dim strVHCV() As String
Dim strHWCC() As String
Dim strHWCCMID() As String
Dim strHWCVMID() As String
Dim strHWCV() As String
Dim LineData As String
Dim SplitData() As String
Dim LineIter As Long
'Populate Set Number Listbox
With New Scripting.FileSystemObject
With .OpenTextFile(CMMData, ForReading)
Do Until .AtEndOfStream
LineData = .ReadLine
SplitData = Split(LineData, ",", 154, vbTextCompare)
'Extracting Serial Number
ReDim Preserve strSN(0 To LineIter)
strSN(UBound(strSN)) = SplitData(0)
'Extracting Set Number
ReDim Preserve strSet(0 To LineIter)
strSet(UBound(strSet)) = SplitData(1)
'Extracting Final Flow Area
ReDim Preserve strFF(0 To LineIter)
strFF(UBound(strFF)) = SplitData(14)
'Extracting /V/ To Hook CC
ReDim Preserve strVHCC(0 To LineIter)
strVHCC(UBound(strVHCC)) = SplitData(31)
Set_Select.AddItem SplitData(1)
LineIter = LineIter + 1
Loop
.Close
End With
End With
For LineIter = LBound(strFF) To UBound(strFF)
MsgBox strFF(LineIter)
Next LineIter
End Sub
其中我有麻烦上述代码的面积如下:
'Extracting /V/ To Hook CC
ReDim Preserve strVHCC(0 To LineIter)
strVHCC(UBound(strVHCC)) = SplitData(31)
代码填充分割阵列最多(30)。对于数组(31)及以上,我得到一个“下标超出范围”的错误。我花了相当多的时间来确定错误但不成功。我对阵列的工作也很新,所以过去一周我一直在教自己很多东西,但还有很多东西需要学习。
我非常感谢帮助。谢谢。
我最终添加了一个错误处理过程来显示一个消息框,指出发生错误的文本文件的行。一旦我得到这个工作,消息框显示正确的行,我能够看到,从第31列开始有一个重复的条目,从第31列到最后一列空行值。一旦我用空值删除该行,我的代码运行良好。感谢您的帮助。
一般来说,我建议远离在循环中使用ReDim
,因为这是一个相当昂贵的过程。应用程序必须创建一个与redim一样大的新内存空间,然后将所有数据从旧数组移到新数组,然后更新指针以查看新数组,然后垃圾回收旧数组。在这种情况下,我会建议使用集合对象。
但是,这并不能回答你的问题。
当我运行你的代码时,我不能得到同样的错误,除非我尝试写入未声明的数组或超出数组边界。由于ReDim
进程可能会耗尽阵列内存,但我在代码中完全没有使用ReDim,因为我发现它导致的问题多于解决的问题。
无论如何,这里是我会怎么做这与收藏:
Private Sub UserForm_Initialize()
'Declare variables
Const CMMData As String = "\\ATSTORE01\CMMData\21064D\21064D-OP400.dat"
Dim strSN As Collection
Dim strSet As Collection
Dim strFF As Collection
Dim strVHCC As Collection
Dim LineData As String
Dim SplitData() As String
Dim LineIter As Long
Set strSN = New Collection
Set strSet = New Collection
Set strFF = New Collection
Set strVHCC = New Collection
'Populate Set Number Listbox
With New Scripting.FileSystemObject
With .OpenTextFile(CMMData, ForReading)
Do Until .AtEndOfStream
LineData = .ReadLine
SplitData = Split(LineData, ",", 154, vbTextCompare)
'Extracting Serial Number
strSN.add SplitData(0)
'Extracting Set Number
strSet.add SplitData(1)
'Extracting Final Flow Area
strFF.add SplitData(14)
'Extracting /V/ To Hook CC
strVHCC.add SplitData(31)
Set_Select.AddItem SplitData(1)
LineIter = LineIter + 1
Loop
道歉,如果这不是你在找什么。
非常感谢您提供的建议。然而,我仍然遇到同样的问题,其中错误“下标超出范围”出现在“strVHCC.add SplitData(31)”行。我继续混淆调试器,但任何想法将不胜感激。系统内存是问题,是否像升级计算机上的RAM一样简单? – jlynn303
当UBound(SplitData)失败时,它的价值是什么?看起来你的输入数组可能比你想象的要小。 –
如果您在引发错误的行上放置了断点,则可以使用“监视”窗口检查“SplitData”的内容:http://www.cpearson.com/excel/DebuggingVBA.aspx –
谢谢。我使用这个,但现在我遇到的问题是,我正在阅读的文本文件中有超过8000行;因此,我不打算逐行解析代码。我没有从现有的线程中找到有关如何在代码失败时确定监视表达式的值的帮助。在这一点上,我需要确定代码失败的集合。请告诉我如何使用调试来找到它。谢谢。 – jlynn303