Excel无限循环问题

Excel无限循环问题,excel,infinite-loop,vba,Excel,Infinite Loop,Vba,此程序的目的是从单元格中删除字母。由于某种原因,当replace函数行执行时,它会陷入一个无限循环中。如果单元格中包含456po83,则变量递增直到都等于p,单元格中的字母应替换为零,o现在是字符串中的第四个字符,变量应保持递增,对吗?我错过了什么 Option Explicit Sub DeleteB() Dim stringLength As Integer Static str As String Dim A As Integer Dim num As Integer Dim indv

此程序的目的是从单元格中删除字母。由于某种原因,当replace函数行执行时,它会陷入一个无限循环中。如果单元格中包含456po83,则变量递增直到都等于p,单元格中的字母应替换为零,o现在是字符串中的第四个字符,变量应保持递增,对吗?我错过了什么

Option Explicit

Sub DeleteB()

Dim stringLength As Integer
Static str As String
Dim A As Integer
Dim num As Integer
Dim indvChar As String
Dim B As Integer
Dim charArray(0 To 25) As String

charArray(0) = "a"
charArray(1) = "b"
charArray(2) = "c"
charArray(3) = "d"
charArray(4) = "e"
charArray(5) = "f"
charArray(6) = "g"
charArray(7) = "h"
charArray(8) = "i"
charArray(9) = "j"
charArray(10) = "k"
charArray(11) = "l"
charArray(12) = "m"
charArray(13) = "n"
charArray(14) = "o"
charArray(15) = "p"
charArray(16) = "q"
charArray(17) = "r"
charArray(18) = "s"
charArray(19) = "t"
charArray(20) = "u"
charArray(21) = "v"
charArray(22) = "w"
charArray(23) = "x"
charArray(24) = "y"
charArray(25) = "z"

Do Until IsEmpty(Selection)

    A = 1
    num = Len(Selection)
    str = Selection.Value
     Do Until A = num + 1
     indvChar = Mid(str, A, 1)

        B = 0
        Do Until B = 26

            If indvChar = charArray(B) Then
            Selection.Value = Replace(str, indvChar, "", 1)

            Else: B = B + 1
            End If


        Loop

    A = A + 1
    Loop

ActiveCell.Offset(1, 0).Select
Loop

End Sub

如果你想找到数字,找到你想要的比找到你不想要的更容易

Sub DeleteB()

Dim rng As Range
Dim str As String
Dim i As Integer

Set rng = Selection

Do
    For i = 1 To Len(rng.Value)
        'If your local settings uses ',' as the deliniation to decimal then change the '.' to ','
        If IsNumeric(Mid(rng.Value, i, 1)) Or Mid(rng.Value, i, 1) = "." Then
            str = str & Mid(rng.Value, i, 1)
        End If
    Next i
    rng.Value = CDbl(str)
    Set rng = rng.Offset(1)
Loop Until rng = ""

End Sub
如果只想替换数组中的值,则只需要一个循环

Sub DeleteB()


Dim B As Integer
Dim charArray
Dim rng As Range

Set rng = Range(Selection, Selection.End(xlDown))

charArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")


For B = LBound(charArray) To UBound(charArray)
        rng.Replace What:=charArray(B), replacement:="", Lookat:=xlPart, MatchCase:=False
Next B


End Sub

这可以同时查看整个范围。用于填充数组的方法将允许您添加需要删除的其他项,而无需将其添加到array()行。我的猜测是,您将要添加空格和其他非数字项。

如果您要查找数字,则更容易查找您想要的内容,而不是您不想要的内容

Sub DeleteB()

Dim rng As Range
Dim str As String
Dim i As Integer

Set rng = Selection

Do
    For i = 1 To Len(rng.Value)
        'If your local settings uses ',' as the deliniation to decimal then change the '.' to ','
        If IsNumeric(Mid(rng.Value, i, 1)) Or Mid(rng.Value, i, 1) = "." Then
            str = str & Mid(rng.Value, i, 1)
        End If
    Next i
    rng.Value = CDbl(str)
    Set rng = rng.Offset(1)
Loop Until rng = ""

End Sub
如果只想替换数组中的值,则只需要一个循环

Sub DeleteB()


Dim B As Integer
Dim charArray
Dim rng As Range

Set rng = Range(Selection, Selection.End(xlDown))

charArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")


For B = LBound(charArray) To UBound(charArray)
        rng.Replace What:=charArray(B), replacement:="", Lookat:=xlPart, MatchCase:=False
Next B


End Sub

这可以同时查看整个范围。用于填充数组的方法将允许您添加需要删除的其他项,而无需将其添加到array()行。我猜您需要添加空格和其他非数字项。

这个循环就是问题所在:

    Do Until B = 26

        If indvChar = charArray(B) Then
        Selection.Value = Replace(str, indvChar, "", 1)

        Else: B = B + 1
        End If


    Loop

如果找到该字符,它会将其替换为零,但不会增加循环计数器。将
B=B+1
放在
If
块之外。

这个循环就是问题所在:

    Do Until B = 26

        If indvChar = charArray(B) Then
        Selection.Value = Replace(str, indvChar, "", 1)

        Else: B = B + 1
        End If


    Loop

如果找到该字符,它会将其替换为零,但不会增加循环计数器。将
B=B+1
放在
If
块的外部。

此代码的最终预期结果是什么?使用您的方法会出现其他问题。选定单元格的值将仅替换字符串中按字母顺序排列的最后一个字母
str
不会更改,并且您要替换的每个循环都会减去被替换的字母,但是由于
str
本身没有保存更改,因此当您移动到
str
中的下一个字符时,替换的字母仍然存在。此代码的最终预期结果是什么?使用您的方法会出现其他问题。选定单元格的值将仅替换字符串中按字母顺序排列的最后一个字母
str
不会更改,并且每次替换
str
的循环都会减去被替换的字母,但是由于
str
本身没有保存更改,因此当您移动到
str
中的下一个字符时,替换的字母仍然存在。很好地找到了问题。OP部署的方法很慢,如果执行很多操作,则需要时间。但你确实回答了这个问题+1@ScottCraner是的,我选择不谈论这个话题,因为你已经很好地涵盖了它找到问题做得很好。OP部署的方法很慢,如果执行很多操作,则需要时间。但你确实回答了这个问题+1@ScottCraner是的,我选择不谈论这个话题,因为你已经很好地涵盖了它