簡體   English   中英

在單元格更改時執行excel VBA宏不會更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM