2017-07-20 16 views
0

我試圖創建一個宏,它將比較標記爲「Requisition Number」和「PO#」的兩欄中單元格的值在前一行中的單元格。如果單元格相同,我希望線條突出顯示相同的顏色。下面是我的代碼:當試圖根據單元格的值更改文本顏色時出現「下標超出範圍」錯誤

Sub changeTextColor() 

    Dim Color As Integer 

    Color = 5 

    'Get number of rows in the specified column 
    RowsCount = Range("A1", Range("A1").End(xlDown)).Rows.Count 

    Dim colReq As Range 
Dim colPO As Range 


With ActiveSheet.UsedRange.Rows(1) 
    Set colReq = .Find(What:="Requisition Number", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False) 
    Set colPO = .Find(What:="PO #", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False) 
End With 


    'Select cell 
    ActiveSheet.Cells(1, colReq.Column).Select 

    'Loop the cells 
    For x = 1 To RowsCount 
     If (ActiveCell.Value = ActiveSheet.Cells(ActiveCell.Row + 1, ActiveCell.Column).Value) And _ 
      ActiveSheet.Cells(ActiveCell.Row, colPO.Column).Value = ActiveSheet.Cells(ActiveCell.Row+1, colPO.Column).Value Then 

       ActiveCell.EntireRow.Font.ColorIndex = Color 
       ActiveCell.EntireRow+1.Font.ColorIndex = Color 

     Else 
      Color = Color + 5 
     End If 

     ActiveCell.Offset(1, 0).Select 
    Next 

End Sub 

我在我的下面幾行代碼收到錯誤「下標越界」,而我不知道如何解決它?

  ActiveCell.EntireRow.Font.ColorIndex = Color 
      ActiveCell.EntireRow+1.Font.ColorIndex = Color 
+0

您需要了解有關調試的信息。瀏覽你的代碼並檢查你的變量的值。您不檢查是否找到值(colPO)。如果活動單元格是第1行,則會因爲沒有行零而出錯。 – SJR

+0

當你到達那條線時,你肯定有'colPO'範圍嗎?另外,我**高度**建議學習[如何避免使用'.Select' /'.Activate'](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in- excel-vba-macros) – BruceWayne

+0

如果你在第1行,你會得到一個錯誤,因爲'ActiveCell.Row - 1'返回一個'0'並且沒有第0行。 – braX

回答

0

這主要是一個語法錯誤。 ActiveCell.EntireRow + 1.Font.ColorIndex = Color沒有意義的擅長。這是導致問題的EntireRow + 1。你將不得不像我看到你在下面的一段代碼中使用的偏移量。

試試這個:

  ActiveCell.EntireRow.Font.ColorIndex = Color 
      ActiveCell.offset(1,0).Select 
      ActiveCell.EntireRow.Font.ColorIndex = Color 

像@brucewayne在他的評論中說,你真的想避免選擇/活化細胞儘可能多地。它會減慢你的代碼,並且可能笨重。

下面是關於如何以及爲何要避免使用選擇和激活https://www.excelcampus.com/vba/how-to-avoid-the-select-method/

一個強大功能的文章的for循環是,你可以在代碼中使用計數器變量(在你的情況下,「X」)以取代偏移量。我使用了幾種不同的技術取出了選擇並在您的代碼中激活。請注意,我如何在循環中使用cells(x,col)來爲每次迭代向下移動一個單元格,以及如何使用cells(x + 1,col)去一個低於x的值。 (在測試代碼之前,務必將「Sheet Name」替換爲您的工作表的實際名稱)

Sub changeTextColor() 

Dim Color As Integer 
Dim colReq As Range 
Dim colPO As Range 

Color = 5 

    'Get number of rows in the specified column 
RowsCount = Range("A1", Range("A1").End(xlDown)).Rows.Count 



With Worksheets("Sheet Name").UsedRange.Rows(1) 
    Set colReq = .Find(What:="Requisition Number", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False) 
    Set colPO = .Find(What:="PO #", LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False) 
End With 



    'Loop the cells 
    For x = 1 To RowsCount 
     If (Worksheets("Sheet Name").Cells(x, colReq.Column).Value = Worksheets("Sheet Name").Cells(x + 1, colReq.Column).Value) And _ 
      Worksheets("Sheet Name").Cells(x, colPO.Column).Value = Worksheets("Sheet Name").Cells(x + 1, colPO.Column).Value Then 

       Worksheets("Sheet Name").Cells(x, colReq.Column).EntireRow.Font.ColorIndex = Color 
       Worksheets("Sheet Name").Cells(x + 1, colReq.Column).EntireRow.Font.ColorIndex = Color 
     Else 
      Color = Color + 5 
     End If 
    Next 

End Sub 
+0

非常感謝,這幫了大忙!它幾乎完美地工作,更有意義的是,我是如何組裝的。 – SomeUser

+0

我很高興它有幫助。當你剛接觸VBA時,很自然地想要選擇並激活所有的東西,因爲這就是我們如何使用excel。但學習如何解決這個問題將會進入下一個階段。祝你好運! – Jarom