[英]Execute excel VBA macro on cell change doesnt update
我有以下代碼:
Sub CheckRevision()
Dim CurCell As Object
For Each CurCell In ActiveWorkbook.ActiveSheet.Range("B1:B5000")
If CurCell.Value = "Live" Then CurCell.Interior.Color = RGB(0, 204, 0)
Next
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("B1:B5000")) Is Nothing Then CheckRevision
End Sub
效果很好,但是如果我有一個“活動”單元格,例如將其更改回“ NOTLIVE”,則格式仍然是綠色單元格。 我如何將其恢復為白色默認值?
嘗試:(但請看一下Peh的評論)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("B1:B5000")) Is Nothing Then
For Each cl In Intersect(Target, Me.Range("B1:B5000"))
If UCase(cl.Value) = "LIVE" Then
cl.Interior.Color = RGB(0, 204, 0)
Else
cl.Interior.Color = xlNone
End If
Next
End If
End Sub
只需替換行, If CurCell.Value = "Live" Then CurCell.Interior.Color = RGB(0, 204, 0)
與
If curcell.Value = "Live" Then
curcell.Interior.Color = RGB(0, 204, 0)
Else
curcell.Interior.Pattern = xlNone
End If
您根本根本不需要If
語句..您可以使用以下代碼:
Sub CheckRevision()
Dim CurCell As Object
For Each CurCell In ActiveWorkbook.ActiveSheet.Range("B1:B5000")
CurCell.Interior.Color = xlNone - ((CurCell.Value = "Live") * (RGB(0, 204, 0) - xlNone))
Next
End Sub
那么,這是如何工作的呢? (謝謝,Pᴇʜ)
您基本上是在嘗試用以下任一顏色繪制單元格:
xlNone or RGB(0, 204, 0)
-4142 or 52224
這由CurCell.Value = "Live"
決定,當以這種方式使用(轉換為整數)時,它將返回0
(對於False
)或-1
(對於True
)。
知道所有這些決策都會導致一些數學運算,因此我們可以編寫一個方程,使0
或-1
產生兩個值:
如果CurCell.Value = "Live"
則公式如下所示:
CurCell.Interior.Color
= xlNone-(-1 *(RGB(0,204,0)-xlNone))
... =
xlNone-(-1 *
(RGB(
0,204,0)-xlNone))
... = RGB(0,204,0)
= 52224
如果CurCell.Value <> "Live"
則公式如下所示:
CurCell.Interior.Color = xlNone-(0 *(RGB(0,204,0)-xlNone))
... = xlNone-
(0 *(RGB(0,204,0)-xlNone))
... = xlNone
= -4142
如果您打算僅更改單元格的值,則可以更改特定時刻,則可以使用以下內容,該方法不會循環整個范圍,而僅測試特定單元格。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'Check if the cell changed included in the range B1:B5000 & if only one cell changed to avoid errors
If Not Intersect(Target, Range("B1:B5000")) Is Nothing And Target.Count = 1 Then
'Call the module to apply formatting passing 3 parameters.
Call Module1.CheckRevision(Target.Worksheet, Target.Value, Target.Address)
End If
End Sub
Sub CheckRevision(wsName As Worksheet, cellValue As String, cellAddress As String)
With wsName.Range(cellAddress)
If cellValue = "Live" Then
.Interior.Color = RGB(0, 204, 0)
Else
.Interior.Pattern = xlNone
End If
End With
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.