Shape.Top和Shape.Left问题

时间:2019-01-16 22:51:06

标签: excel vba

我有一些代码可以查看用户可以编辑的行的位置。编辑这条线的目的是从到目前为止可行的绘图计划中获得粗略的测量结果。我正在通过记录测量位置来使它更具交互性。

这是问题。当此形状(连接器弯头)位于机柜和接入点上时,它将使用shape.top和shape.left(下面的代码)记录其位置。当我调整此行的大小以将接入点放在另一个接入点上时,机柜位置也会发生变化,即使它没有移动也是如此。我确实注意到比例高度和宽度在图形上发生了变化,但是我不知道为什么这会影响初始点。

值得注意的是,随着旋转弯头连接器,宽度和高度的值也会旋转。这意味着有时高度会上下波动,有时它是您希望宽度达到的值。当连接器旋转180度时,左侧位置仍然保持不变。

标尺的高度/宽度和顶部/左侧的值之间有关系吗?

Sub Measure()

Set sp = ActiveSheet.Shapes("Measurement")

Msgbox(sp.Top & "//" & sp.Left)

end sub

编辑:因此,我意识到我提到了很多有关程序的问题,真正的问题是,尽管左上角在屏幕上保持静止,但为什么左上角的测量值会发生变化?而且仅在270/90旋转时(会自动发生,具体取决于您拖动线条的方式)

添加屏幕截图(“测量”在顶部,然后在左侧) This is the first screen shot with a 270 rotation This is the second, notice the top left stayed stationary but the points changed 下一组旋转180/0(形状自动旋转,否则我将其锁定并完成)。 Rotated 180 first screen shot Rotated 180 second screen shot

2 个答案:

答案 0 :(得分:0)

我很同情您的问题识别,但我不理解这种现象,但是经过测试,即使旋转图形也似乎可以保留原始坐标。这是因为即使再次进行旋转,旋转也以原始坐标值进行。如果您人为地对齐位置,则坐标似乎会相应移动。我对其进行了如下测试。

Sub Measure()
Dim rngT As Range
Dim sp As Shape
Set sp = ActiveSheet.Shapes("Measurement")

'MsgBox (sp.Top & "//" & sp.Left)
Set rngT = Range("k" & Rows.Count).End(xlUp).Offset(1, 0)
rngT = sp.Top
rngT.Offset(, 1) = sp.Left
End Sub

Sub test()
    Dim sp As Shape
    Dim Ws As Worksheet
    Dim vDB
    Dim i As Integer, t As Single, l As Single
    Dim r As Integer
    vDB = Range("k2", Range("L" & Rows.Count).End(xlUp))

    Set Ws = ActiveSheet
    r = UBound(vDB, 1)
    For i = 1 To r
        t = vDB(i, 1)
        l = vDB(i, 2)
        Set sp = Ws.Shapes.AddShape(msoShapeRectangle, l, t, 10, 10)
    Next i


End Sub

答案 1 :(得分:0)

我知道了。

因此,在0或180方向上,Shape.top和Shape.Left可以提供精确一致的测量结果。

在90或270度,必须调整顶部和左侧以提供准确一致的测量结果。

代码是Shape.Top-(((Shape.Width-Shape.Height)/ 2)和Shape.Left +((Shape.Width-Shape.Height)/ 2)
(注意:仅当对象旋转90或270 // Shape.Rotation时,此调整才适用)

此外,这里使用的形状是弯头连接器