首页 > 解决方案 > Shape.Rotation 属性行为

问题描述

With sketch
    .ScaleHeight 16, msoFalse
    .ScaleWidth 16, msoFalse
    .Fill.Visible = False
    .Line.Weight = 1
    .Line.ForeColor.RGB = RGB(0, 0, 0)
    .Left = XCoordinate
    .Top = YCoordinate
    .Rotation = AngleDeg
End With

这是我正在编写的代码。我使用在 for 循环的每次迭代期间都会发生变化的公式计算 X 和 Y 坐标。

我的问题是这个形状在旋转之前会转到给定的 X 和 Y 吗?另外,当它旋转存储在变量 AngleDeg 中的这个角度值时,它使用的旋转轴是什么?

我对此感到担心,因为如果它围绕它的左上角旋转,那么这对我来说是个问题,因为我需要它围绕通过它的中心点的轴旋转。这也是为什么我在此 Left 和 Top 属性之前拥有 scalewidth 和 scaleheight 属性的原因。

我发现它使用了草图中心的正确 X 和 Y(考虑到草图的原点在左上角计算),但是当它缩放草图时它会受到干扰,然后移动/弄乱 co -草图中心的坐标。

请指导。

标签: excelvba

解决方案


下一个过程能够根据其中心坐标旋转一个形状。当然,当您测试它(未更改)时,在活动工作表上您必须有一个名为“草图”的形状:

Sub testRotFunction()
  Dim sketch As Shape
  Set sketch = ActiveSheet.Shapes("sketch")
  centerRotation sketch, 0
End Sub

Sub centerRotation(sR As Shape, rotAngle As Double)
    Dim rad As Double, x As Double, y As Double
    Dim x1 As Double, x2 As Double

    x = sR.Top: y = sR.Left
    x1 = (sR.Width / 2) * -1
    x2 = sR.Height
    rad = rotAngle * Atn(1) / 45

    With sR
        .Top = x + (.Height - .Width / 2 - x1 - x2) * (1 - Cos(rad)) / 2
        .Left = y + (.Height - .Width / 2 - x1 - x2) * Sin(rad) / 2
        .Rotation = rotAngle
    End With
End Sub

推荐阅读