2016-08-20 10 views
-1

Я пытаюсь написать excel VBA для сравнения столбцов таблицы с текущей датой и выделить, если true.Сравнение столбцов таблицы с текущей датой в excel VBA

Ниже приведен пример таблицы:

enter image description here

Код, который я работаю на это:

Private Sub Workbook_Open() 
    Dim tbl As Excel.ListObject 'Table name 
    Dim lr As Excel.ListRow 'Row index 
    Dim ws As Excel.Worksheet 'Work sheet 
    'column names 
    Dim keepInTouch As Range, invite As Range, present As Range, follow As Range 

    Set ws = ThisWorkbook.Worksheets(1)         'select work book index 1 
    Set tbl = ws.ListObjects("ContactList")        'set ContactList to tbl 
    Set keepInTouch = tbl.ListColumns("Keep in Touch").DataBodyRange 'Select the appropreate header 
    Set invite = tbl.ListColumns("Invite").DataBodyRange 
    Set present = tbl.ListColumns("Present").DataBodyRange 
    Set follow = tbl.ListColumns("Follow").DataBodyRange 
    'MsgBox tbl 
    For Each lr In tbl.ListRows 
     If lr.Range(1, tbl.ListColumns("Keep in Touch").Index).Value <> Date Then 
      keepInTouch.Interior.ColorIndex = xlNone 
      keepInTouch.Font.ColorIndex = 1 
      keepInTouch.Font.Bold = False 
     'If keepInTouch(1).Value = Date And keepInTouch(1).Value <> "" Then 
     ElseIf lr.Range(1, tbl.ListColumns("Keep in Touch").Index).Value = Date Then 
      keepInTouch.Interior.ColorIndex = 3 
      keepInTouch.Font.ColorIndex = 2 
      keepInTouch.Font.Bold = True 
     End If 
     Next lr 
End Sub 

Line 19: If keepInTouch.Index = Date And keepInTouch.Index <> "" Then вызывает

Run time error '438': 
Object doesn't support this property or method. 

Что такое правильный способ сделать это?

+0

Должна быть проще с [условным форматированием] (https://www.ablebits.com/office-addins-blog/ 2014/06/17/excel-conditional-formatting-dates/# based-current-date), а Range не имеет '.Index' .. может быть, вы имеете в виду' .Value' – Slai

+0

@Slai Я пробовал '.Value', но он дал «Ошибка времени выполнения» 13: Тип mismatch' – Amir

+0

Используйте 'If keepInTouch (1) .Value = Date Then' Нет необходимости проверять строку нулевой длины, так как вы уже проверяете, является ли она текущая дата. – Jeeped

ответ

0
If lr.Range(1, tbl.ListColumns("Keep in Touch").Index).Value = Date Then 

Например lr.Range(1, 2) это вторая ячейка в столбце ListRow Range

keepInTouchIndex = tbl.ListColumns("Keep in Touch").Index 
NameIndex = tbl.ListColumns("Name").Index 

For Each lr In tbl.ListRows 
    With lr.Range.Cells(1, NameIndex) 
     If lr.Range.Cells(1, keepInTouchIndex).Value <> Date Then 
      .Interior.ColorIndex = 3 
      .Font.ColorIndex = 2 
      .Font.Bold = True 
     Else 
      .Interior.ColorIndex = xlNone 
      .Font.ColorIndex = 1 
      .Font.Bold = False 
     End If 
    End With 
Next lr 
+0

. Оно дает то же сообщение об ошибке. '438' :( – Amir

+0

@Amir Я немного изменил его после – Slai

+0

. Я принял изменения. После каждого цикла форматирование каждой ячейки будет отложено по умолчанию. * основной код обновлен с изменениями – Amir

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