vanquyenmrt123
Thành viên mới 

			
		- Tham gia
 - 11/11/21
 
- Bài viết
 - 12
 
- Được thích
 - 0
 
Mình muốn làm nhấp nháy trong ô "A1", (nhấp nháy chữ hoặc số trong ô) nhấp nháy 2 cái rồi tắt thôi, chứ không nhấp nháy liên tục. Xin các cao nhân giúp đỡ với ạ!
				
			




Option Explicit
Sub nhapnhay()
Dim i&
With Range("A1").Font
Do
    i = i + 1
    Application.Wait Now + TimeSerial(0, 0, 1) ' Thoi gian nhap nhay la 1s
    .Color = vbBlack ' chu mau den
    Application.Wait Now + TimeSerial(0, 0, 1)
    .Color = vbWhite ' chu mau trang
Loop Until i = 2 ' so lan nhap nhay
End With
End Sub
	Sub OnFlick()
    [A1].Dirty
End Sub
	Option Explicit
Option Compare Text
#If VBA7 = 0 Then
  Private Enum LongLong:[_]:End Enum
  Private Enum LongPtr:[_]:End Enum
#End If
#If -VBA7 And -Win64 Then
  Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As LongPtr
  Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr
#ElseIf VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
Private Type TypeArguments
  Action As Long
  Timer As Single
  ThisCell As Object
  addr As String
  Fx As String
  RSTarget As Range
  color1 As Long
  color2 As Long
  delay As Single
  Timer2 As Single
  Timer3 As Single
  FlickBackground As Boolean
  BGNone As Boolean
  DisplayColor1 As Long
  DisplayColor2 As Long
  NumberFormat As String
  ColorFormat As String
  FormatCondition As Object
End Type
Private Works() As TypeArguments, cltWorks As Collection
Private Sub FlickTest()
  On Error Resume Next
  Static b%: b = b + 1
  Select Case b Mod 3
  Case 0: [D2].Resize(3).value = 0
  Case 1: [D2].Resize(3).value = -1
  Case 2: [D2].Resize(3).value = 1
  End Select
  Cells.SpecialCells(xlCellTypeFormulas).Dirty
End Sub
Function Flick(value As Variant, Optional Color = vbRed, Optional times& = 5, Optional delaytime& = 250, Optional FlickBackground As Boolean)
  Flick = value
  On Error Resume Next
  Dim r As Object, k%, j&, f$, s$, n As Boolean, vs&, a
  Set r = Application.caller: f = r.Formula: s = r.Address(0, 0, , 1)
  If r Is Nothing Then Exit Function
  If cltWorks Is Nothing Then
    Set cltWorks = New Collection: GoSub ne
  Else
    k = cltWorks(s): If k = 0 Then GoSub ne Else Exit Function
  End If
  times = IIf(times < 1, 1, IIf(times > 20, 20, times))
  delaytime = IIf(delaytime < 200, 200, IIf(delaytime > 2000, 2000, delaytime))
  With Works(k)
    If FlickBackground Then .color1 = r.Interior.Color Else .color1 = r.Font.Color
    .delay = delaytime / 1000
    .Timer2 = Timer
    .Timer3 = Timer + (times + 3) * .delay + 0.5
    .FlickBackground = FlickBackground
    Color = Localize_SetColor(Color)
    .color2 = IIf(.color1 = Color, vbGreen, Color)
  End With
  SetTimer Application.hwnd, 55126126, 50, AddressOf Flick_Working
E:
Exit Function
ne:
  k = UBound(Works): k = k + 1: ReDim Preserve Works(1 To k): cltWorks.Add k, s
  With Works(k): .Action = 1: Set .ThisCell = r: .addr = s: .Fx = f: .Timer = Timer:
  End With
Return
End Function
Private Function colorInNumberFormat(ByVal NumberFormat$, ByVal colorIndex%) As String
  Dim a, i%, j%, k%, l%, s$, d%, v$
  a = Array("[Black]", "[White]", "[Red]", "[Green]", "[Blue]", "[Yellow]", "[Cyan]", "[Magenta]")
  For i = -7 To 56
    If i <= 0 Then
      s = a(i + 7): GoSub a
    Else
      s = "[Color " & i & "]": GoSub a
    End If
  Next
