Excel 如何在VBA中用Do循环替换列中字符串中的值

Excel 如何在VBA中用Do循环替换列中字符串中的值,excel,vba,Excel,Vba,我有一列电话号码。其中一些包含两个连续连字符“-”而不是一个“-”。我想将“-”替换为“-” 问题是,如果“-”对于每个单元格只出现一次,那么这很好,但它可能会出现“---”或“----”甚至“----”这样的情况。我的直觉是使用Do-While或Until循环,但我不知道如何使用。我想我需要Find函数,但我不知道如何组合它们。 谁能帮我个忙吗? 谢谢。一个公式足以将-,替换为-? 比如: =SUBSTITUTE(A1,"--","-") 在VBA中,有多种方法,但这里有一种方法可以让您了解

我有一列电话号码。其中一些包含两个连续连字符“-”而不是一个“-”。我想将“-”替换为“-”
问题是,如果“-”对于每个单元格只出现一次,那么这很好,但它可能会出现“---”或“----”甚至“----”这样的情况。我的直觉是使用Do-While或Until循环,但我不知道如何使用。我想我需要Find函数,但我不知道如何组合它们。
谁能帮我个忙吗?

谢谢。

一个公式足以将-,替换为-? 比如:

=SUBSTITUTE(A1,"--","-")
在VBA中,有多种方法,但这里有一种方法可以让您了解循环等

Option Explicit

Sub ReplaceDashes()

Dim r As Range, r1 As Range
Set r = Sheet1.Range("A1:A10")

For Each r1 In r
    If InStr(1, r1.Value, "--") >= 0 Then r1.Value = Application.WorksheetFunction.Substitute(r1, "--", "-")
Next

End Sub

希望有帮助。

一个公式是否足以将-,替换为-? 比如:

=SUBSTITUTE(A1,"--","-")
在VBA中,有多种方法,但这里有一种方法可以让您了解循环等

Option Explicit

Sub ReplaceDashes()

Dim r As Range, r1 As Range
Set r = Sheet1.Range("A1:A10")

For Each r1 In r
    If InStr(1, r1.Value, "--") >= 0 Then r1.Value = Application.WorksheetFunction.Substitute(r1, "--", "-")
Next

End Sub
希望这能有所帮助。

试试这个:

Dim my_switch As Boolean
my_switch = True
Do While my_switch = True
   If InStr(Worksheets("Sheet1").Range("A1").Value, "--") > 0 Then
      Worksheets("Sheet1").Range("A1").Value = Replace(Worksheets("Sheet1").Range("A1").Value, "--", "-")
   Else
      my_switch = False
   End If
Loop
试试这个:

Dim my_switch As Boolean
my_switch = True
Do While my_switch = True
   If InStr(Worksheets("Sheet1").Range("A1").Value, "--") > 0 Then
      Worksheets("Sheet1").Range("A1").Value = Replace(Worksheets("Sheet1").Range("A1").Value, "--", "-")
   Else
      my_switch = False
   End If
Loop
试试这个

Sub rep()

For Each c In Sheets("Sheet1").Range("A1:A10").Cells ' Change the range that you want

    If InStr(c.Value, "--") > 0 Then
        deli = Split(c, "-")
        For a = 0 To UBound(deli)
        c.Value = Replace(c.Value, "--", "-")
        Next a

    End If

Next c

End Sub
试试这个

Sub rep()

For Each c In Sheets("Sheet1").Range("A1:A10").Cells ' Change the range that you want

    If InStr(c.Value, "--") > 0 Then
        deli = Split(c, "-")
        For a = 0 To UBound(deli)
        c.Value = Replace(c.Value, "--", "-")
        Next a

    End If

Next c

End Sub

难以置信的复杂和低效的答案我看到了

Range("c3:c17").Replace "--", "-"
Range("c3:c17").Replace "--", "-"
应该在2行中使用最多4个连字符,并且可能比复杂的答案快得多。添加第三行以处理多达6个连续连字符

如果连续连字符的数量非常大(不像OP中那样),那么下面的循环可能会更好:

With Range("c3:c17")
    Do Until .Find("--") Is Nothing
        .Replace "--", "-"
    Loop
End With

不要忘记,从VBA访问电子表格是一项昂贵的操作。对一个范围使用1个替换比逐个单元进行替换要快得多。当然,这只有在处理大量数据时才可见。

我看到了难以置信的复杂和低效的答案

Range("c3:c17").Replace "--", "-"
Range("c3:c17").Replace "--", "-"
应该在2行中使用最多4个连字符,并且可能比复杂的答案快得多。添加第三行以处理多达6个连续连字符

如果连续连字符的数量非常大(不像OP中那样),那么下面的循环可能会更好:

