Excel 2016 VBA - Создание инструментальной панели с большей эффективностью - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я работаю над созданием панели мониторинга в Excel 2016 с использованием VBA и макросов. В основном это включает в себя выбор кнопок на одном листе для отображения / скрытия различных элементов диаграммы, источники данных которых будут связаны с другим листом. Пока все идет хорошо, но я столкнулся с проблемами эффективности. Первая проблема связана с группировкой объектов, а вторая связана с повторением кода VBA.

1) Есть ли способ перекрестной группировки объектов формы? Сейчас кажется, что мне нужно создать дубликаты для объектов, которые не будут видны, и для которых каждая родительская группа объектов будет скрыта. К сожалению, я не могу найти способ Excel для перекрестной группы. Поэтому, если я хочу группу A и B и группу A и C, у меня может быть только одна группа (A & B или A & C, но не обе). Это заставляет меня дублировать объекты, поэтому у меня есть одна пара для A & B и другая для A & C. Проблема в том, что это может стать довольно утомительным и кошмаром в правильной организации моих объектов, когда я получаю несколько кнопок и подразделов панели управления.

2) Может кто-нибудь посоветовать, как сделать следующий код более эффективным, чтобы не повторять код? Он в основном выделяет группу фигур, которые должны отображаться и скрываться в зависимости от того, какая кнопка нажата. Но сейчас я должен написать все группы, которые должны оставаться видимыми и скрытыми. Ниже приведен пример кода. Пожалуйста, посмотрите аргументы Истина и Ложь ниже, чтобы понять, в чем проблема:

   Sub Pic_1_SA_click()
   ActiveSheet.Shapes("Group 23").Visible = True
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_1_SB_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = True
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_2_SA_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = True
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_2_SB_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = True
   End Sub

Будем весьма благодарны за любые рекомендации по этим двум вопросам. Спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Я должен сделать простой рефакторинг кода

Sub Pic_SA_click(ByVal sShapeName As String)
    If (sShapeName = vbNullString) Then Exit Sub

    Dim oShp As Shape, s As Shape
    Set oShp = ActiveSheet.Shapes(sShapeName)
    If (oShp Is Nothing) Then Exit Sub
    oShp.Visible = True
    With ActiveSheet
        For Each s In .Shapes
            If (s.Name <> oShp.Name) Then
                s.Visible = False
            End If
        Next s
    End With
End Sub

Sub Pic_1_SA_click()
    call Pic_SA_click("Group 23")
end sub 

Sub Pic_1_SB_click()
    call Pic_SA_click("Group 71")
End Sub

Sub Pic_2_SA_click()
    call Pic_SA_click("Group 19")
End Sub

Sub Pic_2_SB_click()
    call Pic_SA_click("Group 20")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...