2017-07-20 1 views
0

"募集番号"と "PO#"という2つの列のセルの値を比較するマクロを作成しようとしています。前の行のセル。セルが同じ場合は、線を同じ色でハイライト表示します。以下は、私のコードです:セルの値に基づいてテキストの色を変更しようとすると「下付き文字が範囲外です」エラー

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

'ActiveCell.Row - 1'が' 0'を返し、行0がないので、行1にいるとエラーが発生します。 – braX

答えて

0

これは主に構文エラーです。 ActiveCell.EntireRow + 1.Font.ColorIndex = Color Excelには意味がありません。問題の原因となっているのはEntireRow + 1です。私はあなたが下のコードの一部で使用されているように、オフセットを使用する必要があります。

はこれを試してみてください:

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

@brucewayneが彼のコメントで言ったように、あなたは本当に可能な限り多くの細胞を活性化/選択を避けたいです。それはあなたのコードを遅くし、clunkyすることができます。ここで

は、ループのための強力な機能の1つは、あなたがコードで(「X」あなたのケースで)カウンタ変数を使用することができるということですどのように、なぜ選択使用しないようにとhttps://www.excelcampus.com/vba/how-to-avoid-the-select-method/

をアクティブ品でありますオフセットの代わりに使用します。私はselectを取り出して、あなたのコードでいくつかの異なるテクニックを使ってアクティブ化しています。ループ内でcells(x,col)をどのように使用して、各繰り返しごとに1つのセルを下に移動し、cells(x + 1,col)を使ってxの値よりも1つ低い値にする方法に注目してください。 (コードをテストする前に、「シート名」をシートの実際の名前に置き換えてください)

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を初めて使うときは、すべてのものを選択して有効にしたいのは当然です。なぜなら、それが私たちの使い方だからです。しかし、それを回避する方法を学ぶことは次のレベルに向かいます。がんばろう! – Jarom

関連する問題