2010-07-13 4 views
2

Так что я работаю над инструментом отчетности в Access. Он запрашивает локальные таблицы и создает документ Excel (через VBA) и создает файл Excel.чередующиеся цвета строк/цифры в Excel - VBA

Я использую следующий код, чтобы цвет альтернативный код и он прекрасно работает

For a = 1 To rs.RecordCount 
    With ExcelSheet   
     .Cells(a + 1, 1) = a 
     .Cells(a + 1, 1).EntireRow.Interior.ColorIndex = IIf((a + 1) Mod 2 = 0, 2, 15) 
    End With 
Next 

Примечание я должен сделать a + 1, потому что а = 1 это название строки, и это название строки.

Примечание: .Cells(a + 1, 1) = 1 номера строки (1, 2, 3, ...)

Примечание: IIf((a + 1) Mod 2 = 0, 2, 15) 2-и 15 представляют собой цветовые коды.

Теперь мой вопрос в том, что когда кто-то получает отчет Excel, они могут удалить строку или выполнить операцию сортировки или что-то еще, и когда они это сделают, это испортит строки.

например:

1 white row 
2 grey row 
3 white row 
4 grey row 

если я-то их я получаю

3 white row 
1 white row 
2 grey row 
4 grey row 

, который не то, что я хочу, я хочу, чтобы сохранить форматирование и нумерацию Любой выполнить это с помощью VBA в доступе?

Tech: Офис 2007

ответ

3

Это может быть достигнуто с помощью ROW() функции и условного форматирования. Функция ROW() возвращает текущую строку ячейки, в которой она находится, поэтому она будет меняться всякий раз, когда ячейки будут удалены, перемещены или отсортированы. Условное форматирование повторно применяется при изменении условий, поэтому перемещение или сортировка строк будут информировать Excel соответствующим образом обновлять цвета. Код будет выглядеть следующим образом:

Dim a As Integer 
Dim oneRow As Range 

For a = 1 To rs.RecordCount 
    With ExcelSheet 

     ''// show the row number in the first cell 
     .Cells(a + 1, 1).Formula = "=ROW()" 

     ''// set formatting to alternate row colors 
     Set oneRow = .Cells(a + 1, 1).EntireRow 
     oneRow.FormatConditions.Delete 
     oneRow.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
      "=MOD(ROW()-1, 2)=0" 
     oneRow.FormatConditions(1).Interior.ColorIndex = 2 
     oneRow.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
      "=MOD(ROW()-1,2)=1" 
     oneRow.FormatConditions(2).Interior.ColorIndex = 15 

    End With 
Next a 
+0

Как я вручную ввести в номер строки? Как насчет столбца номера? Я не хочу 1, 2, 3 до 2, 3, 1, когда строки сортируются. – masfenix

+0

@edit, это предназначалось для кого-то, кто прокомментировал, но удалил там комментарий. Я отправлюсь сюда для справки. Я думаю, что, возможно, вы ошибались. Этот код находится в Access, я создаю документ, все форматирование, данные выполняются через VBA on Access. Затем я просто вызываю ExcelObject.save, чтобы сохранить файл. Если я их номер из Access DBA, это нормально, но пользователь может открыть лист Excel и упорядочить строки.Тогда, поскольку в Excel нет макроса, он испортит нумерацию строк. – masfenix

+0

Пользователи не очень разбираются в Excel. Они просто хотят сортировать и печатать. Ни один из них не знает ни одной строки кода. – masfenix

1

@ e.James

Dim rowRange As Range 


ExcelSheet.Cells(1, 1).EntireColumn.ColumnWidth = 4 
ExcelSheet.Cells(1, 1) = "#" 
Set rowRange = Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 
rowRange.Select 
With ExcelApp.Selection 
    .FormatConditions.Delete 
    .FormatConditions.Add xlExpression, Formula1:="=MOD(ROW(),2)" 
    .FormatConditions(1).Interior.ColorIndex = 15 
End With 

Это dosnt работы. Он просто выделяет самую верхнюю строку (заголовок строки) серого цвета.

EDIT NEVERMIND Его должно быть

Set rowRange = ExcelSheet.Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 

EDIT НОМЕР 2: Вы знаете, как я могу вставить номера строк, в каждой строке, используя этот метод?

ОТВЕТ:

ExcelSheet.Cells(1, 1).EntireColumn.ColumnWidth = 4 
Set RowRange = Range("2:2", rs.RecordCount & ":" & rs.RecordCount) 
RowRange.Columns(1).Formula = "=ROW()-1" 
With RowRange 
    .FormatConditions.Delete 
    .FormatConditions.Add xlExpression, Formula1:="=MOD(ROW(),2)" 
    .FormatConditions(1).Interior.ColorIndex = 15 
End With 
+0

ответил на вопрос –

+0

О, мой бог, это было так легко. Может быть, это конец рабочего дня, и им просто не хватает моего кофеина. – masfenix

+0

Это также привело мое время вниз с 25ish секунд до 10 - 13 секунд, отнимая 3 петли – masfenix