对齐形状 flush/stacked/touching
Align shapes flush/stacked/touching
我正在尝试按从右到左的顺序获取 selection 形状。我在 vbaexpress 上找到了 John Wilson 的例程,我的代码基于该例程。
当我 select 通过单击形状逐项进行排序时,排序工作完美,但如果我 select 通过“套索”它们,它不尊重形状的“可见顺序”我的鼠标。
如果将我的鼠标拖到形状上 select,例程应遵守形状的可见顺序。
提前致谢。
Sub AlignFlush()
Dim oshpR As ShapeRange
Dim oshp As Shape
Dim L As Long
Dim rayPOS() As Single
Set oshpR = ActiveWindow.Selection.ShapeRange
ReDim rayPOS(1 To oshpR.Count)
'add to array
For L = 1 To oshpR.Count
rayPOS(L) = oshpR(L).Left
Next L
'sort
Call sortray(rayPOS)
'apply
For L = 1 To oshpR.Count
If L = 1 Then
Set oshp = Windows(1).Selection.ShapeRange(1)
PosTop = oshp.Top
PosNext = oshp.Left + oshp.Width
Else
Set oshp = Windows(1).Selection.ShapeRange(L)
oshp.Top = PosTop
oshp.Left = PosNext
PosNext = oshp.Left + oshp.Width
End If
Next L
End Sub
Sub sortray(ArrayIn As Variant)
Dim b_Cont As Boolean
Dim lngCount As Long
Dim vSwap As Long
Do
b_Cont = False
For lngCount = LBound(ArrayIn) To UBound(ArrayIn) - 1
If ArrayIn(lngCount) > ArrayIn(lngCount + 1) Then
vSwap = ArrayIn(lngCount)
ArrayIn(lngCount) = ArrayIn(lngCount + 1)
ArrayIn(lngCount + 1) = vSwap
b_Cont = True
End If
Next lngCount
Loop Until Not b_Cont
结束子
对您现有代码的一些评论:
数组计数始终从 0 开始,除非您使用 Option Base statement 将其设置为不同的数字。
当你使用 ReDim 时,大多数时候,你想要使用 Preserve 关键字,否则 ReDim 会抹掉现有的数组内容。但是在这种情况下,我们提前知道了数组的大小,所以Preserve是没有必要的。
您致电 sortray,但未将其包含在您的列表中。我添加了一个排序程序。
但是你在放置形状的部分没有使用排序数组。
工作宏(根据您对“可见顺序”是 left-to-right 序列的含义的描述):
由于您使用最左侧形状的左侧位置来应用到其他形状,这里有一个更简单的方法:
Sub AlignFlushLeftWithLeftmostShape()
Dim ShpCount As Long
Dim oshpR As ShapeRange
Dim L As Long
Dim rayPOS() As Single
Set oshpR = ActiveWindow.Selection.ShapeRange
ShpCount = oshpR.Count
ReDim rayPOS(ShpCount - 1)
For L = 0 To ShpCount - 1
rayPOS(L) = oshpR(L + 1).Left
Next L
Call BubbleSort(rayPOS)
For x = 1 To ShpCount
oshpR(x).Left = rayPOS(0)
Next x
End Sub
Sub BubbleSort(arr)
Dim lTemp As Long
Dim i As Long
Dim j As Long
Dim lngMin As Long
Dim lngMax As Long
lngMin = LBound(arr)
lngMax = UBound(arr)
For i = lngMin To lngMax - 1
For j = i + 1 To lngMax
If arr(i) > arr(j) Then
lTemp = arr(i)
arr(i) = arr(j)
arr(j) = lTemp
End If
Next j
Next i
End Sub
我正在尝试按从右到左的顺序获取 selection 形状。我在 vbaexpress 上找到了 John Wilson 的例程,我的代码基于该例程。
当我 select 通过单击形状逐项进行排序时,排序工作完美,但如果我 select 通过“套索”它们,它不尊重形状的“可见顺序”我的鼠标。
如果将我的鼠标拖到形状上 select,例程应遵守形状的可见顺序。
提前致谢。
Sub AlignFlush()
Dim oshpR As ShapeRange
Dim oshp As Shape
Dim L As Long
Dim rayPOS() As Single
Set oshpR = ActiveWindow.Selection.ShapeRange
ReDim rayPOS(1 To oshpR.Count)
'add to array
For L = 1 To oshpR.Count
rayPOS(L) = oshpR(L).Left
Next L
'sort
Call sortray(rayPOS)
'apply
For L = 1 To oshpR.Count
If L = 1 Then
Set oshp = Windows(1).Selection.ShapeRange(1)
PosTop = oshp.Top
PosNext = oshp.Left + oshp.Width
Else
Set oshp = Windows(1).Selection.ShapeRange(L)
oshp.Top = PosTop
oshp.Left = PosNext
PosNext = oshp.Left + oshp.Width
End If
Next L
End Sub
Sub sortray(ArrayIn As Variant)
Dim b_Cont As Boolean
Dim lngCount As Long
Dim vSwap As Long
Do
b_Cont = False
For lngCount = LBound(ArrayIn) To UBound(ArrayIn) - 1
If ArrayIn(lngCount) > ArrayIn(lngCount + 1) Then
vSwap = ArrayIn(lngCount)
ArrayIn(lngCount) = ArrayIn(lngCount + 1)
ArrayIn(lngCount + 1) = vSwap
b_Cont = True
End If
Next lngCount
Loop Until Not b_Cont
结束子
对您现有代码的一些评论:
数组计数始终从 0 开始,除非您使用 Option Base statement 将其设置为不同的数字。
当你使用 ReDim 时,大多数时候,你想要使用 Preserve 关键字,否则 ReDim 会抹掉现有的数组内容。但是在这种情况下,我们提前知道了数组的大小,所以Preserve是没有必要的。
您致电 sortray,但未将其包含在您的列表中。我添加了一个排序程序。
但是你在放置形状的部分没有使用排序数组。
工作宏(根据您对“可见顺序”是 left-to-right 序列的含义的描述):
由于您使用最左侧形状的左侧位置来应用到其他形状,这里有一个更简单的方法:
Sub AlignFlushLeftWithLeftmostShape()
Dim ShpCount As Long
Dim oshpR As ShapeRange
Dim L As Long
Dim rayPOS() As Single
Set oshpR = ActiveWindow.Selection.ShapeRange
ShpCount = oshpR.Count
ReDim rayPOS(ShpCount - 1)
For L = 0 To ShpCount - 1
rayPOS(L) = oshpR(L + 1).Left
Next L
Call BubbleSort(rayPOS)
For x = 1 To ShpCount
oshpR(x).Left = rayPOS(0)
Next x
End Sub
Sub BubbleSort(arr)
Dim lTemp As Long
Dim i As Long
Dim j As Long
Dim lngMin As Long
Dim lngMax As Long
lngMin = LBound(arr)
lngMax = UBound(arr)
For i = lngMin To lngMax - 1
For j = i + 1 To lngMax
If arr(i) > arr(j) Then
lTemp = arr(i)
arr(i) = arr(j)
arr(j) = lTemp
End If
Next j
Next i
End Sub