随机改变形状的位置
Shuffling the position of shape randomly
If AnswerOrder(0) = 1 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 218
ElseIf AnswerOrder(0) = 2 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 290
ElseIf AnswerOrder(0) = 3 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 361
ElseIf AnswerOrder(0) = 4 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 432
End If
If AnswerOrder(1) = 1 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 218
ElseIf AnswerOrder(1) = 2 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 290
ElseIf AnswerOrder(1) = 3 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 361
ElseIf AnswerOrder(1) = 4 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 432
End If
If AnswerOrder(2) = 1 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 218
ElseIf AnswerOrder(2) = 2 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 290
ElseIf AnswerOrder(2) = 3 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 361
ElseIf AnswerOrder(2) = 4 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 432
End If
If AnswerOrder(3) = 1 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 218
ElseIf AnswerOrder(3) = 2 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 290
ElseIf AnswerOrder(3) = 3 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 361
ElseIf AnswerOrder(3) = 4 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 432
End If
必须有更好的方法来执行这个宏而不是写这么多行。有什么建议吗?
上下文:我试图随机打乱幻灯片 3 中四个形状的顺序。我制作了一个名为 AnswerOrder
的数组,其中包含 1,2,3,4
。我打乱数组,然后执行上面的代码。
抱歉,我手边没有 PowerPoint,但我在 Excel 中写了一些示例代码,希望这有助于缩短代码并使其更易于维护。
想法是将设置形状位置的代码提取到单独的子例程中,并在主子例程中迭代 AnswerOrder 并在指定的形状上调用该子例程。
Public Sub set_shapePosition(determinant As Long, shp As Shape)
' can also put shp.Left = 303 here
Select Case determinant
Case 1
shp.Left = 303
shp.Top = 218
Case 2
shp.Left = 303
shp.Top = 290
Case 3
shp.Left = 303
shp.Top = 361
Case 4
shp.Left = 303
shp.Top = 432
End Select
' Also shape Top is around 71 pixels different to one and another,
' We can write below code for simpler implementation
' Getting rid of select case statement:
' shp.Top = 218 + 71 * (determinant - 1)
End Sub
Public Sub main()
' Define slide here.....
Set slide = ActivePresentation.Slides(3)
' ...Define and shuffle AnswerOrder here.......
'
' .............................................
For i = LBound(AnswerOrder) To UBound(AnswerOrder)
Call set_shapePosition(AnswerOrder(i), slide.Shapes("a" & i+1) )
Next i
End Sub
For j = 0 To 3
If AnswerOrder(j) = 1 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 218
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 2 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 288
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 3 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 363
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 4 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 432
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
End If
Next j
这使代码更整洁。
If AnswerOrder(0) = 1 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 218
ElseIf AnswerOrder(0) = 2 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 290
ElseIf AnswerOrder(0) = 3 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 361
ElseIf AnswerOrder(0) = 4 Then
ActivePresentation.Slides(3).Shapes("a1").Left = 303
ActivePresentation.Slides(3).Shapes("a1").Top = 432
End If
If AnswerOrder(1) = 1 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 218
ElseIf AnswerOrder(1) = 2 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 290
ElseIf AnswerOrder(1) = 3 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 361
ElseIf AnswerOrder(1) = 4 Then
ActivePresentation.Slides(3).Shapes("a2").Left = 303
ActivePresentation.Slides(3).Shapes("a2").Top = 432
End If
If AnswerOrder(2) = 1 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 218
ElseIf AnswerOrder(2) = 2 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 290
ElseIf AnswerOrder(2) = 3 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 361
ElseIf AnswerOrder(2) = 4 Then
ActivePresentation.Slides(3).Shapes("a3").Left = 303
ActivePresentation.Slides(3).Shapes("a3").Top = 432
End If
If AnswerOrder(3) = 1 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 218
ElseIf AnswerOrder(3) = 2 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 290
ElseIf AnswerOrder(3) = 3 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 361
ElseIf AnswerOrder(3) = 4 Then
ActivePresentation.Slides(3).Shapes("a4").Left = 303
ActivePresentation.Slides(3).Shapes("a4").Top = 432
End If
必须有更好的方法来执行这个宏而不是写这么多行。有什么建议吗?
上下文:我试图随机打乱幻灯片 3 中四个形状的顺序。我制作了一个名为 AnswerOrder
的数组,其中包含 1,2,3,4
。我打乱数组,然后执行上面的代码。
抱歉,我手边没有 PowerPoint,但我在 Excel 中写了一些示例代码,希望这有助于缩短代码并使其更易于维护。
想法是将设置形状位置的代码提取到单独的子例程中,并在主子例程中迭代 AnswerOrder 并在指定的形状上调用该子例程。
Public Sub set_shapePosition(determinant As Long, shp As Shape)
' can also put shp.Left = 303 here
Select Case determinant
Case 1
shp.Left = 303
shp.Top = 218
Case 2
shp.Left = 303
shp.Top = 290
Case 3
shp.Left = 303
shp.Top = 361
Case 4
shp.Left = 303
shp.Top = 432
End Select
' Also shape Top is around 71 pixels different to one and another,
' We can write below code for simpler implementation
' Getting rid of select case statement:
' shp.Top = 218 + 71 * (determinant - 1)
End Sub
Public Sub main()
' Define slide here.....
Set slide = ActivePresentation.Slides(3)
' ...Define and shuffle AnswerOrder here.......
'
' .............................................
For i = LBound(AnswerOrder) To UBound(AnswerOrder)
Call set_shapePosition(AnswerOrder(i), slide.Shapes("a" & i+1) )
Next i
End Sub
For j = 0 To 3
If AnswerOrder(j) = 1 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 218
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 2 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 288
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 3 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 363
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
ElseIf AnswerOrder(j) = 4 Then
ActivePresentation.Slides(3).Shapes("a" & j + 1).Top = 432
ActivePresentation.Slides(3).Shapes("a" & j + 1).Left = 303
End If
Next j
这使代码更整洁。