如何使我的代码更短/更高效

时间:2019-07-08 21:41:51

标签: excel vba

我在Excel的VBA宏中遇到“获取错误过程太大”的问题。它不是那么大,但是很可能是由于我是编码新手并且使用效率很低的方式来完成编码。如果我用形状修改了某个单元格,则基本上围绕Excel移动了一些形状。创建了一个动态甘特图。但是有太多数字,名为“ y.x”的数字,其中y是1-10,x是1-21。我认为我应该能够使用for循环来做到这一点,但是我不确定如何实现。

    With ActiveSheet.Shapes.Range(Array("Pentagon 1.1"))
    If Not Intersect(Target, Range("CL5")) Is Nothing Then
            .Visible = True
            .Left = ActiveCell.Offset(0, 26)
            .Top = ActiveCell.Offset(-4, 0)
        Else
    End If
End With
With ActiveSheet.Shapes.Range(Array("Pentagon 1.2"))
    If Not Intersect(Target, Range("CM5")) Is Nothing Then
            .Visible = True
            .Left = ActiveCell.Offset(0, 26)
            .Top = ActiveCell.Offset(-4, 0)
        Else
    End If
End With
    With ActiveSheet.Shapes.Range(Array("Pentagon 1.3"))
    If Not Intersect(Target, Range("CN5")) Is Nothing Then
            .Visible = True
            .Left = ActiveCell.Offset(0, 26)
            .Top = ActiveCell.Offset(-4, 0)
        Else
    End If
    End With

这完美地达到了预期的效果,只是在x个数字之后,代码变得太大,并且出现错误。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

Sub MoveSomeShapes()
    DisplayShape "Pentagon 1.1", Range("CL5")
    DisplayShape "Pentagon 1.2", Range("CM5")
    DisplayShape "Pentagon 1.3", Range("CN5")
End Sub

Sub DisplayShape(ShapeName As String, TargetCell As Range)
    With ActiveSheet.Shapes.Range(Array(ShapeName))
        If Not Intersect(Target, TargetCell) Is Nothing Then
            .Visible = True
            .Left = ActiveCell.Offset(0, 26)
            .Top = ActiveCell.Offset(-4, 0)
        End If
    End With
End Sub

这些方法的命名不好,但是由于我不知道它们在做什么,所以我不得不即兴创作。我也没有测试过,但我希望它能传达出这个想法