2015-09-16 52 views
1

我正在寫一個簡單的格式化宏來替換Excel中表格的行顏色。使用變量遍歷範圍(行和列)

我希望這個宏能夠格式化任何大小的表(不管行/列大小)。

例如,我想宏時我有6行4列,或4行5列,或9行10列的圖表工作,等等

這裏是我到目前爲止的代碼 - 但我得到一個運行時錯誤。

If ActiveSheet Is Nothing = False Then 
    Set MyWS = ActiveWorkbook.ActiveSheet 

    lastCol = MyWS.UsedRange.Columns.Count + 1 
    lastRow = MyWS.UsedRange.Rows.Count + 1 

    For Each Cell In Range(lastRow, lastCol) ''change range accordingly 
    If Cell.Row Mod 2 = 1 Then 
     Cell.Interior.ColorIndex = 15 ''color to preference 
    Else 
     Cell.Interior.ColorIndex = 14 ''color to preference or remove 
    End If 
    Next Cell 
End If 

我已經試過範圍的多個版本 - 讓列VAR是第一位的,具有「&」而不是逗號等

如果我只使用範圍(「A1:一「& lastRow),它將工作,但只適用於列A中的數據。 我需要它跨越圖表中的所有列。

回答

1

如果表都是由單元格A1開始,for語句更改:

For Each Cell In Range("A1", Cells(lastRow, lastCol)) ''change range accordingly 

雖然還,你的for循環的工作方式是,它是不斷變化的每一個細胞。它可以進行優化,以便將行直接上色到最後一列。

If ActiveSheet Is Nothing = False Then 
    Set MyWS = ActiveWorkbook.ActiveSheet 

    lastCol = MyWS.UsedRange.Columns.Count + 1 
    lastRow = MyWS.UsedRange.Rows.Count + 1 

    Dim i As Integer 
    For i = 1 To lastRow 
    If i Mod 2 = 1 Then 
     Range("A" & i, Cells(i, lastcol)).Interior.ColorIndex = 15 
    Else 
     Range("A" & i, Cells(i, lastcol)).Interior.ColorIndex = 14 
    End If 
    Next i 
End If 
+1

糟糕,也不需要使用整數遍歷行。可以使用'For Each r In MyWs.UsedRange.Rows'作爲@ A.S.H回答。 –

+0

感謝您的留言。有趣的是,我的回答被拒絕了,由一些未知的人沒有勇氣提及任何投票的理由... –

0

試試這個:

Dim r As Range 
    For Each r In MyWs.UsedRange.Rows 
    If r.Row Mod 2 = 1 Then 
     r.Interior.ColorIndex = 15 
    Else 
     r.Interior.ColorIndex = 14 
    End If 
    Next r 
0

總是好的,包括期權在您的代碼模塊明確。請嘗試以下操作:

Option Explicit 

    Sub test() 

    Dim MyWS As Excel.Worksheet 
    Dim objRow As Excel.Range 
    Dim lastCol As Long 
    Dim lastRow As Long 
    Dim lngRow As Long 

    If ActiveSheet Is Nothing = False Then 
     Set MyWS = ActiveWorkbook.ActiveSheet 

     lastCol = MyWS.UsedRange.Columns.Count + 1 
     lastRow = MyWS.UsedRange.Rows.Count + 1 

     For lngRow = 1 To lastRow 
      Set objRow = MyWS.Range(MyWS.Cells(lngRow, 1), MyWS.Cells(lngRow, lastCol)) 
     If lngRow Mod 2 = 1 Then 
      objRow.Interior.ColorIndex = 15 'color to preference 
     Else 
      objRow.Interior.ColorIndex = 14 'color to preference or remove 
     End If 
     Next lngRow 

    End If 

    End Sub 
+0

同意@Dylan下面 - 有一個默認的假設,每個表從A1開始。但如果是這樣,可以做每一行,不必做每一個細胞。 – Ben

+0

重複遍歷行很簡單 –

+1

@ASH它確實是,我沒有意識到Rows屬性只會解決UsedRange中的列,所以我剛剛學到了一些東西:)原始帖子似乎表明了一個額外行的意圖和一個額外的列,所以也許你需要稍微延長這個範圍以滿足要求,如果這是有意的?也得到了downvoted,也不知道爲什麼! – Ben