首页 > 解决方案 > 重置循环变量

问题描述

我无法为循环(For n = LBound(arrFileLines1) To UBound(arrFileLines1))重置 n=0。

示例文本文件:

7 a2
30 a1
30 a2
6 a1
5 a1
4 a1
3 a1
2个a3
1个a2

下面的代码将找到第一个字符串“30”并将位置从 7-255 开始作为变量 xxx。第一串30是n=1。

接下来,WriteLine如果该行没有 variable xxx

第一关就好了。我能够删除与 variable 相关的所有内容xxx

文本文件更新为:

7 a2
30 a2
2个a3
1个a2

但是,n之后不会重置。n将从 2 开始。当 n = 4 时,我会收到错误:

下标超出范围:“n”。

有没有办法可以重新n从 0 开始?

Dim arrFileLines1()
Dim xxx'
q = 0
strCheckForString = ("30")
Set objFile = objFSO.OpenTextFile("C:\Users\1234\Desktop\output.txt", 1)
Do Until objFile.AtEndOfStream
    ReDim Preserve arrFileLines1(q)
    arrFileLines1(q) = objFile.ReadLine
    q = q + 1
Loop
objFile.Close

For n = LBound(arrFileLines1) To UBound(arrFileLines1)
    If (InStr(arrFileLines1(n), strCheckForString)) Then
        xxx = Mid(arrFileLines1(n), 7, 255)
        Set objFile = objFSO.OpenTextFile("C:\Users\1234\Desktop\output.txt", 2)
        For m = LBound(arrFileLines1) To UBound(arrFileLines1)
            If ((Mid(arrFileLines1(m), 7) = xxx) = True) And (n>m) Then
                objFile.WriteLine arrFileLines1(m)
            Else
                If ((Mid(arrFileLines1(m), 7) = xxx ) = False) Then
                    objFile.writeline arrFileLines1(m)
                End If
            End If
        Next
        objFile.Close

        Set objFile = objFSO.OpenTextFile("C:\Users\1234\Desktop\output.txt", 1)
        q = 0
        Do Until objFile.AtEndOfStream
            ReDim Preserve arrFileLines1(q)
            arrFileLines1(q) = objFile.ReadLine
            q = q + 1
        Loop
        objFile.Close
    End If
Next

标签: for-looptextvbscriptreset

解决方案


你不应该篡改循环的循环变量For。如果您想自己控制循环变量:使用Do..Loop代替For..Next并根据需要增加/减少变量。

话虽如此,我并不完全清楚你想用你的代码实现什么。是否要删除所有以与以字符串“30”开头的行相同的子字符串结尾的行?这意味着您想从示例输入中删除所有以“a1”或“a2”结尾的行?

如果是这样,我可能会做这样的事情:

由于您无论如何都将输入文件读入内存,因此您可以这样做并避免附加到数组的耗时过程:

filename = "C:\Users\1234\Desktop\output.txt"

Set fso = CreateObject("Scripting.FileSystemObject")
txt = fso.OpenTextFile(filename).ReadAll
lines = Split(txt, vbNewLine)

从以字符串“30”开头的行构建参考列表:

Set ref = CreateObject("Scripting.Dictionary")
For Each line In lines
    If Left(line, 2) = "30" Then ref(Mid(line, 7, 255)) = True
Next

然后只将那些不包含任何这些字符串的行写回文件:

Set f = fso.OpenTextFile(filename, 2)
For Each line In lines
    found = False
    For Each s In ref.Keys
        If InStr(Mid(line, 7, 255), s) > 0 Then
            found = True
            Exit For
        End If
    Next
    If Not found Then f.WriteLine line
Next
f.Close

使用字典的键而不是普通数组的优点是您可以自动获得唯一字符串的列表。


推荐阅读