对象中存在的变量
Variable present in an object
变量是否必须在 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
?
您似乎在录制的宏中残留了一些不必要的代码。 Range(Array(...))
函数仅在您一次选择多个形状时才需要。宏记录器包括这些,因为这比确定是否选择了多个形状更容易,而且它只是略微多余。
由于您在 .Left
属性 的计算值中使用渐进式 i,您将不得不一次处理这些.我不知道如何神奇地将更改后的 i 值传递给不同形状的计算 .Left
值,而无需循环遍历它们并使用 i 在适当的时间出现在适当的形状上。
我不完全确定你所说的 "pass an Argument through the Sub" 是什么意思,但我已经在 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
我已经根据您在问题中提供的内容提供了两种变体。希望您可以使用足够多的这些来达到您的目的。
在 分配给 shp1
对象后更改 i
的值将不会影响 shp1
对象,即使该对象是用变量 i
定义的。
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
For i = 10 To 13
对象被创建为内存中的一个特定位置,通过evaluating语句赋值给对象变量来创建这个对象。稍后,更改 i
之类的变量将不会影响已创建的对象的实例。
在循环中设置shp1
对象:
For i = 10 to 13
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
...
变量是否必须在 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
?
您似乎在录制的宏中残留了一些不必要的代码。 Range(Array(...))
函数仅在您一次选择多个形状时才需要。宏记录器包括这些,因为这比确定是否选择了多个形状更容易,而且它只是略微多余。
由于您在 .Left
属性 的计算值中使用渐进式 i,您将不得不一次处理这些.我不知道如何神奇地将更改后的 i 值传递给不同形状的计算 .Left
值,而无需循环遍历它们并使用 i 在适当的时间出现在适当的形状上。
我不完全确定你所说的 "pass an Argument through the Sub" 是什么意思,但我已经在 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
我已经根据您在问题中提供的内容提供了两种变体。希望您可以使用足够多的这些来达到您的目的。
在 分配给 shp1
对象后更改 i
的值将不会影响 shp1
对象,即使该对象是用变量 i
定义的。
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
For i = 10 To 13
对象被创建为内存中的一个特定位置,通过evaluating语句赋值给对象变量来创建这个对象。稍后,更改 i
之类的变量将不会影响已创建的对象的实例。
在循环中设置shp1
对象:
For i = 10 to 13
Set shp1 = ws.Shapes.Range(Array("Rectangle " & i + 24))
...