2017-12-24 5 views
0

私はVBAの範囲内で交互に行を色分けしていました。問題は、Rangeメソッドが適切な範囲を選択しないようで、隣接するセルの色付けを終了するということです。これは私が実際に得るものである、VBA - Excelで範囲メソッドが正しい行を選択していない

desired output. Alternate rows colored by grey

しかし:これは私の所望の出力である

enter image description here

これは私が作成したコードです:

Sub limpar_aniversariantes() 
    Worksheets("Aniversariantes").Range("B4:D900").ClearContents 
    'Worksheets("Aniversariantes").Range("B4:D900").Interior.Color = RGB(255, 255, 255) 
End Sub 


Sub gerar_lista_aniversariantes() 
    limpar_aniversariantes 
    Dim newrange As Range, rw As Range 
    Sheets("Base de Alunos").Select 
    Set newrange = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible) 
    CountInicioMes = 12 
    CountInicio = 16 
    Count = CountInicio 
    count_first_line = 0 
    For Each rw In newrange.Rows 
     Worksheets("Aniversariantes").Range("B" & Count).Value = rw.Cells(2).Value 
     Worksheets("Aniversariantes").Range("C" & Count).Value = Left(rw.Cells(5).Value, 2) 
     Worksheets("Aniversariantes").Range("C" & Count).NumberFormat = "DD" 
     Worksheets("Aniversariantes").Range("D" & Count).Value = UCase(rw.Cells(15).Value) 
     'Worksheets("Aniversariantes").Range("A" & Count).Value = Count 
     'pintar linhas alternadamente de cinza 
     If Count Mod 2 = 0 Then 
      Worksheets("Aniversariantes").Range("B" & Count & ":D" & Count).Interior.Color = RGB(211, 211, 211) 
      Debug.Print ("B" & Count & ":D" & Count) 
     End If 
     'pegar mes dos aniversariantes, eh preciso pular header 
     If count_first_line < 2 Then 
      count_first_line = count_first_line + 1 
      If count_first_line = 2 Then 
       my_date = rw.Cells(5).Value 
      End If 
     End If 
     'Debug.Print Left(rw.Cells(5).Value, 2) 
     Count = Count + 1 
     'Debug.Print rw.Cells(2).Value 
    Next rw 
    Worksheets("Aniversariantes").Range("B" & (CountInicio + 1) & ":D" & Count).Sort key1:=Worksheets("Aniversariantes").Range("C" & (CountInicio + 1) & ":C" & Count), _ 
    Header:=xlNo 
    'limpar bordas anteriores 
    Worksheets("Aniversariantes").Columns("B:D").Borders.LineStyle = xlNone 
    Worksheets("Aniversariantes").Range("B" & (CountInicio) & ":D" & (Count - 1)).Borders.LineStyle = xlContinuous 
    '.Weight = xlThin.ColorIndex = 3 
    my_month = Mid(my_date, 4, 2) 
    my_month_written = RetornarMes(CInt(my_month)) 
    Worksheets("Aniversariantes").Range("B" & CountInicioMes).Value = UCase(my_month_written) 
    Worksheets("Aniversariantes").Range("B" & CountInicio).Value = "NOME" 
    Worksheets("Aniversariantes").Range("C" & CountInicio).Value = "DIA" 
    Worksheets("Aniversariantes").Range("D" & CountInicio).Value = "MODALIDADE" 
    'mudar cor de fundo 
    'Worksheets("Aniversariantes").Range("B" & CountInicio & ":D" & CountInicio).Interior.Color = RGB(255, 255, 0) 
    'Debug.Print my_month_written 

End Sub 

私が対処していますあるワークシートから別のワークシートへの値を取得し、MOD関数を使用して偶数行のみを色付けします。これらの値をコピーするたびに、行数が変わることがあります。そのため、私はVBAでそれを行う必要があります。私はVBAでマスターされていないので、どんな助けもありがとうございます。私は朝、それをするのに苦労した。

編集:PERSONのデータテーブルから行を選択するとRange()が作成されることになりました。Interior.Color関数が正常に動作し、問題が範囲内にあります。ポルトガル語:

+0

'gerar_lista_aniversariantes'を実行する前に色をリセットしますか? 'limpar_aniversariantes'で色をリセットする2行目がコメントされているのがわかります。 – JohnyL

+1

条件付き書式を使用してバンド付き行を作成する必要があります。[Excelでバンド付き行を作成する](http://www.microknowledge.com/try-this-it-works/creating-banded-rows-in-excel/)また、リストをテーブルに変換することもできます。 –

+0

あなたは正しい@JohnyLです。私は、このコマンドはすべての行が白になるので問題が生じているとコメントしました。しかし、私はテストのために手動で色をリセットしています。 – lfvv

答えて

1

すべての権利、@Thomas Inzinaコメントへ

おかげで、私は式は "= MOD(ROW()、2)<> 0が" 私の母国への翻訳e.i言語を、エクセルされなければならないことに気づきました。その後、右の変換は "= MOD(LIN(); 2)<> 0"になります。

https://stackoverflow.com/a/15957075/1171721

私は満足しています:私は私は私の質問に示したような奇妙な動作を得ていたしかし、なぜ、まだ私の代わりに、私は私の問題を解決するために(適切式)このソリューションを使用し、把握していませんそれで私が望んでいたものを得たのですが、なぜ誰かが古いアプローチを使ってこの奇妙な振る舞いをするのを発見したら、学習のために提案された解決策をテストすることができます。

関連する問題