将i + 1或其他算术作为arg传递

时间:2018-01-30 19:46:50

标签: excel vba excel-vba

所以我有一种情况,我在for循环中使用if语句,需要检查当前迭代和条件的下一次迭代。

目前我有:

For i = 1 To Len(inLine)
        If Asc(Mid(inLine, i, 1)) = 10 And dnl = False Then
            dnl = True
            outLine = outLine + " "
        ElseIf Asc(Mid(inLine, i, 1)) = 10 And dnl = True Then
            dnl = False
            outLine = outLine & ">" & vbNewLine & "<"
        Else
            dnl = False
            outLine = outLine & Mid(inLine, i, 1)
        End If
Next

在我正在解析的文件中,有些区域使用双换行来分隔文本块。但这些新行并不总是可读的。例如,当读取文件时,即使包含换行符,整个文件也会放入inline

基本上,我想添加一个找到单个换行符的空格,并在找到double的位置添加vbNewLine。所以我尝试了这个:

If Asc(Mid(inLine, i, 1)) = 10 And Asc(Mid(inLine, (i + 1), 1)) = 10 Then

当单步执行程序时,这似乎有效,但是当代码完成时,我得到运行时错误Invalid procedure call or argument

我试过取出括号,使用i = i + 1,i ++,都无济于事。我试图搜索一种使用算术作为参数的方法,但一直无法找到我要找的东西。有没有办法做到这一点?有没有不同的方法来检查for循环之前的下一次迭代?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如其他人所述,使用i+1,一旦到达字符串的末尾,您将引用一个未存在的索引。

但是使用Replace可以更轻松地完成您想要的任务。如果您的输入字符串没有双重空格,或者在行的开头或结尾没有尾随空格,那么:

 outline = Replace(Replace(inline, vbLf, " "), "  ", vbLf)

如果您的情况不符合这些条件,则可以先解决其他Replace次来电问题。

答案 1 :(得分:0)

i + 1的mid将在最后一个循环中出错,因为i + 1指的是字符串末尾之外的字符。你需要做些什么来防止它从字符串的末尾掉下来。

使用Application.Min确保找到结束:

If Asc(Mid(inLine, i, 1)) = 10 And Asc(Mid(inLine, Application.Min(i + 1,Len(inLine)), 1)) = 10 Then