2016-11-30 3 views
0

Я пытаюсь использовать VBA для автоматического изменения цвета ячеек, содержащих символ трубопровода «|».Ошибка Excel VBA

При обнаружении, я хотел бы, чтобы код удалял символ трубопровода "|" и измените цвет ячейки на серый. Код не работает, и приведен ниже:

With Sheets("DATASHEET").Range("AG1:BG53") 
    Set c = .Find("|", LookIn:=xlValues) 
     If Not c Is Nothing Then 
      firstAddress = c.Address 
      Do 
      c.Value = "" 
      c.Pattern = xlSolid 
      c.PatternColorIndex = xlAutomatic 
      c.ThemeColor = xlThemeColorDark1 
      c.TintAndShade = -0.249977111117893 
      c.PatternTintAndShade = 0 
      Loop While Not c Is Nothing And c.Address <> firstAddress 
     End If 
    End With 

Когда я бег VBA, я получаю следующее сообщение об ошибке:

ошибка времени выполнения «91»: переменной объекта или с блоком переменная не установлена ​​

код терпит неудачу здесь:

Loop While Not С Nothing И c.Address <> firstAddress

После аварии, мои отладки Часы имеют следующие значения:

Expression firstAddress" = $AG$37 (который является первой ячейки в диапазоне, который слился и центром - это требование)

Выражение c.Address = переменная объекта или с переменной блока не установлена ​​

Выражение c.Value = переменная объекта или с переменной блока не указан

Я бы рад помочь.

Спасибо!

jmseiver

Обновление:

Этот код работает, спасибо Даррен!

With Sheets("DATASHEET").Range("AG1:BG53") 
      Set c = .Find("|", LookIn:=xlValues) 
      If Not c Is Nothing Then 
       Do 
       c.Value = "" 
       With Selection.Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .ThemeColor = xlThemeColorDark1 
        .TintAndShade = -0.249977111117893 
        .PatternTintAndShade = 0 
       End With 
       Set c = .FindNext(c) 
       Loop While Not c Is Nothing 
      End If 
     End With 

Этот код не делает:

With Sheets("DATASHEET").Range("AG1:BG53") 
      Set c = .Find("|", LookIn:=xlValues) 
      If Not c Is Nothing Then 
       Do 
       c.Value = "" 
       With Selection.Interior 
        .Pattern = xlSolid 
        .PatternColorIndex = xlAutomatic 
        .ThemeColor = xlThemeColorDark1 
        .TintAndShade = -0.249977111117893 
        .PatternTintAndShade = 0 
       End With 
       Set c = .FindNext(c) 
       Loop While Not c Is Nothing 
      End If 
     End With 

Изменение цвета ячейки цель подпрограммы. Дополнительный With-End With не работает.

Он не бомбит, он просто не меняет цвет ячеек.

?

Спасибо всем за их время!

jmseiver

Update 2:

Этот код работает!

'color any cell with updated data to gray 
     With Sheets("DATASHEET").Range("AG1:BG53") 
      Set c = .Find("|", LookIn:=xlValues) 
      If Not c Is Nothing Then 
       Do 
       c.Replace What:="|", Replacement:="" 
       c.Interior.ColorIndex = 15 
       Set c = .FindNext(c) 
       Loop While Not c Is Nothing 
      End If 
     End With 

Таким образом, цель данного кода 1) найти все ячейки, в которых первый символ является кант символ «|», 2) удалить символ трубопровода «|», и 3) цвет сотовый серый.

Еще раз спасибо Даррен и Джон!

jmseiver

ответ

1

Вы должны проверить, если c ничего в состоянии, который не одновременно (хотя и неявно) полагают, что это не ничего. Что-то вроде этого (непроверенные):

With Sheets("DATASHEET").Range("AG1:BG53") 
    Set c = .Find("|", LookIn:=xlValues) 
    If Not c Is Nothing Then 
     firstAddress = c.Address 
     Do 
      c.Value = "" 
      Set c = .FindNext(c) 
      If c is Nothing Then Exit Do 
     Loop While c.Address <> firstAddress 
    End If 
End With 

Проблема заключается в том, что VBA, в отличие от большинства языков программирования, не короткого замыкания логических операторов. И A И Bвсегда оценивается в A and B, даже если A является ложным. Как следствие, вам иногда приходится писать код более круглым способом в VBA.

+0

Вы можете использовать исходный код и удалить код, который имеет дело с 'firstAddress'. Код будет просто зацикливаться до тех пор, пока c не станет ничем, когда все '|' будут заменены. –

+0

@ DarrenBartrup-Cook Хорошая точка. Я честно не обращал слишком много внимания на то, что пытался сделать код, но сосредоточился вместо этого на конкретной ошибке, с которой они столкнулись. Возможно, вы можете опубликовать ответ, который показывает, как можно упорядочить код. –

+0

Все, действует следующий код: –

0

Это может быть упрощено с Excel Find and Replace Format:

Application.ReplaceFormat.Clear      ' optional 
Application.ReplaceFormat.Interior.ColorIndex = 15 ' set the replacement format 
[DATASHEET!AG1:BG53].Replace "|", "", LookAt:=xlPart, ReplaceFormat:=True 

Но это, как ваш обновленный код заменит все ячейки, которые содержат |.

Чтобы найти только клетки, которые начинаются с |, вы можете заменить условие поиска в вашем коде:

Set c = .Find("|*", , LookIn:=xlValues, LookAt:=xlWhole) 

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

  • Нет связанных вопросов^_^