2015-11-19 4 views
1

Я выполняю следующий макрос в течение нескольких лет без проблем до недавнего времени.excel vba replace failure

За последние несколько недель мне пришлось вручную перейти на соответствующий лист, прежде чем он сработает. Сегодня он прекратил это делать, поэтому я прошел через него &, увидев, что он выходит из первого оператора замены, есть ли данные для замены или нет.

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%, но я думаю, что функция работала должным образом на некоторое время после того, как я повышен до Win 10.

+0

'вручную изменить на правильный лист' ...' tSHeet = ActiveSheet.Name' угадывание, вот почему ... – findwindow

+1

закомментировать «on error resume next» и посмотреть, где происходит ошибка –

+0

'tSHeet = ActiveSheet.Name 'используется только для возврата к вызывающему листу при вызове из другого места. Комментирование 'On Error Resume Next' не влияет. –

ответ

1

Я не могу сказать, что у меня есть свой ответ, но я могу ответить на пару пунктов и дать вам небольшую поправку, чтобы попробовать.

Вы должны оставить On On Error Resume Next и On Error Goto 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

Я нашел проблему.

У меня была совершенно другая книга открытая, и это мешало этому. Я не уверен, как ... они не делились никакими модулями, но когда я его закрыл, этот начал действовать правильно.

Спасибо всем за ваши усилия!