Страницы: 1
RSS
Движение фигуры по прямой по заданному количеству времени.
 
Здравствуйте. Суть в том, что нужно чтобы фигура за определенное количество времени заданного в ячейке A1 проходила по прямой, к примеру, 975 пикселей.
Написал код, но почему то после запуска виснет, и спустя заданное время (в ячейке A1), фигура мгновенно перемещает на нужно количество пикселей.  
Может кто знает как исправить код или знает иное решение?
Код
Sub OVAL()
ActiveSheet.Shapes.Range(Array("Овал 1")).IncrementLeft 975
DoEvents
Application.Wait (Now + TimeSerial(0, 0, Sheets("Лист2").Range("A2").Value))
End Sub
Изменено: nerf - 23.08.2016 19:04:29
 
Добрый вечер!

извините, из курса школьной математики, я знаю, что уравнение прямой имеет вид:
y = A*x+B
возможно, Вы учились в школе для особо одаренных детей и там все было по другому
но в моих представлениях о прямой
если
y = 975*x
то при изменении х всего на 1 значение у увеличилось на 975, это значит что точка преоделала путь в Корень(1^2+975^2)  что будет явно больше, чем 975
т.е. путь от точки (х1, у1) до точки (х2, у2) если х изменился всего на 1 будет более 975
поэтому Вы не увидите ни какого перемещения от (х1, у1) до (х2, у2), потому что все произошло за 1 шаг.

в Вашей задаче необходимо знать
1. Уравнение прямой
2. начальное значение х (х0)
3. сколько шагов перемещения обьекта показать
4. х увеличивать или уменьшать (длина пути не зависит от направления пути)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вот так движется
Код
Sub OVAL()
For i = 1 To 975
ActiveSheet.Shapes.Range(Array("Îâàë 1")).IncrementLeft 1
DoEvents
Application.Wait (Now + TimeSerial(0, 0, Sheets("Ëèñò2").Range("A2").Value))
Next i
End Sub
 
Хорошо.
Цитата
Суть в том, что нужно чтобы фигура за определенное количество времени заданного в ячейке A1 проходила по прямой, к примеру, 975 пикселей
Суть не изменилась.
Код
Private Sub CommandButton1_Click()
    fa = True
    Pi = Atn(1) * 4
    If CommandButton1.Caption = "Пуск" Then
        For i = 0 To 1060 Step 0.1
            Call Smesch(i, Pi, L, H)
            DoEvents
            If Not fa Then Exit For
        Next i
        CommandButton1.Caption = "Старт"
      Else
        Call Smesch(0, Pi, L, H)
        CommandButton1.Caption = "Пуск"
    End If
End Sub
Sub Smesch(i, Pi, L, H)
    L1 = L - 85 + i * 1.4
    L2 = L1 + 85 - 80 * Sin(i / 180 * Pi)
    On Error Resume Next
    ActiveSheet.Shapes("Group 7").Rotation = i
    If Err.Number = -2147024809 Then
        Err.Clear
        Exit Sub
    End If
    ActiveSheet.Shapes("Group 7").Left = L1
End Sub
 
Цитата
marchenkoan написал: Вот так движется
Спасибо. Но я уже так пробовал до этого, скорость практически не меняется или в итоге становится слишком быстрой или медленной. Только уже как не пробовал. Всегда есть отклонения. И практически с каждым разом они изменяются.

Единственное, что у меня более менее приближенное к цели получилось, это изменение заранее рассчитанного шага. К примеру для одной секунды шаг 2 и так далее. Но все равно каждый раз в миллисекундах были отклонения.
 
Может так пойдет?
 
gling спасибо за помощь, попробую еще поэкспериментировать с паузами  :)  
 
Мне с похожим вопросом помог ZVI. Посмотрите код - может быть чем-нибудь поможет
 
Юрий М Спасибо вам за пример.  :)
 
Цитата
Юрий М написал: Мне с похожим вопросом помог ZVI.
Юрий, спасибо - было дело, у себя бы уже и не нашел :)
 
Влад, это ТЕБЕ спасибо! :)
 
Цитата
nerf написал #7:
попробую еще поэкспериментировать с паузами
Если ещё актуально - прикрепил вариант (тонкости подсмотрел тут).
 
С.М. спасибо вам большое, это в точности все что нужно было мне, теперь буду разбираться в коде, и за ссылку тоже спасибо, думал уже все что связанно с данной темой на форуме перечитал.
Я сделал чтобы данные T и L выводились в ячейки, но почему то данные T в ячейке не совпадают с данными, которые выводятся в MsgBox.
было
Код
MsgBox "T = " & Format(Timer - T0, "0.0")
изменил на
Код
Cells(1, 2) = Format(Timer - T0, "0.0")
кто подскажет что я сделал не так?  
Изменено: nerf - 24.08.2016 21:22:37 (Возник вопрос )
 
А так ?
Код
E1:
    Cells(2, 2) = Timer - T0
    Cells(3, 2) = L
    MsgBox "T = " & Format(Timer - T0, "0.0") & vbCr & "L = " & Format(L, "0.0")
End Sub
(и форматируете сами ячейки).

Лучше, чтобы совсем исключить маленькую вероятность несовпадения:
Код
MsgBox "T = " & Format(Cells(2, 2), "0.0") & vbCr & "L = " & Format(L, "0.0")

Изменено: С.М. - 24.08.2016 22:40:03
 
я изначально не так делал, теперь понял в чем была моя ошибка, во всем разобрался, спасибо вам большое  :)
Изменено: nerf - 24.08.2016 22:46:06
 
Цитата
nerf написал: только я хотел избавиться MsgBox
Не настаиваю на необходимости этой строки в коде макроса :-) .
 
тогда я ее уберу  :D
 
Это - поступок !!!  :)
Страницы: 1
Наверх