2017-01-25 2 views
0

Я использую приведенный ниже код, чтобы сделать первую строку цвета таблицы серой на основе, если ячейка пуста или нет. Например, ячейка A1 не пустая, так что цвет серый, ячейка B1 не пустая, так что цвет ее серый, но ячейка C1 пуста, поэтому не окрашивайте ее вообще. Пока мой сценарий раскрашивает всю серию серого на основе A1. Есть ли альтернатива этому?VBA Ячейки строк цвета, если они не равны нулю

Sub test() 
Dim c As Integer 
c = Application.WorksheetFunction.CountA(ActiveSheet.Range("A1")) 
If c > 0 Then 
    ActiveSheet.Range("A1").EntireRow.Interior.ColorIndex = 48 
End If 
End Sub 

ответ

1

При работе с Excel-VBA, это enourmously полезно понять идею Objects и Collections и как цикл их.

Watch-window - ваш лучший друг здесь, также как и ключевое слово With при написании кода.

В вашем случае: Cell является объектом внутри Worksheet.Cells -collection (в вашем случае, а также объект внутри ActiveSheet.Rows(1).Cells -collection

Это делает то, что вы хотите, на основе информации, которую вы нам дали. (вы не определили, что вы не хотите, чтобы петля всей строки;))

Option Explicit 

Sub ColorCells() 
    Dim objCell As Object 
    With ActiveSheet 
     With .Rows(1) 
      For Each objCell In .Cells 
       With objCell 
        If .Value > 0 Then .Interior.ColorIndex = 48 
       End With 
      Next objCell 
     End With 
    End With 
End Sub 

Это должно дать вам представление о том, как Excel-Objects работы.

Очевидно, мы можем записать это короче:

Sub ColorCells() 
    Dim objCell As Object 
    For Each objCell In ActiveSheet.Rows(1).Cells 
     If objCell.Value > 0 Then objCell.Interior.ColorIndex = 48 
    Next objCell 
End Sub 

Примечание:

  • Этот код будет циклически все 16k Cells в вашем . Очевидно, что мы могли бы остановиться на вашем последнем использованном Cell. Однако, поскольку это работает в течение секунды, я оставил это специально для того, чтобы сохранить код чистым

  • Хотя вы могли бы сделать это с условным форматированием, я поддерживаю идею делать это с кодом ONCE без следов (то есть ваши условные форматы), слева.

  • Я понимаю, что вы пытались сделать с .CountA и .EntireRow, здесь это не работает.

+0

Спасибо за ваш ответ, я только новичок в VBA, и это делало мою голову в, это прекрасно работает. – Hosey93

+0

Рад, что я мог помочь. Обязательно отметьте вопрос как ответ. Также подумайте, действительно ли 'objCell.Value> 0' действительно делает то, что вам нужно, если вам нужно что-то вроде' IsEmpty'. –

0

Вы также можете сделать что-то подобное с помощью формулы. Вы можете изменить функцию, чтобы обрабатывать больше логики и цветов.

Это цвет будет окрашен в зеленый цвет, если выражение истинно. Вы указываете цвет как RGB.

=ColorRowIF(A1=B1, 1, 181, 0)

Или в вашем случае

=ColorRowIF(ISBLANK(B2), 1, 181, 0)

Public Function ColorRowIF(Condition As Boolean, r As Integer, g As Integer, b As Integer) As String 
    Dim row As Integer 
    row = Application.Caller.row 

    If Condition = True Then 
     ActiveSheet.Evaluate "ColorRow(" & row & ", " & r & ", " & g & ", " & b & ")" 
    Else 
     'ws.Rows(r).Interior.Color = vbRed 
    End If 

    ColorRowIF = Condition 
End Function 


Public Sub ColorRow(row As Integer, r As Integer, g As Integer, b As Integer) 

    Dim ws As Worksheet 
    Set ws = ActiveSheet 
    ws.Rows(row).Interior.Color = RGB(r, g, b) 

End Sub 


Function IsDate(CellDate As Date) As Boolean 
    If CellDate >= 1 And CellDate <= #12/31/2199# Then 
    ' 1 is equal to January 1, 1900 
     IsDate = True 
    Else 
     IsDate = False 
     End If 
End Function