2015-11-06 96 views
0

我正在爲使用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)及以上,我得到一個「下標超出範圍」的錯誤。我花了相當多的時間來確定錯誤但不成功。我對陣列的工作也很新,所以過去一週我一直在教自己很多東西,但還有很多東西需要學習。

我非常感謝幫助。謝謝。

+0

當UBound(SplitData)失敗時,它的價值是什麼?看起來你的輸入數組可能比你想象的要小。 –

+0

如果您在引發錯誤的行上放置了斷點,則可以使用「監視」窗口檢查「SplitData」的內容:http://www.cpearson.com/excel/DebuggingVBA.aspx –

+0

謝謝。我使用這個,但現在我遇到的問題是,我正在閱讀的文本文件中有超過8000行;因此,我不打算逐行解析代碼。我沒有從現有的線程中找到有關如何在代碼失敗時確定監視表達式的值的幫助。在這一點上,我需要確定代碼失敗的集合。請告訴我如何使用調試來找到它。謝謝。 – jlynn303

回答

0

我最終添加了一個錯誤處理過程來顯示一個消息框,指出發生錯誤的文本文件的行。一旦我得到這個工作,消息框顯示正確的行,我能夠看到,從第31列開始有一個重複的條目,從第31列到最後一列空行值。一旦我用空值刪除該行,我的代碼運行良好。感謝您的幫助。

0

一般來說,我建議遠離在循環中使用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 

道歉,如果這不是你在找什麼。

+0

非常感謝您提供的建議。然而,我仍然遇到同樣的問題,其中錯誤「下標超出範圍」出現在「strVHCC.add SplitData(31)」行。我繼續混淆調試器,但任何想法將不勝感激。系統內存是問題,是否像升級計算機上的RAM一樣簡單? – jlynn303