Перемещение фигуры по ячейкам в зависимости от направления ее поворота

Werwolfik

Добрый вечер. Имеется макрос. На листе - имеется четыре кнопки в виде синих стрелок (прямо,влево,вправо,назад) - и одна маленькая красная стрелка.В идеале все должно работать так: Кнопка "прямо" ПЕРЕМЕЩАЕТ красную стрелку - прямо на одну ячейку (в том направлении куда стрелка на тот момент направлена), кнопка "влево" - ПОВОРАЧИВАЕТ ее влево, кнопка "вправо" - ПОВОРАЧИВАЕТ ее вправо, а кнопка "назад"- ПЕРЕМЕЩАЕТ красную стрелку на одну ячейку назад (назад - то есть против направления стрелки). Подскажите, как заставить кнопки - так влиять на красную стрелку ? (В настоящее время - стрелки поворота вправо или влево - работают нормально. Но вот кнопки вперед и назад - перемещают стрелку - не вперед и назад на 1 ячейку по направлению стрелки, а вверх или вниз по листу. То есть сейчас стрелка двигается строго по одной линии по вертикали, вместо того, чтобы перемещаться по всему листу.)
4 ответа

Werwolfik

как-то не логично: одни стрелки только вращают, другие двигают. Логичней было бы всем задать одинаковое действие. Например по стрелкам задать направление, а по средине кнопку движения. Либо сразу поворот и движение
    Select Case Right(CStr(Application.Caller), 1)
        Case "1"
          sh.Rotation = 270
          sh.Left = sh.TopLeftCell.Offset(, 2).Left
        Case "2"
          sh.Rotation = 90
          sh.Left = sh.TopLeftCell.Offset(, -1).Left
        Case "3"
          sh.Rotation = 0
          sh.Top = sh.TopLeftCell.Offset(1).Top
        Case "4"
          sh.Rotation = 180
          sh.Top = sh.TopLeftCell.Offset(-1).Top
        Case Else
            Exit Sub
    End Select
Но привязка к ячейке не красиво работает


Werwolfik

Alex77755, не работает. Теперь куда-то исчезла система поворота - влево и вправо.Кроме того в вашем коде - перемещение происходит так, что стрелка оказывается постоянно на ГРАНИЦЕ ячеек, в то время Как в моем макросе - стрелка всегда располагалась внутри ячейки при перемещении (а не посередине границы ячейки).При нажатии на кнопку Влево - стрелка двигается влево - сразу на две ячейки, а не на одну.


Werwolfik

Werwolfik, вы с ВасилисаЛкн из одного курятника? Потому и голову включать не любите за компанию?
Sub MoveShape()
    'On Error Resume Next
'    Dim sh As Shape: Set sh = ActiveSheet.Shapes("Down Arrow 5")
    Dim sh As Shape: Set sh = ActiveSheet.Shapes("Стрелка вниз 5")
    Dim angle As Long, X As ******, Y As ******, angleGR As ******
    Dim sn%, cs%
    
    angle = sh.Rotation
    sn = Cos(angle * 1.74532925199433E-02)
    cs = Sin(angle * 1.74532925199433E-02)
'    angleGR = 0
'    If angle <> 0 Then angleGR = WorksheetFunction.Pi * angle / 180
    
'    X = sh.TopLeftCell.Left
'    Y = sh.TopLeftCell.Top
'    Dlinna = IIf(sh.DrawingObject.Width > sh.DrawingObject.Height, sh.DrawingObject.Width, sh.DrawingObject.Height)
        
    Select Case Right(CStr(Application.Caller), 1)
        Case "1"
          sh.Rotation = (angle + 90) Mod 360
        Case "2"
          sh.Rotation = (angle - 90) Mod 360
        Case "3"
          sh.Left = sh.BottomRightCell.Offset(-sn, cs).Left
          sh.Top = sh.BottomRightCell.Offset(-sn, cs).Top
        Case "4"
          sh.Left = sh.BottomRightCell.Offset(sn, -cs).Left
          sh.Top = sh.BottomRightCell.Offset(sn, -cs).Top
 
        Case Else
            Exit Sub
    End Select
End Sub


Werwolfik

стрелка оказывается постоянно на ГРАНИЦЕ ячеек
ну так с цихерками координат ячеек и стрелки разберись. Или перемещай на фиксированное расстояниея предложил вариант