У меня есть макрос записанный рекодером, меняющий цвет автофигуры с красного на зеленый. Но это изменение происходит мгновенно.
Как заставить макрос - менять цвет автофигуры плавно ? То есть плавно менять цвет автофигуры с красного цвета - на зеленый цвет, например за 3 секунды.
Всем доброго дня. Помогите решить вопрос.
У меня есть макрос записанный рекодером, меняющий цвет автофигуры с красного на зеленый. Но это изменение происходит мгновенно.
Как заставить макрос - менять цвет автофигуры плавно ? То есть плавно менять цвет автофигуры с красного цвета - на зеленый цвет, например за 3 секунды.Grell
Использовать формулу прямой в пространсве при известных X, Y, Z которые надо заменить на R ,G, B. Построить её от начального цвета к конечному, и постепенно , за указанное время, продвигаясь по ней менять значения цвета , количество дискретов и пауза между ними - определит скорость и плавность.
Андрей, можно наверно с таймером попроще :-) [vba]
Код
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ... sleep 100 ' Милисекунды
Sub chColor(Obj1, R1, G1, B1, Optional Steps = 20) Const dt# = 0.02 With Obj1 decRGB = .Fill.ForeColor.RGB B = Int(decRGB / 65536) decRGB = decRGB - B * 65536 G = Int(decRGB / 256) R = decRGB - G * 256 If R = R1 And G = G1 And B = B1 Then Exit Sub RStep = (R - R1) / Steps Gstep = (G - G1) / Steps Bstep = (B - B1) / Steps For i = 1 To Steps R = R - RStep G = G - Gstep B = B - Bstep With .Fill .Visible = msoTrue .ForeColor.RGB = RGB(R, G, B) .Transparency = 0 .Solid End With t = Timer + dt While Timer < t: Wend DoEvents: Next DoEvents End With End Sub
[/vba]
Использовать формулу прямой в пространсве при известных X, Y, Z которые надо заменить на R ,G, B. Построить её от начального цвета к конечному, и постепенно , за указанное время, продвигаясь по ней менять значения цвета , количество дискретов и пауза между ними - определит скорость и плавность.
Андрей, можно наверно с таймером попроще :-) [vba]
Код
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ... sleep 100 ' Милисекунды
Sub chColor(Obj1, R1, G1, B1, Optional Steps = 20) Const dt# = 0.02 With Obj1 decRGB = .Fill.ForeColor.RGB B = Int(decRGB / 65536) decRGB = decRGB - B * 65536 G = Int(decRGB / 256) R = decRGB - G * 256 If R = R1 And G = G1 And B = B1 Then Exit Sub RStep = (R - R1) / Steps Gstep = (G - G1) / Steps Bstep = (B - B1) / Steps For i = 1 To Steps R = R - RStep G = G - Gstep B = B - Bstep With .Fill .Visible = msoTrue .ForeColor.RGB = RGB(R, G, B) .Transparency = 0 .Solid End With t = Timer + dt While Timer < t: Wend DoEvents: Next DoEvents End With End Sub
В файле без этого, но если есть желание SLEEP подключить то видимо разница платформы тут например смотрите. [vba]
Код
01.#If VBA7 Then 02. #If Win64 Then 03. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 04. #Else 05. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 06. #End If 07.#Else 08. #If Win64 Then 09. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongLong) 10. #Else 11. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 12. #End If 13.#End If
[/vba]
Perfect2You,
В файле без этого, но если есть желание SLEEP подключить то видимо разница платформы тут например смотрите. [vba]
Код
01.#If VBA7 Then 02. #If Win64 Then 03. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 04. #Else 05. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 06. #End If 07.#Else 08. #If Win64 Then 09. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongLong) 10. #Else 11. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 12. #End If 13.#End If
bmv98rus Да! Спасибище, похоже, общий принцип усмотрел.
Поэкспериментировал с файлом. Интересная особенность: если начинаю вводить в ячейку до достижения конечного цвета, смена цвета прекращается и замирает на том цвете, который был в момент начала ввода. В коде такого прерывания не увидел - вроде до конца должна программа дорабатывать.
Плохо смотрел? Или это тонкость DoEvents?
bmv98rus Да! Спасибище, похоже, общий принцип усмотрел.
Поэкспериментировал с файлом. Интересная особенность: если начинаю вводить в ячейку до достижения конечного цвета, смена цвета прекращается и замирает на том цвете, который был в момент начала ввода. В коде такого прерывания не увидел - вроде до конца должна программа дорабатывать.
Плохо смотрел? Или это тонкость DoEvents?Perfect2You
В приложенном новом файле реализация немного изменена. Последний параметр теперь - время в секундах, за которое должен измениться цвет. Таймер используется не для ожидания, а только для фиксации времени начала, конца и текущего момента. Грубо говоря, помогает определить: до какого места прямой мы уже добрались.
bmv98rus! И все заинтересованные!
Программа из предыдущего приложенного файла около полуночи может зациклиться! В полночь таймер обнуляется.
Выход: вместо [vba]
Код
t = Timer + dt While Timer < t: Wend
[/vba]
поставить [vba]
Код
t = Date * 86400 + Timer + dt While Date * 86400 + Timer < t: Wend
В приложенном новом файле реализация немного изменена. Последний параметр теперь - время в секундах, за которое должен измениться цвет. Таймер используется не для ожидания, а только для фиксации времени начала, конца и текущего момента. Грубо говоря, помогает определить: до какого места прямой мы уже добрались.Perfect2You