对象中存在的变量

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))

    ...