2014-05-25 3 views
1

열 B의 값이 변경되면 행 색상을 변경하는 매크로를 작성하려고합니다. A 열은 1과 0을 사용하여 제어하는 ​​열입니다. 즉, 열 B는 동일하게 유지되는 한 열 A는 1을 유지합니다. B가 변경 될 때마다 A가 0으로 반전됩니다.VBA - 필터링 된 경우에도 열 값이 변경 될 때 행 음영 변경

열 B의 값이 바뀌면 행을 올바르게 색칠 할 수 있지만 데이터를 필터링 할 때 문제가 발생합니다. 예를 들어 B2-B4를 "test1"로 설정하고 B5-B7을 "test2"로 설정하고 B8-B10을 "test3"으로 설정 한 다음 "test2"가 포함되지 않도록 B 열을 필터링한다고합시다. 원래 행은 열 값이 변경된 곳에서 색상이 다르게 표시되지만 행 B2-B4와 B8-B10은 같은 색상으로 설정되어 "test2"행이 숨겨져 있기 때문에 터치됩니다. 변경 사항이있을 때 제대로 색이되도록 심지어 행을 필터링 한 후 나는 그것을 고칠 수있는 방법

Sub ColorRows() 
    Dim This As Long 
    Dim Previous As Long 
    Dim LastRow As Long 
    Dim Color As Integer 
    Dim R As Long 

    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
    RwColor = Array(15,0) 
    Color = 0 

    For R = 2 To LastRow 
     This = Cells(R, 1).Value 
     Previous = Cells(R - 1, 1).Value 
     If This <> Previous Then Color = 1 - Color 

     Range("A" & R & ":M" & R).Select 
     Selection.Interior.ColorIndex = RwColor(Color) 
    Next R 
End Sub 

: 여기

내가 행을 색칠하는 데 사용되는 코드입니다,하지만 필터링이 작동하지 않습니다 열 값에?)

1. 코드 모듈에서 UDF로 아래의 코드를 삽입 :

+0

안녕하세요! 시도한 코드를 게시 할 수 있습니까? 우리가 문제를 정확하게 지적하는 것이 더 쉽습니다. – Stefan

답변

0

다음은이 작업을 수행 할 수있는 방법입니다.
2.) 그런 다음 수식을 A에 넣습니다 (A2 : =analyseVisible(B2)).

이것은 B -cells와 다음 위의 셀을 비교하여 A에 'rank'카운터를 표시합니다.

지금의 카운터 (행이 숨겨져있는 경우에도) contiunous에, 당신이 조건부 서식으로 색상을 MOD 2을 사용할 수 있습니다 :

3.) 전체 테이블에 대해 A2에서 (조건부 서식을 추가) : =MOD($A2,2)=1을 입력하고 채우기 색상을 설정합니다.

필터를 지금 사용하거나 B의 값을 변경하면 행이 실시간으로 색이 바뀝니다.

Public Function analyseVisible(r As Range) As Integer 
    Dim i As Long 
    If Application.Caller.Row <= 2 Or _ 
    r.Row <> Application.Caller.Row Then 
     analyseVisible = 1 
     Exit Function 
    End If 

    i = r.Row - 1 
    While r.Worksheet.Rows(i).Hidden And i > 1 
     i = i - 1 
    Wend 

    If i = 1 Then 
     analyseVisible = 1 
    Else 
     analyseVisible = r.Worksheet.Cells(i, Application.Caller.Column).Value 
     If r.Worksheet.Cells(i, r.Column).Value <> _ 
     r.Value Then analyseVisible = analyseVisible + 1 
    End If 
End Function 
0

아래 코드는 사용 된 & 행만 확인하여 문제를 처리합니다. 그것은 꽤 잘 작동하지만, 나는 필터를 변경하면 그것을 발사하는 방법을 알아낼 수 없습니다. 또한 변경되는 값을 직접 비교합니다.

Private Sub colorRows() 
    Dim this As Variant 
    Dim previous As Variant 
    Dim currentColor As Long 

    Dim rng As Range 'visible range 
    Dim c As Range ' cell 
    ' pick a color to start with 
    currentColor = vbYellow 
    ' rng = used and visible cells 
    Set rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible) 

    For Each c In rng   ' For each cell that is visible and used 
     If Not c.Row = 1 Then ' skip header row 
      this = c.Value 
      'some simple test logic to switch colors 
      If this <> previous Then 
       If currentColor = vbBlue Then 
        currentColor = vbYellow 
       ElseIf currentColor = vbYellow Then 
        currentColor = vbBlue 
       End If 
      End If 
      'set interior color 
      c.Interior.color = currentColor 

      previous = this 
     End If 
    Next c 
End Sub 

그런 다음 색칠하려는 워크 시트의 모듈에서 Worksheet_Activate() 이벤트에서 하위를 호출하십시오. 실제로는 다른 이벤트를 원할 것입니다. 저는 대부분 Access에서 작업하기 때문에 사용할 수있는 것을 실제로 알지 못합니다. 다음 단계는 올바른 방향으로 향하게하려는 것입니다. 당신이 시작한 방법을 고수하면 질문을 할 수 있습니다.)

Private Sub Worksheet_Activate() 
    colorRows 
End Sub 
관련 문제