2013-04-29 4 views
2

У меня есть таблица Excel, в которой несколько строк имеют разные цветные фоны с помощью макросов VBA. Эти цвета фона должны быть заблокированы для строк. Моя проблема заключается в том, что когда таблица сортируется по одному столбцу или другому, цвета фона перемещаются по мере переупорядочения данных.Сортировка без форматирования

Могу ли я форматировать другим способом, чтобы остановить это, чтобы ячейки оставались заблокированными?

код я использую для формата:

For Each Row In rng.Rows 

If Condition Then 

    Row.Select 

    cIndex = ColourIndex(colour) 
    With Selection.Interior 
     .ColorIndex = cIndex 
    End With 

End If  
Next 

Пример моей таблицы, как это:

enter image description here EDIT: Дополнительный код

Sub Quota(ByVal Type As String) 

Dim records As Long 
Dim sht1 As Worksheet 
Set sht1 = Worksheets("Sheet1") 
Dim sht2 As Worksheet 
Set sht2 = Worksheets("Sheet2") 

records = sht1.Range("A1048576").End(xlUp).Row - 5 

Dim rng As Range 
Dim rngRowCount As Long 
Dim rLastCell As Range 
Dim i As Long 

sht2.Activate 

'Last used cell 
Set rLastCell = sht2.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ 
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False) 
'All used columns except 1st 
Set rng = sht2.Range(Cells(2, 1), rLastCell) 
rng.Select 
rngRowCount = rng.Rows.CountLarge 

For i = 1 To rngRowCount 

Dim valueAs String 
Dim colour As String 
Dim VarX As Long 
Dim maxValue As Long 

value= sht2.Cells(i + 1, 1).Value 
colour = sht2.Cells(i + 1, 2).Value 

If Type = "A" Then 
    VarX = sht2.Cells(i + 1, 3).Value 
ElseIf Type = "B" Then 
    VarX = sht2.Cells(i + 1, 5).Value 
End If 

maxValue = (records/100) * VarX 

ColourRows value, colour, maxValue 

Next i 

End Sub 

Sub ColourRows(value As String, colour As String, maxValue As Long) 

Dim sht1 As Worksheet 
Set sht1 = Worksheets("Sheet1") 
sht1.Activate 

Dim rng As Range 
Dim firstSixRowsOnwards As Range 
Dim lastColumn As Long 
Dim usedColumns As Range 
Dim usedColumnsString As String 
Dim highlightedColumns As Range 
Dim rngDataRowCount As Long 
Dim performancevalueAs String 
Dim cIndex As Integer 
Dim count As Long 

count = 0 

Dim rLastCell As Range 

'End row 
rngDataRowCount = sht1.Range("A1048576").End(xlUp).Row 
'First 6 rows 
Set firstSixRowsOnwards = sht1.Range("A6:XFD1048576") 
'Last column 
lastColumn = Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 
'Used Range 
Set rng = sht1.Range(Cells(1, 1), Cells(rngDataRowCount, lastColumn)) 
'Used Columns 
Set usedColumns = sht1.Range(Cells(1, 1), Cells(1048576, lastColumn)) 

Set rng = Intersect(rng, firstSixRowsOnwards, usedColumns) 

