2015-08-24 59 views
0

我想根據單元格的值來更改單元格的背景顏色,但不是整行。我有一些代碼可以實現我想要的功能,但我確信有更高效的方法,並希望在提高代碼效率方面提供一些幫助。下面列出的是執行任務的代碼片段。爲着色單元動態選擇一行的一部分

Sub chg_bkgrnd_Color() 

Dim rng As Range 
Dim row As Range 
Dim cell As Range 
Dim counter As Long 

Set rng = Range("k2:k23") 
Range("k2").Select 

For Each cell In rng 

    Select Case cell.Value 

    Case Is = "Closed" 

     ActiveCell.Offset(counter, -10).Interior.ThemeColor = xlThemeColorDark1 
     ActiveCell.Offset(counter, -10).Interior.TintAndShade = -0.249977111117893 
     ActiveCell.Offset(counter, -9).Interior.ThemeColor = xlThemeColorDark1 
     ActiveCell.Offset(counter, -9).Interior.TintAndShade = -0.249977111117893 
     ActiveCell.Offset(counter, -8).Interior.ThemeColor = xlThemeColorDark1 
     ActiveCell.Offset(counter, -8).Interior.TintAndShade = -0.249977111117893 
     ActiveCell.Offset(counter, -7).Interior.ThemeColor = xlThemeColorDark1 
     ActiveCell.Offset(counter, -7).Interior.TintAndShade = -0.249977111117893 


    End Select 

    counter = counter + 1 
    Next 

End Sub 
+2

爲什麼[條件格式](https://support.office.com/en-au/article/Use-a-formula-to-apply-conditional-formatting-fed60dfa-1d3f-4e13 -9ecb-f1951ff89d7f)沒有被使用? – Jeeped

+0

我只需要突出顯示不是整行的單元格範圍。 – Aaron

+1

正如Jeeped所問,你可以有條件地格式化一些你不需要有條件地格式化整行或一列的單元格。這似乎是一種更容易的方法,而不是重新創建已有的東西。 –

回答

1

條件格式將是最好的,但如果你想使用標準格式化的,這是你的代碼的簡化版本:

Sub chg_bkgrnd_Color() 
    Dim i& 
    For i = 2 To 23 
     If Cells(i, 11) = "Closed" Then 
      With Range(Cells(i, 1), Cells(i, 4)).Interior 
       .ThemeColor = xlThemeColorDark1 
       .TintAndShade = -0.249977111117893 
      End With 
     End If 
    Next 
End Sub 

繼@ Jeeped的建議,這裏是用一個版本自動執行此操作。在工作表中的代碼模塊,把這個:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    RangeAutoBackFill "Closed", 11, 2, 23, 1, 4, xlThemeColorDark1, -0.249977111117893 

End Sub 

,然後在標準代碼模塊,把這個:

Public Sub RangeAutoBackFill(Key$, KeyCol&, KeyRowLow&, KeyRowHigh&, FillColLow&, FillColHigh&, FillTheme&, FillTint#) 
    Dim i& 
    For i = KeyRowLow To KeyRowHigh 
     If Cells(i, KeyCol) = Key Then 
      With Range(Cells(i, FillColLow), Cells(i, FillColHigh)).Interior 
       .ThemeColor = FillTheme 
       .TintAndShade = FillTint 
      End With 
     End If 
    Next 
End Sub 
+0

用於解決實際問題的獎勵點,而不考慮方法的適用性。我有時忘記解決這個問題。 – Jeeped

+0

Excel英雄,我回應了上面的Jeeped,並感謝他的榜樣。我對如何使用這個前進有一些想法。我能夠接受你的代碼建議,並使其適用於我的示例,正​​如我上面所解釋的,我在提問時做得不好。您的示例提供了一個非常好的示例,可以優化我在代碼中嘗試執行的操作。我還有另外兩個問題,因爲我是新手; 「Dim I&」之後的符號是什麼,你能推薦任何教導vba中Cells方法的Excel編程書籍嗎?再次感謝您的幫助。 – Aaron

+0

這可以充實到一個[Worksheet_Change](https://msdn.microsoft.com/en-us/library/office/ff839775.aspx?f=255&MSPPError=-2147217396)事件宏,以提供真正的好回答一個自動響應的回填。 – Jeeped

1

您詢問如何從列得到的細胞答:d有基於列K中的相應值是否爲「關閉」的高亮顯示。 Conditional Formatting是一個更好的解決方案,因爲它可立即爲列K中的更改提供自動的後臺響應。

Sub Create_Conditional_Formatting_for_AD_based_on_K_Closed() 
    Dim v As Long, vSTATEs As Variant, vCOLOURs As Variant 

    vSTATEs = Array("Open", "Closed", "Pending") 
    vCOLOURs = Array(3, 10, 5) 

    With ActiveSheet.Columns("A:D") 
     .FormatConditions.Delete 
     For v = LBound(vSTATEs) To UBound(vSTATEs) 
      With .FormatConditions.Add(Type:=xlExpression, _ 
       Formula1:="=$K1=" & Chr(34) & vSTATEs(v) & Chr(34)) 
       With .Interior 
        .ColorIndex = vCOLOURs(v) 
       End With 
       .StopIfTrue = True 
      End With 
     Next v 
    End With 

End Sub 

,該程序可以很好地適合於要在CF規則適用於大量的工作表或重複任務定期導入到新工作表的情況,但它可能比更多的工作只需手動創建六個規則。

我用.ColorIndex屬性簡化了回填顏色的選擇。你可以找到一張ColorIndex數字和顏色表here

請注意,我正在刪除先前的CF規則,並且在構造新的規則之前將其應用於:列A:D。如果您有其他CF規則來管理列A:D中的行爲,那麼這可能是一個考慮因素。

在CF規則中使用公式並使用絕對鎖定列K引用$指標允許您實現適用於:與正在評估的列不同。使用主頁►條件格式►管理規則查看結果。

手冊方法:

  1. 選擇列答:d與A1爲ActiveCell
  2. 選擇首頁►條件格式►新規則
  3. 選擇使用公式來確定哪些小區格式化和在格式中提供以下公式爲真的公式:文本框:

    =$K1="closed
  4. 單擊並從填充選項卡中選擇適當的高亮組合。
  5. 單擊確定接受格式更改,然後確定再次創建規則。
  6. 轉到步驟2並根據需要重複。如果您從主頁►條件格式化►管理規則開始並選擇,您可以節省幾次點擊。

您的結果應該類似於以下內容。

Conditional Formatting specific column based on another column

+0

Jeeped,謝謝你的例子。我想我理解你的觀點,即利用現有的Excel功能更有效,而不是從頭開始創建一些東西。話雖如此,我在提問方面做得不夠好,所以很抱歉產生混淆。我想知道如何以更高效的方式實現我在代碼中所做的工作。基本上,想知道如何動態更新有問題的單元格的背景顏色,而不必執行我原始示例中的所有明確指令。 – Aaron

+0

我有六個測試條件;打開,關閉,待定等。爲了在你的例子中做到這一點,我會簡單地在你的「With ActiveSheet.Columns(」A:D「)」之後添加一個select case語句,併爲每個測試複製代碼塊的其餘部分條件?再次感謝您的示例,儘管我能夠將「Excel Hero」的示例與我正在嘗試執行的內容更加一致。 – Aaron

+0

查看上面通過兩個變體陣列循環的附加內容。 – Jeeped