Exit Function
a:
  k = InStr(1, NumberFormat, s, 1)
  If k Then
    If colorIndex = i Then
      l = Len(NumberFormat)
      For i = k + Len(s) To l
        v = Mid$(NumberFormat, i, 1)
        Select Case d
        Case 0:
          Select Case v
          Case "[": d = 1
          Case Else: d = 2: j = i: If i = l Then colorInNumberFormat = Mid$(NumberFormat, i): Exit Function
          End Select
        Case 1: If v = "]" Then d = 2: j = i + 1
        Case 2:
          If v = ";" Or i = l Then
            l = IIf(v = ";", i - j, l - j + 1)
            colorInNumberFormat = Mid$(NumberFormat, j, l): Exit Function
          End If
        End Select
      Next
    End If
  End If
Return
End Function
Private Sub Flick_Working(ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr)
  On Error Resume Next
  Dim i, k%, ash As Object, b As TypeArguments, n As Boolean, c&, r As Range, s$
  Dim fm As FormatCondition
  Set ash = Application.ActiveSheet
  For Each i In cltWorks
    With Works(i): b = Works(i)
      Select Case .Action
      Case 1, 2: n = True: Set r = .ThisCell
        If .Action = 1 Then
          .Action = 2
          .BGNone = r.DisplayFormat.Interior.Pattern = xlNone
          .DisplayColor1 = r.DisplayFormat.Font.Color
          .DisplayColor2 = r.DisplayFormat.Interior.Color
          s = r.NumberFormat: .NumberFormat = s:
          If s Like "*[[]*]*" Then
            s = colorInNumberFormat(s, r.DisplayFormat.Font.colorIndex)
            If s <> "" Then .ColorFormat = s:
          End If
          If .ColorFormat = "" Then
            For Each fm In r.FormatConditions
              If .FlickBackground Then
                Err.Clear: c = fm.Interior.Color
                If Err = 0 Then If c = .DisplayColor2 Then Set .FormatCondition = fm: .color1 = c: Exit For
              Else
                Err.Clear: c = fm.Font.Color
                If Err = 0 Then If c = .DisplayColor1 Then Set .FormatCondition = fm: .color1 = c: Exit For
              End If
            Next
            If Not .FormatCondition Is Nothing Then .BGNone = .FormatCondition.Interior.Pattern = xlNone
          End If
        End If
        DoEvents
        If ash Is r.Parent Then
          If Timer >= .Timer2 Then
            .Timer2 = .Timer2 + .delay
            If .ColorFormat <> "" And Not .FlickBackground Then
              r.NumberFormat = IIf(r.NumberFormat = .ColorFormat, .NumberFormat, .ColorFormat)
            Else
              If .FormatCondition Is Nothing Then
                If .FlickBackground Then
                  With r.Interior
                    .Color = IIf(.Color = b.color1, b.color2, b.color1)
                  End With
                Else
                  With r.Font
                    .Color = IIf(.Color = b.color1, b.color2, b.color1)
                  End With
                End If
              Else
                If .FlickBackground Then
                  With .FormatCondition.Interior
                      .Color = IIf(.Color = b.color1, b.color2, b.color1)
                  End With
                Else
                  Err.Clear
                  With .FormatCondition.Font
                    .Color = IIf(.Color = b.color1, b.color2, b.color1)
                  End With
                End If
              End If
            End If
          End If
        Else
          GoTo r
        End If
        If Timer > .Timer3 Then
r:
          .Action = 3:
          If .ColorFormat <> "" And Not .FlickBackground Then
            r.NumberFormat = .NumberFormat
          Else
            If .FormatCondition Is Nothing Then
              If .FlickBackground Then
                If .BGNone Then
                  r.Interior.Pattern = xlNone
                Else
                  r.Interior.Color = b.color1
                End If
              Else
                r.Font.Color = b.color1
              End If
            Else
              If .FlickBackground Then
                If .BGNone Then
                  .FormatCondition.Interior.Pattern = xlNone
                Else
                  .FormatCondition.Interior.Color = b.color1
                End If
              Else
                .FormatCondition.Font.Color = b.color1
              End If
            End If
          End If
        End If
      End Select
    End With
  Next
E:
  If Not n Then
    Set cltWorks = Nothing
    Erase Works
    KillTimer hwnd, idEvent
  End If
