首页 > 解决方案 > 使用 VBA 优化 PowerPoint 中的标注矩形位置

问题描述

我在 PowerPoint 幻灯片上生成了许多圆圈。它们的位置是固定的(即它们不能四处移动)。然后我将它们连接到我在幻灯片右侧对齐的标注矩形。伪代码如下:

  1. 为圆生成一个circle(1 to x, 1 to 3)数组,其中维度“1”是圆,.Name维度“2”是圆.Top,维度“3”是圆.Left
  2. 按维度 2对数组重新circle(1 to x, 1 to 3)排序(即按 .Top 对圆进行排序)
  3. 循环遍历数组并为每个圆圈生成一个关联的矩形,然后我以编程方式将它们布置到幻灯片右侧的所需高度和位置。
  4. 用 . 将圆圈连接到它们对应的矩形msoConnectorElbow。如果矩形和圆形之间只有很小的shape.Top差异,那么我将它们与msoConnectorStraight.

结果比较满意。请参阅下面粘贴的图像。 在此处输入图像描述

问题。正如你将看到的,一些msoConnectorElbow碰撞(例如前三个圆圈)。我的问题如下:我应该如何对圆圈进行排序以使其msoConnectorElbow不再发生碰撞?显然我需要一个优化算法。我最初的想法是将数组分成两部分(例如,确定“中间”圆),然后一次又一次地遍历数组的每一位,这样肘部就不会发生碰撞。

数组前“一半”的伪代码看起来像这样(抱歉,它有点 hacky 并且依赖于辅助数组):

Pivot = UBound(countries) / 2

For i = 1 To Pivot - 1
    For z = i + 1 To Pivot

    If (circles(i, 2) - circles(z, 2)) < 0 And (circles(i, 3) - circles(z, 3)) > 0 Then

    'switch the two circles in a 'helper array'
    final_array(z, 1) = circles(i, 1)
    final_array(z, 2) = circles(i, 2)
    final_array(z, 3) = circles(i, 3)
    final_array(i, 1) = circles(z, 1)
    final_array(i, 2) = circles(z, 2)
    final_array(i, 3) = circles(z, 3)

    'amend the original array
    circles(z, 1) = final_array(i, 1)
    circles(z, 2) = final_array(i, 2)
    circles(z, 3) = final_array(i, 3)
    circles(i, 1) = final_array(z, 1)
    circles(i, 2) = final_array(z, 2)
    circles(i, 3) = final_array(z, 3)

    End If

    Next
Next

当我运行到完成时最终会发生什么是按水平尺寸对圆圈进行完全重新排序......最终可能会产生更多碰撞的肘部连接器等。

解决我的问题并正确排序我的数组以优化矩形放置的合适算法是什么?

标签: arraysvbaalgorithmsortingpowerpoint

解决方案


我认为如果允许您更改线条连接到点的顺序,您基本上可以避免碰撞。

继续寻找最右边的点并将其连接到它最接近的盒子中心(就绝对上/下距离而言)并重复。

在此处输入图像描述

对不起,图表很乱,我必须用油漆来做!


推荐阅读