2009-12-03 68 views
0

在我的excel文件中,我有一個帶有公式的表格設置。Excel VBA Select Case Loop Sub

帶有來自範圍(「B2:B12」),範圍(「D2:D12」)的單元格以及包含這些公式的答案的每隔一行。我需要應用條件格式,但我有7個條件,所以我一直在使用VBA中的「select case」來根據它們的編號來改變它們的內部背景。我目前成立了片內碼的選擇情況下的功能,而不是它自己的宏觀

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim iColor As Integer 
    If Not Intersect(Target, Range("B2:L12")) Is Nothing Then 
     Select Case Target 
      Case 0 
       iColor = 2 
      Case 0.01 To 0.49 
       iColor = 36 
      Case 0.5 To 0.99 
       iColor = 6 
      Case 1 To 1.99 
       iColor = 44 
      Case 2 To 2.49 
       iColor = 45 
      Case 2.5 To 2.99 
       iColor = 46 
      Case 3 To 5 
       iColor = 3 
     End Select 
     Target.Interior.ColorIndex = iColor 
    End If 
End Sub 

,但使用這種方法,你必須是實際進入價值進入細胞的格式化工作。

這就是爲什麼我想寫一個子程序來做到這一點的宏。我可以輸入數據,讓公式工作,當一切準備就緒時,我可以運行宏並格式化這些特定的單元格。

我想要一個簡單的方法來做到這一點,顯然我可以浪費大量的時間,爲每個單元格輸入所有的情況,但我認爲使用循環會更容易。

我將如何去編寫一個select case循環來改變每隔一行的特定範圍的單元格的格式?

謝謝你提前。

+1

您可以使用「添加評論」功能,該功能出現在每個答案下方。下面的大文本框可用於回答(解決方案)。評論框可用於討論解決方案及其評論。 – shahkalpesh 2009-12-03 19:46:31

+1

您的Select Case有一個邏輯錯誤。如果某人設法輸入3個十進制值(比如.496),則不會選擇任何Case。 (換句話說,它會「跌倒」)。它應該是.49到.99,.99到1.99等。 – Oorang 2009-12-04 00:09:03

回答

1

這是一個非常基本的循環,它遍歷一個範圍內的所有單元格並設置ColorIndex。 (我沒有嘗試,但它應該工作)

Private Function getColor(ByVal cell As Range) As Integer 
    Select Case cell 
     Case 0 
      getColor = 2: Exit Function 
     Case 0.01 To 0.49 
      getColor = 36: Exit Function 
     Case 0.5 To 0.99 
      getColor = 6: Exit Function 
     Case 1 To 1.99 
      getColor = 44: Exit Function 
     Case 2 To 2.49 
      getColor = 45: Exit Function 
     Case 2.5 To 2.99 
      getColor = 46: Exit Function 
     Case 3 To 5 
      getColor = 3: Exit Function 
    End Select 
End Function 

Private Sub setColor() 
Dim area As Range 
Dim cell As Range 

Set area = Range("B2:L12") 
    For Each cell In area.Cells 
     cell.Interior.ColorIndex = getColor(cell) 
    Next cell 
End Sub 

編輯:它現在。我忘了添加ColorIndex的Interior infront並將ByRef設置爲ByVal。 Btw。請添加您的評論作爲評論我的答案。

EDIT2:關於你ERRORMSG改變值時:

「檢測明確名稱:的setColor」

我想你還是留在你的worksheet_change一些代碼。你沒有提到你想如何運行你的Sub。

如果你想在worksheet_change上運行它,你只需要在VBA(不是模塊)的工作表中添加代碼並調用setcolor。 只能有一個setColor,因此請確保它在您的模塊或工作表中。

如果你想從你需要改變

Private Sub setColor() 

Public Sub setColor() 

模塊運行它,它會更好,添加的worksheetname或你的範圍ActiveSheet盈。就像這樣:

Set area = ActiveSheet.Range("B2:L12") 
0
Option Explicit 
Private Function getColor(cell As Range) As Integer 
    Select Case cell 
     Case 0 
      getColor = 2: Exit Function 
     Case 0.01 To 0.49 
      getColor = 36: Exit Function 
     Case 0.5 To 0.99 
      getColor = 6: Exit Function 
     Case 1 To 1.99 
      getColor = 44: Exit Function 
     Case 2 To 2.49 
      getColor = 45: Exit Function 
     Case 2.5 To 2.99 
      getColor = 46: Exit Function 
     Case 3 To 5 
      getColor = 3: Exit Function 
    End Select 
End Function 
Public Sub setColor() 
Dim area As Range 
Dim cell As Range 

Set area = Range("B2:L12") 
    For Each cell In area.Cells 
     cell.Interior.ColorIndex = getColor(cell) 
    Next cell 
End Sub 

編輯:來吧,接受@瑪格的答案。
我只是用他的代碼&糾正了幾件事情,從而導致編譯時錯誤。

+0

thx。我沒有意識到你必須聲明一個foreach循環的元素。 – marg 2009-12-03 18:20:04