2017-07-31 128 views
2

我有一段代碼打開文件夾中的每個文本文件,我不僅要將文件名放入數組,而且還要將文件內的文本拆分爲數組,像這樣:新的數組在For Next循環中每次迭代VBS

i = 0 
n = 1 
For Each File In Folder 
    i = i + 1 
    Dim UserArray & i() 
    Set openedFile = fso.OpenTextFile(File) 
    Do Until openedFile.AtEndOfStream 
     Line = openedFile.ReadLine 
     ReDim Preserve UserArray & i(n) 
     UserArray & i(n) = Line 
     n = n + 1 
    Loop 
    n = 0 
Loop 

這個想法是,每一行將strComp以後從另一個文本文件的另一行數組。 因此,每個文件需要爲其文本內容創建一個唯一的數組名稱,並且任何給定文件夾中的文件數量都不相同。

以上不起作用,有什麼想法?

回答

2

代碼中存在語法錯誤(第5,9,10行 - 使用execute語句修復,允許您在運行時用不同名稱動態聲明變量)以及變量拼寫錯誤(第8行)。

P.S.我沒有對這裏應用的邏輯做任何改變。只是想糾正錯誤。

i = 0 
n = 0             'initialised to 0 
For Each File In Folder 
    i = i + 1 
    Execute "Dim UserArray"&i&"()"      'used execute statement to declare arrays with new names based on the value of i for each file 
    Set openedFile = fso.OpenTextFile(File) 
    Do Until openedFile.AtEndOfStream 
     Line = openedFile.ReadLine      'corrected the spelling mistake here 
     Execute "ReDim Preserve UserArray"&i&"("&n&")" 
     Execute "UserArray"&i&"("&n&")="&Line 
     n = n + 1 
    Loop 
    n = 0 
Loop 

此代碼後,你應該有UserArray1爲第一檔,UserArray2爲第二檔等等...

+0

工作過一種享受!對於片段的第10行,我必須在該行前後添加一個字符(34),否則會出錯。 '執行'UserArray'&i&「(」&n&「)=」&chr(34)&Line&chr(34)'對於已經有引號的文本文件中的行,失敗:'Line = Replace(Line,chr(34),「'」)'「Execute」是如何工作的?有沒有關於它的使用文件? – BertB

+0

@BertB很高興工作。你可以在這裏找到執行命令的一些信息:https://ss64.com/vb/execute.html – Gurman

0

你可以嘗試一個數組的數組。像這樣:

Dim Userarray() As Variant 
Dim subArray() As String 

i = 0 
n = 1 

For Row = 0 To 4 
    i = i + 1 
    ReDim subArray(i) 
    For Each cell In ActiveSheet.Range(Cells(i, 1), Cells(i, 5)) 
     ReDim Preserve subArray(n) 
     subArray(n) = cell.Value 
     n = n + 1 
    Next 
    ReDim Preserve Userarray(i) 
    Userarray(i) = subArray 
    n = 0 
Next 

(我沒有文件,所以我只是用Excel中的一個範圍內)。我認爲VBA與VBScript足夠相似,可以用於這項工作...結果在Userarray(1)中作爲數組的第一行數據,在Userarray(2)中作爲數組的第二行數據等。

+0

這是一個非常有趣的方法,我會盡快使用它。你如何解決第二個數組中的每個元素? EG尋址UserArray(1)應該給你subArray(1〜5),對嗎?那麼如何解決UserArray(1) - > subArray(3)? – BertB

+0

我相信'Userarray(1,3)'。儘管我不喜歡VBA中的數組,但是儘管我在Javascript和PHP中使用它們,但我避免使用它們,比如Excel中的鼠疫,因此實際上並沒有在項目中使用它。 :-D注意:多維數組可能會比你在做的方式使用更多的內存(如果這樣的話 - 我沒有意識到VBA允許這麼做!)。儘管如此,對我來說似乎更簡單的方法來循環遍歷它們。嗯,我相信你會用'UBound(Userarray,2)'獲得第二維的subArray的上限 - 它可能使得所有的subs都是相同的大小。 –

+0

另一個選擇可能是使Userarray成爲一個Collection而不是數組,並在循環結尾處使用Userarray.Add subArray。 –