2015-09-22 2 views
1

Я пытаюсь написать VBA для файла Excel, который ищет определенную фразу/предложение в заголовке столбца и изменяет эту фразу/предложение, если он находит его. Проблема в том, что иногда в файле не будет фразы, которую я ищу, и VBA выдает ошибку. Вот мой код:Поиск предложения на листе

Dim srch As Range 

    srch = Cells.Find(What:="Usage Charge (Overage Charges)", After:=ActiveCell, _ 
     LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ 
     SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate 

If Not srch Is Nothing Then 
ActiveCell.FormulaR1C1 = "Usage Group Overage" 
    End IF 

Это прекрасно работает, когда «Использование Charge (Избыточная плата)» существует в рабочем листе, но если это не то, я получаю сообщение об ошибке говорит мне объект не существует.

Есть ли способ заставить это просто ничего не делать, если эта фраза не существует?

+0

Is ** "Usage Charge (Overage Charges)" ** действительно только * часть * метки заголовка столбца? Скорее всего, это будет значение ячейки в целом. – Jeeped

ответ

2

самый простой способ заключается в использовании обработчика ошибок:

Dim srch As Range 

On error goto ErrH 

srch = Cells.Find(What:="Usage Charge (Overage Charges)", After:=ActiveCell, _ 
    LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ 
    SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate 

If Not srch Is Nothing Then 
ActiveCell.FormulaR1C1 = "Usage Group Overage" 
End IF 

Exit sub 

ErrH: 
    ' Do nothing 

End sub 
0

Вот несколько вариантов. Первые два используют подстановочные знаки, но заменяют только один экземпляр. Они должны быть зациклены. Третья замена всех байтов зависит от точного соответствия (нет xlPart).

Sub optimal() 
    Dim srch As Range, str As String, rpl As String 

    str = "Usage Charge (Overage Charges)" 
    rpl = "Usage Group Overage" 
    With Worksheets("Sheet1") 
     'check if it exists using COUNTIF with silcards 
     If CBool(Application.CountIf(.Rows(1), Chr(42) & str & Chr(42))) Then 
      'replace 1 occurance value directly 
      .Cells(1, Application.Match(Chr(42) & str & Chr(42), .Rows(1), 0)) = rpl 
     End If 

     'check if it exists using MATCH with silcards 
     If Not IsError(Application.Match(Chr(42) & str & Chr(42), .Rows(1), 0)) Then 
      'replace 1 occurance value directly 
      .Cells.Find(what:="Usage Charge (Overage Charges)", After:=ActiveCell, _ 
         LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ 
         SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) = rpl 
     End If 

     'use if "Usage Charge (Overage Charges)" is the entire cell content 
     'replaces all occurances 
     .Rows(1).Replace what:=str, replacement:=rpl 
    End With 

End Sub 
Смежные вопросы