End Sub
Sub colors56()
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Dim i As Long
  Dim str0 As String, str As String
  For i = 1 To 55
    Cells(i, 1).Interior.colorIndex = i
    Cells(i, 1).value = "[Color " & i & "]"
    Cells(i, 2).Font.colorIndex = i
    Cells(i, 2).value = "[Color " & i & "]"
    str0 = Right("000000" & Hex(Cells(i, 1).Interior.Color), 6)
    str = Right(str0, 2) & Mid(str0, 3, 2) & Left(str0, 2)
    Cells(i, 3) = "#" & str
    Cells(i, 4).Formula = "=Hex2dec(""" & Right(str0, 2) & """)"
    Cells(i, 5).Formula = "=Hex2dec(""" & Mid(str0, 3, 2) & """)"
    Cells(i, 6).Formula = "=Hex2dec(""" & Left(str0, 2) & """)"
    Cells(i, 7) = "[Color " & i & "]"
  Next i
done:
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub
Private Function Localize_SetColor(ByVal Color As String) As Long
  Dim v As Long
  Select Case Color
  Case "yellow", "ye", "yl": v = vbYellow
  Case "red", "re": v = vbRed
  Case "blue": v = vbBlue
  Case "green", "gr": v = vbGreen
  Case "cyan", "cy": v = vbCyan
  Case "magenta", "ma": v = vbMagenta
  Case "white", "wh", "wi": v = vbWhite
  Case "black", "bl", "bk": v = vbBlack
  Case "orange", "or": v = &H71AFFF
  Case "pink": v = &HE819E8
  Case "purple", "pu": v = &HB44343
  Case "silver", "si": v = &HCBCBCB
  Case "violet", "vi": v = &HF5A2BF
  Case "Brown", "br": v = &H3232AA
  Case "Beige", "be": v = &HE819E8
  Case Else
    Select Case True
    Case Color Like "*[a-fA-F]*"
      If Color Like "[#]*" Then Color = Mid(Color, 2)
      Color = Mid(Color, 5, 2) & Mid(Color, 3, 2) & Mid(Color, 1, 2)
      v = CLng(IIf(Color Like "&H*", "", "&H") & Color)
    Case IsNumeric(Color): v = CLng(Color)
    Case Else: v = vbBlue
    End Select
  End Select
  Localize_SetColor = v
End Function
	



Bác chia sẻ phương pháp tổng quát giải quyết vấn đề tạo function với các trường hợp không bình thường như kiểu tạo thêm 1 hiệu ứng kèm với hàm như thế này được không ạ?Bạn có thể sử dụng Hàm Flick dưới đây:
Chỉ cần gõ =Flick(B1)
Hoặc gõ biểu thức vào trong =Flick(SUM(A1,B1,C1))
Giá trị ở ô tham chiếu thay đổi tự động nhấp nháy.
Các tham số:
1. Value - Tham chiếu ô hoặc biểu thức2. Color - Màu sẽ thay đổi3. Times - Số lần đổi màu4. DelayTime - khoản thời gian đổi màu (đơn vị mili giây)5. FlickBackground - Đổi màu nền
Để kích hoạt nhấp nháy sử dụng phương thức Dirty, ví dụ ô A1 gõ Flick, mã sẽ là:
JavaScript:Sub OnFlick() [A1].Dirty End Sub
Chép mã vào một Module mới
JavaScript:Option Explicit #If VBA7 = 0 Then Private Enum LongLong:[_]:End Enum Private Enum LongPtr:[_]:End Enum #End If #If -VBA7 And -Win64 Then Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As LongPtr Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr #ElseIf VBA7 Then Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long #Else Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long #End If Private Type TypeArguments Action As Long Timer As Single ThisCell As Object addr As String Fx As String RSTarget As Range color1 As Long color2 As Long delay As Long Timer2 As Single Timer3 As Single FlickBackground As Boolean End Type Private Works() As TypeArguments, cltWorks As Collection Function Flick(value As Variant, Optional color& = vbRed, Optional times& = 5, Optional delaytime& = 500, Optional FlickBackground As Boolean) Flick = value On Error Resume Next Dim R As Object, k%, i%, j%, f$, s$, n As Boolean, vs&, a, bk As Object, it Set bk = ThisWorkbook Set R = Application.caller: f = R.Formula: s = R.Address(0, 0, , 1): Set bk = R.Parent.Parent If cltWorks Is Nothing Then Set cltWorks = New Collection: GoSub ne Else k = cltWorks(s): If k = 0 Then GoSub ne End If times = IIf(times < 1, 1, IIf(times > 20, 20, times)) delaytime = IIf(delaytime < 200, 200, IIf(delaytime > 2000, 2000, delaytime)) With Works(k) If FlickBackground Then .color1 = R.Interior.color Else .color1 = R.Font.color .color2 = IIf(.color1 = color, vbGreen, color) .delay = delaytime .Timer2 = Timer .Timer3 = Timer + (times * delaytime) / 1000 .FlickBackground = FlickBackground End With SetTimer Application.hwnd, 55126126, 100, AddressOf Flick_Working E: Exit Function ne: k = UBound(Works): k = k + 1: ReDim Preserve Works(1 To k): cltWorks.Add k, s With Works(k): .Action = 1: Set .ThisCell = R: .addr = s: .Fx = f: .Timer = Timer: End With Return End Function Private Sub Flick_Working(ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr) On Error Resume Next Dim i, k%, ash As Object, b As TypeArguments, n As Boolean Set ash = Application.ActiveSheet For Each i In cltWorks With Works(i): b = Works(i) Select Case .Action Case 1: n = True If ash Is .ThisCell.Parent And Timer >= .Timer2 Then .Timer2 = .Timer2 + .delay / 1000 If .FlickBackground Then With .ThisCell.Interior .color = IIf(.color = b.color1, b.color2, b.color1) End With Else With .ThisCell.Font .color = IIf(.color = b.color1, b.color2, b.color1) End With End If End If If Timer > .Timer3 Then .Action = 2: If .FlickBackground Then .ThisCell.Interior.color = b.color1 Else .ThisCell.Font.color = b.color1 End If End If End Select End With Next E: If Not n Then Set cltWorks = Nothing Erase Works KillTimer hwnd, idEvent End If End Sub

thanks bạn, nhưng nhờ bạn thêm 1 tí được không, ở ô A1 (mình random giá trị bất và dùng conditional formating để định dạng, giá trị âm sẽ bôi đỏ). Giờ mình chỉ muốn nhấp nháy giá trị đó lên (dạng nhấn mạnh kết quả), và mình nhấp nháy giá trị theo màu của kết quả đó luôn (vi dụ giá trị âm màu đỏ thì nhấp nháy màu đỏ ấy, và giảm thời gian nhấp nháy còn 0.25s)Làm đại. Tần suất 1s, màu chữ thay đổi từ đen-trắng-đen-trắng
Mã:Option Explicit Sub nhapnhay() Dim i& With Range("A1").Font Do i = i + 1 Application.Wait Now + TimeSerial(0, 0, 1) ' Thoi gian nhap nhay la 1s .Color = vbBlack ' chu mau den Application.Wait Now + TimeSerial(0, 0, 1) .Color = vbWhite ' chu mau trang Loop Until i = 2 ' so lan nhap nhay End With End Sub




Trong thực tế, ô A1 của bạn là kết quả từ công thức (như trong file, là randbetween) hay là bạn nhập tay vào?thanks bạn, nhưng nhờ bạn thêm 1 tí được không, ở ô A1 (mình random giá trị bất và dùng conditional formating để định dạng, giá trị âm sẽ bôi đỏ). Giờ mình chỉ muốn nhấp nháy giá trị đó lên (dạng nhấn mạnh kết quả), và mình nhấp nháy giá trị theo màu của kết quả đó luôn (vi dụ giá trị âm màu đỏ thì nhấp nháy màu đỏ ấy, và giảm thời gian nhấp nháy còn 0.25s)
Mình đòi hỏi hơi nhiều nhưng lỡ nhờ giúp thì mình nhờ luôn, bạn thông cảm, hihi. Chúc bạn sức khỏe!




Option Explicit
Sub nhapnhay()
Dim i&
Const t = 1 ' thoi gian cho la 1s
Const freq = 3 ' so lan nhap nhay
With Range("A1")
    Do
        i = i + 1
        Application.Wait Now + TimeSerial(0, 0, t)
        .NumberFormat = ";;;" ' set o A1 to invisible
        Application.Wait Now + TimeSerial(0, 0, t)
        .NumberFormat = "General" ' set o A1 to visible
        If i >= freq And .NumberFormat = "General" Then Exit Sub
    Loop
End With
End Sub
	
Mình cam ơn bạn nhiều nha!VBA mình chỉ áp dụng cho tối thiểu 1s nhé. Nếu ít hơn thì xem dùng "kernel32" library (code bài #3).
Đoạn code dưới đây sẽ chuyển đổi format ô giữa dạng ";;;" (visible) và "General" (invisible), sẽ không làm thay đổi màu text mà chỉ hide nó đi thôi.
thời gian: t=1s
Không tự động chạy mà phải vào sub để chạy.
Mã:Option Explicit Sub nhapnhay() Dim i& Const t = 1 ' thoi gian cho la 1s Const freq = 3 ' so lan nhap nhay With Range("A1") Do i = i + 1 Application.Wait Now + TimeSerial(0, 0, t) .NumberFormat = ";;;" ' set o A1 to invisible Application.Wait Now + TimeSerial(0, 0, t) .NumberFormat = "General" ' set o A1 to visible If i >= freq And .NumberFormat = "General" Then Exit Sub Loop End With End Sub

Cảm ơn bạn nhiều ạ!Tôi đã thêm mã cho cả FormatNumber và Format Conditions, bạn có thể thử lại bài #3

Tôi đã thêm mã cho cả FormatNumber và Format Conditions, bạn có thể thử lại bài #3

Hiện tại ô D2 bạn đang set giá trị cố định, vậy chỗ ô D2 nó chạy theo công thức riêng của mình thì sao ạ, công thức của mình áp vào nó sẽ ra giá trị bất kỳ (âm,0, dương)

Cảm ơn bạn, mình đã hiểu rồi, cảm ơn bạn nhiều ạ!Thủ tục đó là một ví dụ, bạn sử dụng thì bạn tùy biến. Tất cả nằm ở hàm Flick mà thôi, bạn nhập gì vào hàm thì hàm sẽ chạy. phương thức Dirty chỉ là tính toán lại ô

bạn cho mình hỏi thêm tí, mình muốn đổi màu nền (FlickBackground - Đổi màu nền), (hiện tại bạn đang làm màu tím), mình nhìn đống code ko biết chỗ nào vô chỗ nào, hìThủ tục đó là một ví dụ, bạn sử dụng thì bạn tùy biến. Tất cả nằm ở hàm Flick mà thôi, bạn nhập gì vào hàm thì hàm sẽ chạy. phương thức Dirty chỉ là tính toán lại ô
Bạn chỉ cần code như thế này thôi.bạn cho mình hỏi thêm tí, mình muốn đổi màu nền (FlickBackground - Đổi màu nền), (hiện tại bạn đang làm màu tím), mình nhìn đống code ko biết chỗ nào vô chỗ nào, hì
Private Sub Worksheet_Calculate()
    SheetCalculate
End Sub
	#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr
    Private T As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
    Private T As Long
#End If
Private lColor As Long
Const sCll As String = "A1"
Const lFlickColor As Long = vbCyan
Const ms As Long = 250
Const lTime As Long = 2
Sub SheetCalculate()
    If lColor = 0 Then lColor = Sheet1.Range(sCll).Interior.Color
    ResetTimer
    T = SetTimer(0, 0, ms, AddressOf DoFlick)
End Sub
Private Sub DoFlick()
    Static k As Long
    With Sheet1.Range(sCll)
        If .Interior.Color = lColor Then
            .Interior.Color = lFlickColor
            k = k + 1
        Else
            .Interior.Color = lColor
            If k = lTime Then
                k = 0
                ResetTimer
            End If
        End If
    End With
End Sub
Private Sub ResetTimer()
    T = KillTimer(0, T)
    Sheet1.Range(sCll).Interior.Color = lColor
End Sub
	bạn cho mình hỏi thêm tí, mình muốn đổi màu nền (FlickBackground - Đổi màu nền), (hiện tại bạn đang làm màu tím), mình nhìn đống code ko biết chỗ nào vô chỗ nào, hì


Cảm ơn bạn nhiều nhaMã tôi đã sửa để bạn dễ dàng đặt màu hơn
Ví dụ đổi màu đỏ: =Flick(B1,"#FF",,,True)
#FF và #0000FF là như nhau
Tên màu tiếng Anh: =Flick(B1,"Red",,,True)
Trong bảng chọn màu:
View attachment 297044

Mình cảm ơn bạn nha!Bạn chỉ cần code như thế này thôi.
Code trong Worksheet:
Code trong Module:Mã:Private Sub Worksheet_Calculate() SheetCalculate End Sub
Mã:#If VBA7 Then Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPtr Private T As LongPtr #Else Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long Private T As Long #End If Private lColor As Long Const sCll As String = "A1" Const lFlickColor As Long = vbCyan Const ms As Long = 250 Const lTime As Long = 2 Sub SheetCalculate() If lColor = 0 Then lColor = Sheet1.Range(sCll).Interior.Color ResetTimer T = SetTimer(0, 0, ms, AddressOf DoFlick) End Sub Private Sub DoFlick() Static k As Long With Sheet1.Range(sCll) If .Interior.Color = lColor Then .Interior.Color = lFlickColor k = k + 1 Else .Interior.Color = lColor If k = lTime Then k = 0 ResetTimer End If End If End With End Sub Private Sub ResetTimer() T = KillTimer(0, T) Sheet1.Range(sCll).Interior.Color = lColor End Sub