2014-11-12 2 views
0

У меня есть сценарий доступности сервера, который сообщает 0 или 1 в CSV-файле. Я пытаюсь создать пользовательскую функцию VBA в Excel 2010 для анализа каждого столбца (сервера) в файле и выделить все экземпляры, в которых «1» встречается 3+ раз подряд.Excel, Выделите ряд последовательных повторяющихся значений

Time  srv1 srv2 srv3 srv4 
2:01:00 AM  0  0  0  0  
2:21:00 AM  1  0  0  0  
2:41:00 AM  1  0  0  0  
3:01:00 AM  1  0  0  0  
3:21:00 AM  1  0  0  0  
3:41:00 AM  0  0  0  0  
4:01:00 AM  0  0  0  0  

Я в общей сложности новичок в VBA & UDF, но вот то, что я пытался (без успеха):

Function HighlightConsecutive(ByRef rng As Range, myNum) As Long 
Dim a, i As Long 
a = rng.Value 
For i = 1 To UBound(a, 2) - 1 
    If (a(1, i + 1) = myNum) * (a(1, i) = myNum) Then 
     CountConsecutive = CountConsecutive + 1 
    End If 
    If (CountConsecutive >= 3) Then 
     ActiveCell.Interior.Color = RGB(255, 0, 0) 
    End If 
Next 
End Function 

Я также попробовал кучу разных решений с формулами и условное форматирование, как видно на SO и в другом месте, но это откровенно кажется неуклюжим и недостаточно мощным

Фактические файлы содержат 16 столбцов @ 720 строк, и у меня будет много их для анализа. Я намерен использовать фильтрацию для просмотра только выделенных ячеек.

Дополнительный кредит, если функция может игнорировать один «0» в крупной серии «1 '

ответ

2

Это будет цикл через все столбцы: (Edit: До тех пор пока он не доберется до последней колонке)

Sub ColorCells() 
    Dim cl As Long, N As Long, i As Long, LastCL As Long 
    N = Cells(Rows.Count, "A").End(xlUp).Row 
    LastCL = Cells(2, Columns.Count).End(xlToLeft).Column 
    For cl = 2 To LastCL 
    For i = 3 To N 
     Set r1 = Cells(i, cl) 
     Set r2 = r1.Offset(-1, 0) 
     Set r3 = r1.Offset(-2, 0) 
     If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then 
      Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0) 
     End If 
    Next i 
    Next cl 
End Sub 
1

Мы будем использовать суб, а не функцию. Этот подраздел выглядит на колонке B

Sub ColorCells() 
    Dim cl As String, N As Long, i As Long 
    cl = "B" 
    N = Cells(Rows.Count, cl).End(xlUp).Row 
    For i = 3 To N 
     Set r1 = Cells(i, cl) 
     Set r2 = r1.Offset(-1, 0) 
     Set r3 = r1.Offset(-2, 0) 
     If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then 
      Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0) 
     End If 
    Next i 
End Sub 

вы можете адаптировать его для других столбцов.

РЕДАКТИРОВАТЬ # 1

Вот модификация назвать несколько столбцов (в этом примере B через G)

Sub ColorCells(cl As Variant) 
     Dim N As Long, i As Long 
     N = Cells(Rows.Count, cl).End(xlUp).Row 
     For i = 3 To N 
      Set r1 = Cells(i, cl) 
      Set r2 = r1.Offset(-1, 0) 
      Set r3 = r1.Offset(-2, 0) 
      If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then 
       Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0) 
      End If 
     Next i 
End Sub 

Sub MAIN() 
    For i = 2 To 6 
     Call ColorCells(i) 
    Next i 
End Sub 

В VBA функций (ОДС) обычно используются для возврата значений в ячейки, а не для общих обновлений ячеек.

+0

Спасибо, что сработало, как описано для столбца b. Каков наилучший способ вызвать sub и может ли он быть общим? Мне понравилась идея использования функции, потому что тогда я могу просто подойти к нижней части столбца, использовать мою функцию (например, формулу), а затем скопировать ее в другие столбцы. У меня много файлов с переменными номерами столбцов. – user2655065

1

Вы можете сделать это с помощью условного форматирования, а также.

Если данные, которые вы указали выше, находятся в диапазоне A2: E9 (требуется строка буфера вверху, как вы увидите понемногу), вы можете выбрать Range B3: E9 и создать новое правило и Use a formula to determine which cells to format и введите следующую формулу:

=OR(SUM(B1:B3)=3,SUM(B2:B4)=3,SUM(B3:B5)=3) 

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