2017-09-15 34 views
0

私のワークブックでは、D列には列Cの値の最後の6桁を導出するための数式があります。これらの列は「JE」というタイトルのシートにあります。私はA列に値を持つ動的SQL接続クエリを持っています。このクエリは、「required_refs」というタイトルのシートにあります。私は基本的に書いています:D列のセル​​の値が、シート "required_refs"のそのクエリの値と一致するか等しい場合は、シートJEのF列セルを赤にします。別のセルの値に基づいてセルの色を変更します

例:セルD10の値が "required_refs"の列Aの値のいずれかと等しい場合は、セルF10を赤にします。さらに、セルD13の値が、シート「required_refs」の列Aの値と一致または等しい場合は、F13を赤にします。等々。

これは私が試したコードです。私はシート「JE」でこれを追加しました: コード:

Sub ChangeCellColor() 

    Dim ref_code As Range: Set ref_code = Range("D7:D446").Value 
    Dim refCode_Confirm As Range: Set refCode_Confirm = Worksheets("required_refs").Range("A:A").Value 
    Dim colorChange As Range: Set colorChange = Worksheets("required_refs").Range("A:A") 

    For Each cell In ref_code 
     If cell.Value = refCode_Confirm.Value Then 
      Range("F7:F446").ActiveCell.Interior.ColorIndex = 3 
      Next cell 
     End If 
    End Sub 

現在、このコードは、単に何もしていませんが。 F列のセルは赤くなりません。私はこれに似た質問をしましたが、私が使っているワークブックはそれ以来ずっと変化しています。この質問は以前のものより少しシンプルです。 誰かが助けてくれたら、本当に感謝しています。ありがとう!

+0

'Range(" F7:F446 ")を変更しようとしていますか?ActiveCell to' cell' – Prisoner

答えて

0

コードにはいくつかの問題があります。

  1. .Valueは、文字列やロングのような基本型を返します。これを範囲変数に代入することはできません。
  2. End IfNext cellの文が入れ替えられます。 常には正しいインデントを使用して、これらのエラーをより明確にします。
  3. 宣言されていない変数cellがあります。これにより、バグが発生する可能性があります。 VBEでは、オプションをオンにして、新しいモジュールにOption Explicitを強制的に使用します。これらの問題を修正

はこれに私たちをリード:残念ながら

Sub ChangeCellColor() 

    Dim cell As Range 
    Dim ref_code As Range: Set ref_code = Range("D7:D446") 
    Dim refCode_Confirm As Range: Set refCode_Confirm = Worksheets("required_refs").Range("A:A") 
    Dim colorChange As Range: Set colorChange = Worksheets("required_refs").Range("A:A") 

    For Each cell In ref_code 
    If cell.Value = refCode_Confirm.Value Then 
     Range("F7:F446").ActiveCell.Interior.ColorIndex = 3 
    End If 
    Next cell 

End Sub 

、あなたはVBAでの値の列に対して直接単一の値を比較することはできませんと、それはまだ動作しません。

次のコードは、この残りの問題を修正しています。良い意味のある名前の選択と、変数に対するRVBAの使用に注意してください。これは、同様のエラーを避けるためのヒントです。 .Valueの代わりに.Value2の使用にも注意してください。これはです。をお勧めします。

Sub ChangeCellColor() 

    Dim rngRef As Range 
    Dim rngRefsToCheck As Range: Set rngRefsToCheck = Range("D7:D446") 
    Dim rngRequiredRefs As Range: Set rngRequiredRefs = Worksheets("required_refs").Columns("A") 
    Dim rngColorChangeRequired As Range: Set rngColorChangeRequired = Columns("F") 

    For Each rngRef In rngRefsToCheck 
    If Not IsError(Application.Match(rngRef.Value2, rngRequiredRefs, 0)) Then 
     rngColorChangeRequired.Cells(rngRef.Row).Interior.ColorIndex = 3 
    End If 
    Next rngRef 

End Sub 

色の変更を達成するための最善の方法は、高度なフィルタを使用することで、ループを回避することです。しかし、あなたはまだ基本を学んでいるので、私はループのバージョンを示しています。

+0

説明と修正のためにありがとうございます。それは有り難いです。 vbaではなく、高度なフィルタを使用する方が細胞の色の変化を達成するより良い方法であることを示唆していますか?再度、感謝します! – anve

+0

@anve申し訳ありません。 *** VBAで高度なフィルタを使用することを意味しました***。もちろん、データの上に余分な4行を追加するか、VBAで一時的に変更することで、ワークシートを変更する必要があります。あなたのケースでループを実行する時間が許容されれば、余分なレベルの複雑さに進む必要はありません。私は一般的なケースで話していましたが、次に似たようなことをするときは何かを考えていました。明確化のために – robinCTS

+0

感謝します。自分のコードを自分の「JE」シートに組み込みましたが、残念なことに、F列セルは赤色に変わりません。何かエラーや何かを引き起こすことはありません。しかし、私は調査を続け、私がそれを働かせることができるかどうかを見ていきます。助けてくれてありがとう! – anve

関連する問題