将字符从一个单元移动到另一个单元会导致无限循

时间:2014-02-20 09:35:53

标签: excel excel-vba vba

我是Excel VBA的新手,我需要做的是在列中包含一些包含姓名和电话号码的单元格,并将电话号码从该单元格中删除并粘贴到另一列中,这样我将有一个带有名称的单元格和另一个带有数字的单元格。

出于某种原因,我的程序进入无限循环。

我很确定它是由sLen = sLen - 1& j = j - 1但我不知道如何解决它。

Sub loop_macro()

    Dim myStr As String
    Dim i As Integer

    For i = 5 To 15
        myStr = movePhone(Cells(i, 2), i)

        Cells(i, 5) = myStr

    Next i

End Sub



Function movePhone(s As String, rowNum As Integer) As String

    Dim retval As String    // This is the return string to be copied to column 5
    Dim j As Integer        // Counter for character position.
    Dim sLen As Integer

    retval = ""    
    sLen = Len(s)

    For j = 1 To sLen
        If Mid(s, j, 1) >= "0" And Mid(s, j, 1) <= "9" Then
            retval = retval + Mid(s, j, 1)
            Cells(rowNum, 2) = Mid(Cells(rowNum, 2), j, 1) // remove digit from cell
            sLen = sLen - 1
            j = j - 1
        ElseIf Mid(s, j, 1) = "-" Then
            retval = retval + Mid(s, j, 1)
            Cells(rowNum, 2) = Mid(Cells(rowNum, 2), j, 1) // remove "-" char from cell
            sLen = sLen - 1
            j = j - 1

        End If
    Next

    movePhone = retval
End Function

1 个答案:

答案 0 :(得分:0)

不要因为操纵J而乱搞这么多,所以你可以从左到右,从右到左,如下:

for j = sLen to 1 step -1

现在你可以省略j = j-1行,它将不再给你这个问题。

总是从最后开始,在从字符串甚至数据集中删除东西时开始工作,这比操作循环变量要容易得多。

在这种情况下,您应该考虑使用Regexp(正则表达式)我之前没有使用它们,但是它们会在字符串中找到数字字符串(如果需要,还可以找到更多)。搜索SO以获取正则表达式,您将找到大量代码来帮助您。