2015-01-03 5 views
0

У меня есть макрос условного форматирования таблицы (спасибо Jeeped), который я бы хотел расширять, чтобы циклически перебирать все таблицы в диапазоне рабочих листов. Я подозреваю, что это не самый эффективный подход, но лучше всего я мог бы сгребаться вместе, и даже тогда он не работает. До сих пор я застрял в двух точках ниже. Любая помощь очень ценится!VBA - Перемещение по всем объектам ListObject по целому диапазону рабочих таблиц

1) Установка WS на равные многократные кодовыми рабочего листа (например, Set ws = Worksheets(5,6,7))

2) Установка диапазона ж/оа ошибки времени выполнения Set myRange = ws.ListObjects.DataBodyRange производит «Ошибка выполнения„438“: Объект не поддерживает это свойство или метод»

Текущий код:

Sub ConditionalFormatting() 
    Dim ws As Excel.Worksheet 
    Dim lo As Excel.ListObject 
    Dim myRange As Range 

    Set ws = Worksheet(5) 'Would like to expand to include multiple worksheets! 
    Set myRange = ws.ListObjects.DataBodyRange 

    For Each lo In ws.ListObjects 
     With lo.FormatConditions 
      .FormatConditions.Delete 
      Call FormatRange(myRange, 10, "$E5=INDEX(Location,1,1)") 'Warehouse1 
      Call FormatRange(myRange, 10, "$E5=INDEX(Location,2,1)") 'Warehouse2 
      Call FormatRange(myRange, 10, "$E5=INDEX(Location,3,1)") 'Warehouse3 
     End With 
    Next lo 
End Sub 

Public Sub FormatRange(r As Range, clr As Integer, frml As String) 
    r.FormatConditions.Add Type:=xlExpression, Formula1:=frml 
    r.FormatConditions(r.FormatConditions.Count).Font.colorindex = clr 

    With r.FormatConditions(1).Borders(xlTop) 
     .LineStyle = xlContinuous 
     .Color = color 
     .TintAndShade = 0 
     .Weight = xlThin 
    End With 
    With r.FormatConditions(1).Borders(xlBottom) 
     .LineStyle = xlContinuous 
     .Color = color 
     .TintAndShade = 0 
     .Weight = xlThin 
    End With 
    r.FormatConditions(1).StopIfTrue = False 
End Sub 

ответ

2

Непроверенные:

Sub ConditionalFormatting() 
    Dim ws As Excel.Worksheet 
    Dim lo As Excel.ListObject 
    Dim myRange As Range 
    Dim i 


    For Each i in Array(5, 6, 7) 

     Set ws = Worksheets(i)  

     For Each lo In ws.ListObjects 

      Set myRange = lo.DataBodyRange 

      myRange.FormatConditions.Delete 
      FormatRange myRange, 10, "$E5=INDEX(Location,1,1)" 'Warehouse1 
      FormatRange myRange, 10, "$E5=INDEX(Location,2,1)" 'Warehouse2 
      FormatRange myRange, 10, "$E5=INDEX(Location,3,1)" 'Warehouse3 

     Next lo 

    Next i 

End Sub 
+0

Спасибо Тим. Этот код работает, но только частично. В моем фактическом файле у меня много листов в массиве - не только три. Код отлично работает для некоторых листов в массиве, применяет форматирование, но не удаляет существующие условия форматирования для других и не применяет форматирование или удаление существующих условий форматирования для других. Чтобы заставить его работать в ближайшем будущем, я использовал 'Set ws = ActiveSheet' и работал на каждом рабочем листе, который работал. Не знаю, почему он обрабатывает рабочие листы по-разному. – Joe

0

Так же, как вы цикл по коллекции ListObject «Listobjects», вы можете цикл по коллекции Worksheet «ЭЛЕКТРОННЫЕ ТАБЛИЦЫ»

Dim ws As Worksheet 
For Each ws In ThisWorkbook.Worksheets 
    '... 
Next ws 

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

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