2017-09-15 203 views
0

在我有一個工作簿中,D列中有一個公式可以導出列C中值的最後六位數。這些列位於標題爲「JE」的表單中。我有一個動態的SQL連接查詢,它具有A列中的值。該查詢位於名爲「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'更改爲'cell' – Prisoner

回答

0

你的代碼有很多問題。

  1. .Value返回基本類型,如字符串或long。您不能將其分配給範圍變量。
  2. 您的End IfNext cell語句被換掉。 總是使用正確的縮進因此這些錯誤變得更加明顯。
  3. 你有一個未申報的變量cell。這可能會導致錯誤。在VBE中,打開Tools > Options > Editor > Required Variable Declaration選項可強制在新模塊中使用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作爲變量。這是如何避免發生類似錯誤的好建議。還請注意使用.Value2而不是.Value。這是高度推薦

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中使用高級過濾器***。當然,這需要通過在數據上添加額外的四行來更改工作表,或者在VBA中暫時添加。如果在你的情況下運行循環的時間是可以接受的,那麼就沒有必要進入額外的複雜度。我在一般情況下發言,並且在下次您做類似​​的事情時考慮一下。 – robinCTS

+0

感謝您的澄清。我將你的代碼合併到我的「JE」表單中,不幸的是,它不會將F列單元格變成紅色。它不會導致任何錯誤或任何事情。但是,我會繼續調查,看看我能否實現它。再次感謝您的幫助! – anve

相關問題