变量存在于对象中

时间:2015-02-22 16:36:06

标签: vba excel-vba variables object shapes

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

2 个答案:

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

    ...