With Range("c3:c17")
    Do Until .Find("--") Is Nothing
        .Replace "--", "-"
    Loop
End With

不要忘记,从VBA访问电子表格是一项昂贵的操作。对一个范围使用1个替换比逐个单元进行替换要快得多。当然,这只有在处理大量数据时才可见。

您可以尝试使用递归函数来执行此操作,例如:

function recursiveReplace(text as string, oldText as string, newText as string) as string
    dim result as string
    result = replace(text, oldText, newText)

    if instr(1, result, oldText) > 0 then
        recursiveReplace = recursiveReplace(result, oldText, newText)
    else
        recursiveReplace = result
    end if
end function

sub test()

    const phoneNumber as string = "234-45---34----112"
    debug.print recursiveReplace(phoneNumber, "--", "-")

end sub

您现在也可以在excel工作表中直接调用此函数!例如=recursiveReplace(“234--456--67--5”,““--”,“-”)

您可以尝试使用递归函数来执行此操作,例如:

function recursiveReplace(text as string, oldText as string, newText as string) as string
    dim result as string
    result = replace(text, oldText, newText)

    if instr(1, result, oldText) > 0 then
        recursiveReplace = recursiveReplace(result, oldText, newText)
    else
        recursiveReplace = result
    end if
end function

sub test()

    const phoneNumber as string = "234-45---34----112"
    debug.print recursiveReplace(phoneNumber, "--", "-")

end sub


您现在也可以在excel工作表中直接调用此函数!例如=recursiveReplace(“234--456--67--5”,““--”,“-”)

For循环只替换“--”一次。由于单元格值包含更多“-”,例如“----”或“----”,因此结果不会消除这些值。似乎还需要使用Do Loop.Erm。你能不能不为每种情况添加一个额外的if语句。。。也许:)对于公式部分,类似于:=IF(iError(FIND(“--”A1));A1;替换(A1;“--”;“--”)并添加任意数量的内容。VBA只是一个复制粘贴,对于--、--、--、ETC的每种情况,都会有一个额外的行。for循环只替换“-”一次。由于单元格值包含更多“-”,例如“----”或“----”,因此结果不会消除这些值。似乎还需要使用Do Loop.Erm。你能不能不为每种情况添加一个额外的if语句。。。也许:)对于公式部分,类似于:=IF(iError(FIND(“--”A1));A1;替换(A1;“--”;“--”)并添加任意数量的内容。VBA只是一个复制粘贴,对于--、--、--、--etcYes的每种情况,都会有一行额外的内容,这非常有效。非常感谢。你能和我分享一下这个代码的逻辑吗?我知道熟食店是一个数组,那UBound循环的作用是什么?谢谢。首先,
Split()
函数返回一个包含子字符串的一维数组,该数组在基于delimiter
-
拆分主字符串后返回。拆分字符串后,可以循环每个子字符串,并用
-
替换
-
。显示您的本地窗口,并使用F8清除B以查看代码如何运行。抱歉,我不知道如何调试。按
F8
进行调试。呃,我尝试过,但除了Excel显示一些黄色高亮显示的代码外,没有其他内容。是的,这非常有效。非常感谢。你能和我分享一下这个代码的逻辑吗?我知道熟食店是一个数组,那UBound循环的作用是什么?谢谢。首先,
Split()
函数返回一个包含子字符串的一维数组,该数组在基于delimiter
-
拆分主字符串后返回。拆分字符串后,可以循环每个子字符串,并用
-
替换
-
。显示您的本地窗口,并使用F8清除B以查看代码如何运行。抱歉,我不知道如何调试。按
F8
进行调试。呃,我尝试过,但除了Excel向我显示一些以黄色高亮显示的代码外,没有其他内容。您可以将其更改为任何范围。抱歉,它无法工作。我想我掌握了做循环的窍门。不需要我的开关。没有@iDevlop那么优雅,但它是我自己的:'set mphone=thisvoolk.worksheets(1).range(“A2:A10”)将aCell设置为mphone中每个aCell的范围,而InStr(aCell.Value,“-”)>0 aCell.Value=Replace(aCell.Value,“-”,“-”)则循环下一个aCell'Great。如果这对你有效,我们都很高兴。祝你好运。你可以将其更改为任何范围。对不起,它不起作用。我想我掌握了做循环的窍门。不需要我的开关。没有@iDevlop那么优雅,但它是我自己的:'set mphone=thisvoolk.worksheets(1).range(“A2:A10”)将aCell设置为mphone中每个aCell的范围,而InStr(aCell.Value,“-”)>0 aCell.Value=Replace(aCell.Value,“-”,“-”)则循环下一个aCell'Great。如果这对你有效,我们都很高兴。祝你好运。是的,但这只能用作“----”,但有时数据更糟糕,例如“-----------------------------”@lukayl: