【问题标题】:Inconsistencies populating an array with members from a split array使用拆分数组中的成员填充数组的不一致
【发布时间】:2015-11-12 03:46:09
【问题描述】:

我正在为使用 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) 及更高版本,我收到“下标超出范围”错误。我花了相当多的时间试图确定错误,但没有成功。我对使用数组也很陌生,所以过去一周我一直在自学很多东西,但还有很多东西要学。

非常感谢您的帮助。谢谢。

【问题讨论】:

  • 失败时UBound(SplitData) 的值是多少?似乎您的输入数组可能比您预期的要小。
  • 如果您在引发错误的行上设置断点,您可以使用监视窗口检查SplitData 的内容:cpearson.com/excel/DebuggingVBA.aspx
  • 谢谢。我正在使用它,但我现在遇到的问题是我正在读取的文本文件中有超过 8,000 行;因此,我不会逐行解析代码。我没有从现有线程中找到有关如何在代码失败时确定监视表达式的值的帮助。此时,我需要确定代码失败的集合的价值。请告知我如何使用调试来找到它。谢谢。
  • 当代码在错误中中断时,点击“调试”按钮,进入 VB 编辑器,在立即窗口中输入:? UBound(SplitData) 并按回车键。你看到了什么?

标签: arrays excel vba


【解决方案1】:

一般来说,我建议不要在循环中使用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 一样简单?
【解决方案2】:

我最终添加了一个错误处理过程,以显示一个消息框,说明发生错误的文本文件所在的行。一旦我让它工作,消息框显示正确的行,我能够看到从第 31 列开始有一个重复的条目,其中从第 31 列到最后一列的空白行值。一旦我用空值删除了那行,我的代码就可以正常工作了。谢谢你的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多