For Each Row In rng.Rows 

    compareValue= Cells(Row.Row, 5)).Value 

    If (InStr(1, value, compareValue, 1) Then 

     Dim rowNumber As Long 
     Row.Select 

     If count < maxValue Then 

      cIndex = ColourIndex(colour) 
      With Selection.Interior 
       .ColorIndex = cIndex 
      End With 

      count = count + 1 

     Else 

      cIndex = 3      'red 
      With Selection.Interior 
       .ColorIndex = cIndex 
      End With 

     End If 

    End If 

Next 

End Sub 
+0

Вы пропустили свой стол ... i f возможно показать, что у вас есть и что вы хотели бы иметь –

+0

Итак, в примере выше строки 3 и 4 всегда должны быть красными, независимо от сортировки, 6-8 всегда синим и т. д. – db579

+0

Можете ли вы поделиться точным кодом vba, который вы используете для заполнения строк?Я хочу знать критерии, которые вы оцениваете, и как вы выбираете цвет для заполнения строк. Я думаю, что это поможет нам найти выход. – MeenakshiSundharam

ответ

2

Я считаю, что если вы выбираете свои данные по столбцу, а затем сортируете (вместо диапазона с ограниченным числом строк), то последует форматирование.

EDIT:

Если вы хотите, чтобы заблокировать форматирование затем использовать условное форматирование, которое основано на номер строки, например ROW() = x или ROW() = диапазон значений ...

Протестировано: используйте условное форматирование по правилу набора формул, например = ROW() = 3, убедитесь, что excel не делает двойной котировки для вас, применяйте это ко всему диапазону данных. Строка 3 будет всегда отформатирована так, как вы установили здесь.

Установка в VBA

Sub test() 
    Range("A3").Select 

    With Range("A3") 
    .FormatConditions.Add Type:=xlExpression, Formula1:="=ROW()=3" 
    .FormatConditions(1).Interior.ColorIndex = 46 
    End With 
End Sub 
+0

Это не работает для меня - Сортировка по столбцу все еще перемещает цвет фона – db579

+0

oh my bad, я неправильно прочитал ваш оригинальный пост и подумал, что это то, что вы хотели –

+1

Не беспокойтесь, спасибо в любом случае! – db579

1

Здесь мы идем:

В этом случае, что бы я делал это один из двух вещей:

  1. Условное форматирование. Нужно много логик и ручных шагов, поэтому давайте оставим это.
  2. Макрос: Всякий раз, когда вы сортировать данные, пожалуйста, срабатывала следующую функцию

    Sub Option1() 
    Dim row As Range 
    Dim rowNum As Integer 
    Dim tRange As Range 
    
    'set range here: in your example, it is A2:D11 
    
    Set tRange = ActiveSheet.Range("A2:D11") 
    
    'clear colors 
    tRange.ClearFormats ' clears the previous format 
    
    rowNum = 1 
    
    For Each row In tRange.Rows 
    
        Select Case rowNum 
         Case 1, 2 
          row.Interior.Color = RGB(255, 255, 0) ' 1 and 2nd will be yellow 
         Case 3, 4 
          row.Interior.Color = 255 ' 3rd and 4th row will be red 
         Case 5, 6 
          row.Interior.Color = RGB(0, 0, 255) ' 5 and 6th row will be blue 
         Case Else 
          row.Interior.Color = RGB(0, 255, 0) '' all the bottom row would be a Green row 
        End Select 
        rowNum = rowNum + 1 
    Next row 
    End Sub 
    

поможет ли это?

+0

Моя проблема немного сложнее, так как я не знаю, какие строки будут проходить условия или какие цвета они будут заполнены перед раздачей - это вытащили из электронной таблицы - теперь выложили более обширный код, если это поможет вам помочь мне – db579

+0

Я попытался использовать row.Interior в отличие от selection.interior, как раньше, но не помог – db579

+0

Этот код не соответствует требованиям, как показано в примере. – pnuts

2

Может быть сделано с CF, например (верхнее правило> 11):

SO16274258 example

Edit - я нечаянно оставил одну правило

второй внизу использует =ROW($A1)=11:

SO16274258 second example

+0

Есть ли способ установить этот набор по моему VBA-коду динамически, как только код определит, какие строки должны быть окрашены, какие цвета запущены? – db579

+0

Я думаю, что я пытался ответить на раннюю версию вашего Q. Если цвета установлены в VBA в соответствии с критериями, отличными от «номера строки», тогда я думаю, вам понадобится больше кода для захвата цветов по строке и повторного применения после сорт. Что я имел в виду выше, так это то, что вы используете «другие» критерии только для определения того, что выбрать в качестве форматирования для формул, основанных на строке * в CF. т.е. не поворачивайте Row2 с кодом, потому что он имеет значение «20» в ColumnA, вместо этого забывайте код и выбирайте красный для Row2 «вручную» (если хотите, потому что в нем есть «20»). – pnuts

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