Я написал простой код в Excel VBA, чтобы заставить диапазон "мигать" цветом - это достигается путем тщательного рисования прямоугольного объекта над рассматриваемым диапазоном и изменения его прозрачности, чтобы поле постепенно исчезало.
Вот код (в Sheet1
для события Worksheet_Change
):
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub flashBox(ByVal area As Range, Optional ByVal fillColour As MsoRGBType = vbGreen)
Const animationSeconds As Single = 0.5
Const animationSteps As Long = 20
With area.Worksheet.Shapes.AddShape(msoShapeRectangle, area.Left, area.Top, _
Application.WorksheetFunction.Min(area.Width, 1000), _
Application.WorksheetFunction.Min(area.Height, 1000)) 'stop infinite boxes, could use view area to define this
.Line.Visible = msoFalse
.Fill.ForeColor.RGB = fillColour
Dim i As Long
For i = 1 To animationSteps
Sleep animationSeconds * 1000 / animationSteps
.Fill.Transparency = i / animationSteps
DoEvents 'screen repaint
Next i
.Delete
End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
flashBox Target, ColorConstants.vbMagenta
End Sub
Я использую блок With
для хранения временного объекта без родительской переменной (я думаю, что это довольно аккуратно, и я надеюсь, что он останется таким). Проблема возникает из-за вызова DoEvents
(необходимого для принудительной перерисовки экрана для анимации).
Анимация вызывается из определенных событий изменения рабочего листа, и если вызывается второй экземпляр подпрограммы (или на самом деле, если происходит какое-либо событие, кажется), первый завершается наполовину завершенным и никогда не завершается - это означает, что временная форма никогда не удаляется .
Вот иллюстрация, показывающая, о чем я говорю:
Как я могу обойти это?
Worksheet_Change
.DoEvents
находится в циклеFor i.. Next
анимации. - person Greedo   schedule 11.05.2019DoEvents
вообще предотвращает выполнение второй половины вашего Sub! Обходной путь: присвойте фигуре.AlternativeText = "DeleteMe"
, чтобы распознать и удалить их все в цикле. - person Asger   schedule 12.05.2019