2015-11-19 106 views
1

我一直运行下面的宏几年,直到最近没有问题。excel vba替换失败

在过去的几个星期里,我不得不手动改变到正确的工作表之前,它会工作。今天,它停止了这样做,所以我通过它&看到它是在第一次替换声明后退出,无论是否有数据要替换。

Sub Clean_Phone() 
' 
' Clean_Phone Macro 
' 
' Last Update - 5 Feb 2015 
' 
    Dim tSHeet As String 
    Dim r As Range 
    On Error Resume Next ' restore Find/Replace settings to default 
    Set r = Cells.Find(What:=vbNullString, LookIn:=xlFormulas, _ 
         SearchOrder:=xlRows, LookAt:=xlPart, MatchCase:=False) 
    ' On Error GoTo 0 
    tSHeet = ActiveSheet.Name 

    Sheets("Data").Select ' DataTbl is 15 col x > 1100 row 
    With Sheets("Data").Range("DataTbl[[Latitude]:[Longitude]]") 
     .Replace What:="°", Replacement:=vbNullString, LookAt:=xlPart 
    End With 

    Sheets("Data").Select 
    With Sheets("Data").Range("DataTbl[[Phone]:[Phone2]]") ' DataTbl is 15 col x >1100 row 
     .Replace What:=" ", Replacement:=vbNullString, LookAt:=xlPart 
     .Replace What:=")", Replacement:=vbNullString, LookAt:=xlPart 
     .Replace What:="-", Replacement:=vbNullString, LookAt:=xlPart 
     .Replace What:="(", Replacement:=vbNullString, LookAt:=xlPart 
     .Replace What:=".", Replacement:=vbNullString, LookAt:=xlPart 
    End With 

    Range("DataTbl[[Phone]:[Phone2]]").NumberFormat = "[<=9999999]###-####;(###) ###-####" 

    With Sheets("Data").Range("DataTbl[Address]") 
     .Replace What:=" nw ", Replacement:=" NW ", LookAt:=xlPart 
     .Replace What:=" ne ", Replacement:=" NE ", LookAt:=xlPart 
     .Replace What:=" se ", Replacement:=" SE ", LookAt:=xlPart 
     .Replace What:=" sw ", Replacement:=" SW ", LookAt:=xlPart 
    End With 

这似乎没有什么区别,如果On Error GoTo 0被注释掉与否,并坦率地说,我还没有线索的Set r = Cells.Find( ...语句用于什么目的。

我不是100%肯定,但我认为,正常运行工作了一段时间后,我升级到10赢

+0

'手动更改为正确的工作表'...'tSHeet = ActiveSheet.Name'猜测这就是为什么... – findwindow

+1

注释出'错误恢复下一个'并看看错误发生的位置 –

+0

'tSHeet = ActiveSheet.Name '只用于从别处调用时返回到调用表。注释出'On Error Resume Next'没有任何影响。 –

回答

1

我不能说我有你的答案,但我可以回答一对夫妇的点数,并给你一个小小的修改尝试。

你应该把On Error Resume Next和On Error转到0,因为他们是一个失败,你不知道为什么它在那里。正如它所说的那样,它将重置查找/替换默认值。我不知道它们是否在这里需要,或者如果失败捕获是必要的,因为它正在搜索一个空单元,但它不会留下任何伤害,但重置错误处理程序非常重要。

我会摆脱选择数据表的声明,这是不必要的,并明智地使用Withs。

这是修改后的代码,这是值得尝试在我看来

Sub Clean_Phone() 
' 
' Clean_Phone Macro 
' 
' Last Update - 5 Feb 2015 
' 
Dim tSHeet As String 
Dim r As Range 

    On Error Resume Next 
    ' restore Find/Replace settings to default 
    Set r = Cells.Find(What:=vbNullString, LookIn:=xlFormulas, _ 
        SearchOrder:=xlRows, LookAt:=xlPart, MatchCase:=False) 
    On Error GoTo 0 
    tSHeet = ActiveSheet.Name 

    With Sheets("Data") 

     With .Range("DataTbl[[Latitude]:[Longitude]]") 
      .Replace What:="°", Replacement:=vbNullString, LookAt:=xlPart 
     End With 

     With .Range("DataTbl[[Phone]:[Phone2]]") ' DataTbl is 15 col x >1100 row 
      .Replace What:=" ", Replacement:=vbNullString, LookAt:=xlPart 
      .Replace What:=")", Replacement:=vbNullString, LookAt:=xlPart 
      .Replace What:="-", Replacement:=vbNullString, LookAt:=xlPart 
      .Replace What:="(", Replacement:=vbNullString, LookAt:=xlPart 
      .Replace What:=".", Replacement:=vbNullString, LookAt:=xlPart 

      .NumberFormat = "[<=9999999]###-####;(###) ###-####" 
     End With 

     With .Range("DataTbl[Address]") 
      .Replace What:=" nw ", Replacement:=" NW ", LookAt:=xlPart 
      .Replace What:=" ne ", Replacement:=" NE ", LookAt:=xlPart 
      .Replace What:=" se ", Replacement:=" SE ", LookAt:=xlPart 
      .Replace What:=" sw ", Replacement:=" SW ", LookAt:=xlPart 
     End With 
    End With 
End Sub 
+0

谢谢你,鲍勃!这看起来更优雅,我的代码,并应运行得更快。 –

0

我发现这个问题。

我有一个完全不同的工作簿打开,它干扰了这一个。我不知道如何 - 他们没有分享任何模块,但是当我关闭它时,这一个开始行事正确。

谢谢大家的努力!