Как сделать мой код короче / эффективнее - PullRequest
0 голосов
/ 09 июля 2019

Я получаю сообщение «Слишком большая процедура ошибки» в макросе VBA в Excel.Он не такой большой, но, скорее всего, из-за того, что я новичок в кодировании и использую очень неэффективный способ сделать это.Я в основном перемещаю некоторые формы вокруг Excel, учитывая, что я изменяю определенную ячейку с формой.Вид созданной динамической диаграммы Ганта.Но есть слишком много цифр, цифры с именем "yx", где 1-10, а x 1-21.Я думаю, что я должен быть в состоянии использовать для циклов, чтобы сделать это, но я не уверен, как подойти к нему.

    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 голосов
/ 09 июля 2019

Попробуйте что-то вроде этого:

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

Называть методы нехорошо, но, поскольку я не знаю, что они делают, мне пришлось импровизировать.Я также не проверял это, но я надеюсь, что это передает идею

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...