For...Next
声明中的变量是否必须具体可用(术语帮助?)
Dim ws As Worksheet
Set ws = ActiveSheet
For i = 10 To 13
ws.Shapes.Range(Array("Rectangle " & i + 24)).Height = 43.5
ws.Shapes.Range(Array("Rectangle " & i + 24)).Width = 43.5
ws.Shapes.Range(Array("Rectangle " & i + 24)).Top = 20.25
ws.Shapes.Range(Array("Rectangle " & i + 24)).Left = 20.25 + 44.5 * i
Next i
当我试图将Shape
声明为Object
时,我期待变量通过该对象,但似乎没有:
Dim ws As Worksheet
Dim shp1 As Object
Set ws = ActiveSheet
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
For i = 10 To 13
shp1.Height = 43.5
shp1.Width = 43.5
shp1.Top = 20.25
shp1.Left = 20.25 + 44.5 * i
Next i
我是否需要将Shape
声明为Array
或其他类型的Object
?
答案 0 :(得分:1)
您似乎从录制的宏中遗留了一些不必要的代码。仅当您一次选择多个形状时,才需要Range(Array(...))
功能。宏记录器包括这些,因为这比确定是否选择了多个单一形状更容易,而且只是略微多余。
由于您在.Left
属性的计算值中使用了渐进式 i ,因此您必须一次处理这些属性。我不知道如何将已更改的 i 值神奇地传递到计算出的.Left
值中,以换取各种形状,而无需循环使用它们并使用 i 在适当的时候适当的形状。
我不完全确定“通过Sub传递参数的意思,但我在子声明中包含了一个可选参数。
Sub Reshape1(Optional iRECT As Long = 10)
Dim i as long
For i = iRECT To 13
With ActiveSheet.Shapes("Rectangle " & i + 24)
.Height = 43.5
.Width = 43.5
.Top = 20.25
.Left = 20.25 + 44.5 * i
End With
Next i
End Sub
Sub Reshape2(Optional iRECT As Long = 10)
Dim i as long, shp As Object
For i = iRECT To 13
Set shp = ActiveSheet.Shapes("Rectangle " & i + 24)
With shp
.Height = 43.5
.Width = 43.5
.Top = 20.25
.Left = 20.25 + 44.5 * i
End With
Set shp = Nothing
Next i
End Sub
Sub Reshape()
Call Reshape1()
End Sub
我为您提供的问题提供了两种变体。希望你可以使用足够的这些来获得你想要的东西。
答案 1 :(得分:0)
在i
对象的赋值之后更改shp1
的值将对shp1
对象没有影响,即使对象已定义为变量i
。
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
For i = 10 To 13
对象在内存中创建为特定位置,分配给对象变量通过评估语句来建立此对象。稍后,更改像i
这样的变量将不会影响已创建的对象的实例。
在循环中设置shp1
对象:
For i = 10 to 13
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
...