Microsoft Excel 2010自动形状“调整”属性(msoShapeTrapezoid)

时间:2012-08-23 12:25:31

标签: excel-vba excel-2010 vba excel

是否有可用的参考资料详细说明每个“adjustment property”对 Excel 2010 中提供的各种自选图形对象的作用?

我的具体问题是我以编程方式将msoShapeTrapezoid自动形状插入到工作表中:

.AddShape(msoShapeTrapezoid, Left, Top, Width, Height)

...定义了梯形的矩形范围。然后我试图使用:

shpTrapezoid.Adjustments(1) = ValueX

设置梯形顶部的大小(相当于我手动调整自动形状上的单个手柄),但我无法弄清楚这个调整属性代表什么(虽然我已经想出了一个值0使梯形成为矩形。

所以我知道了梯形底部的大小,梯形顶部的大小和我想绘制的梯形的高度(并且它是对称的), ValueX必须具备什么要在屏幕上正确定义它吗?

4 个答案:

答案 0 :(得分:0)

首先,抱歉我的英语不好......

我在几个小时内一直在努力解决这个问题,我发现msoShapeTrapezoid的调整是一个系数,如果宽度小于高度或高度,必须乘以表格的宽度如果高度小于宽度,则为形式。

这也解释了为什么这种调整可以大于0.5(如果形状的高度小于其宽度,则调整可以大于0.5:最大值是宽度除以高度,但在另一种情况下最大值是值是0.5)。

因此,如果你想画一个梯形,调整必须像这样计算:将梯形的顶部减去底部,除以结果2,如果高度为高,则将新结果除以梯形的高度。在另一种情况下,小于宽度或宽度。

这也适用于msoShapeParallelogramm;调整必须乘以Min(宽度;高度)。

这些自选形状中存在很多小错误...(例如,msoShapeRegularPentagone不是正五边形...但是基数是通过将形式的宽度乘以黄金比率减去1来计算的。位于表格左侧和右侧的点的“高程”也等于GoldenRation减1乘以表格的宽度:结果接近正五边形,但不是)

答案 1 :(得分:0)

我知道这是一个老线程,但它与我目前的项目有关,我想我会投入我找到的解决方案 - 对于我的项目,我想定义Width,Height和TopWidth。这样,传递给调整属性的值是:

shpTrapezoid.Adjustments(1) = (Width - TopWidth)/(2 * Height)

无论哪个更大(高度或宽度)都应该可以工作,因为可能你的TopWidth总是正面的。

答案 2 :(得分:0)

缺少有关此主题的AutoShape特定文档,这令人失望,对吗?更令人沮丧的是:“自选图形”的各种.Adjustments的值没有出现在“本地”窗口中;我们唯一可以看到的有用信息是.Count

这使我编写了以下实用程序子目录,每当研究其他自选图形时,我都会不断添加该子目录。

'Usage: select AutoShape in question then run this...
Sub AutoShapeAdjustments()
    Dim ii As Integer
    Dim SHP As Shape
    Set SHP = Selection.ShapeRange(1)

    With SHP
        For ii = 1 To .Adjustments.Count
            Debug.Print "Adj# " & ii & " ="; .Adjustments(ii)
        Next ii

        Stop 'to review IW contents & update/add to `Select Case` block

        Select Case .AutoShapeType

        Case msoShapeArc
            .Adjustments(1) = 135 'tail angle; CW from 0 = east
            .Adjustments(2) = 45 'arrow angle
        Case msoShapeCircularArrow
            .Adjustments(1) = 0.1 'arrow throat thickness (1 & 3 share a handle)
            .Adjustments(2) = 15 'arrow head length
            .Adjustments(3) = 45 'revolution angle, arrow; CW from 0 = east
            .Adjustments(4) = 135 'revolution angle, tail
            .Adjustments(5) = 0.1 'arrow head width excl. throat
        Case msoShapeDownArrow, msoShapeUpArrow, msoShapeRightArrow, msoShapeLeftArrow
            .Adjustments(1) = 0.5 'arrow throat thickness
            .Adjustments(2) = 0.5 'arrow head length

        End Select
    End With

    If MsgBox("Clear Immediate Window?", vbYesNo + vbDefaultButton2) = vbYes Then
        Application.SendKeys "^g ^a {BACKSPACE}"
    Else
        Debug.Print "--------------------"
    End If

End Sub

我运行了几次,以找出并记下每个.Adjustment的工作。然后,一旦我微调了一组值,就将它们粘贴到我正在处理的代码中。

答案 3 :(得分:0)

以防将来对任何人有帮助,这是我添加梯形的方法

Function AddTrapezoid(wks As Worksheet, sglCentre As Single, sglTop As Single, _
        sglWidthTop As Single, sglWidthBottom As Single, sglHeight As Single) As Shape
    Set AddTrapezoid = wks.Shapes.AddShape(msoShapeTrapezoid, sglCentre - sglWidthBottom / 2, _
            sglTop, sglWidthBottom, sglHeight)
    AddTrapezoid.Adjustments.Item(1) = (sglWidthBottom - sglWidthTop) / 2# / _
            IIf(sglHeight < sglWidthBottom, sglHeight, sglWidthBottom)
End Function

无论高度或宽度最大,这都适用,与@sherco40 提供的答案相匹配