Создание цикла для замены нескольких вложенных операторов if при работе с группами объектов в Excel - PullRequest
0 голосов
/ 12 июня 2019

Я не уверен, как оптимизировать код, прикрепленный ниже, в какую-то форму цикла, и я надеюсь, что кто-то сможет проиллюстрировать, как лучше всего справиться с этим.

По сути, я унаследовал электронную таблицу с несколькими модулями VBA, записанными с устройства записи макросов и / или написанными кем-то, не имеющим опыта работы с VBA, и он работает очень медленно.Я проходил и сокращал множество избыточных секций типа 'nested if' в циклы for, пытаясь оптимизировать и ускорить процесс, однако я также очень неопытен и на самом деле сам не кодер, как вы, наверное, догадались!

If Range("Link1").Value = "" Then
    Application.CutCopyMode = False

    GoTo Finale:
Else

If Range("Link2").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1")).Select
    Selection.Copy
Else

If Range("Link3").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Select
    Selection.Copy
Else

If Range("Link4").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3")).Select
    Selection.Copy
Else

If Range("Link5").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4")).Select
    Selection.Copy
Else

If Range("Link6").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5")).Select
    Selection.Copy
Else

If Range("Link7").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6")).Select
    Selection.Copy
Else

If Range("Link8").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7")).Select
    Selection.Copy
Else

    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8")).Select
    Selection.Copy

End If

End If

End If

End If

End If

End If

End If

End If

Код имеет дело с копированием 8 групп «вещей» (в данном случае каждая содержит текстовые поля и графику) и проверяет, была ли заполнена ссылка, копируя предыдущие группы, когда находитненаселенная ссылка.Следовательно, идея заключается в том, что копируются только населенные группы.

Второй вопрос, касающийся всего этого, заключается в том, что, когда у вас есть несколько операторов if, подобных этому, действительно ли это значительно быстрее или более оптимально сводить такие вещи в циклы, или я должен искать другое место для дальнейшей оптимизации электронной таблицы?Превращать длинные отрывки рекурсивного кода в минимальные циклы, безусловно, приятно (!), Но я не знаю, действительно ли это нужно делать для повышения скорости и стабильности, или это действительно мало что дает.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

или просто используйте Select Case

Application.ScreenUpdating = False
Select Case Range("Links").Value
        Case "1": ActiveSheet.Shapes.Range(Array("Group1")).Group.Copy
        Case "2": ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Group.Copy
        Case "3": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3")).Group.Copy
        Case "4": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4")).Group.Copy
        Case "5": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5")).Group.Copy
        Case "6": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6")).Group.Copy
        Case Else: Application.CutCopyMode = False: GoTo Finale
    End Select
Application.ScreenUpdating = True

, где

Range("Links").Value - это только одна ячейка, в которой вы вводите предпочтительное число

0 голосов
/ 12 июня 2019

Трудно сказать, что ваш код делает по тому, что вы предоставляете, но есть несколько способов сделать хотя бы эту часть более эффективной.

Первое - использовать конструкцию ElseIf.Это избавляет вас от необходимости делать много вложенных операторов if.

Во-вторых, вы по возможности избегаете использования Select.

Вот пример того, что вы можете сделать для рефакторинга вашего кода:

If Range("Link2").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1")).Copy
ElseIf Range("Link3").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Copy
Elseif ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...