2017-07-31 75 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。 –