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: