Почему мой макрос со списком не работает, когда диапазон ввода - строка? - PullRequest
0 голосов
/ 23 октября 2018

Я хочу, чтобы разные макросы запускались, когда в моем списке Excel выбраны разные элементы.Это прекрасно работает, когда диапазон ввода представляет собой целое число (см. Код VBA ниже).

Sub Hide_Charts_Combobox()
'
' Hide_Charts_Combobox
'
    Dim X As ControlFormat
    Set X = ActiveSheet.Shapes("Drop Down 95").ControlFormat
    If X = 1 Then
    Hide_Matrix
    ElseIf X = 2 Then
    Hide_Radar
    ElseIf X = 3 Then
    Hide_Goal_Ranks
    ElseIf X = 4 Then
    Hide_Goal_Ranks_bd
    ElseIf X = 5 Then
    Hide_KPI_Values
    ElseIf X = 6 Then
    Hide_Goal_Ratio
    ElseIf X = 7 Then
    Hide_KPI_Ratio
    ElseIf X = 8 Then
    Hide_Unitized_Ratio
    End If
'
End Sub

Однако я не хочу, чтобы мой диапазон ввода в выпадающем списке был числом;Я хочу определенные слова вместо этого.Когда я заменяю входные данные строками, макрос просто не запускается (ошибок тоже не возникает).Это фактический код, который я хочу использовать (и который в настоящее время не работает):

Sub Hide_Charts_Combobox()
'
' Hide_Charts_Combobox
'
    Dim X As ControlFormat
    Set X = ActiveSheet.Shapes("Drop Down 95").ControlFormat
    If X = Matrix Then
    Hide_Matrix
    ElseIf X = Radar Then
    Hide_Radar
    ElseIf X = Goal Ranks Then
    Hide_Goal_Ranks
    ElseIf X = Goal Breakdown Then
    Hide_Goal_Ranks_bd
    ElseIf X = KPI Values Then
    Hide_KPI_Values
    ElseIf X = Goal Ratios Then
    Hide_Goal_Ratio
    ElseIf X = KPI Ratios Then
    Hide_KPI_Ratio
    ElseIf X = Unitized Ratios Then
    Hide_Unitized_Ratio
    End If
'
End Sub

Я подозреваю, что это как-то связано с тем, что Dim X определяется как ControlFormat, который не может содержать строку, но яЯ не уверен.Что я должен сделать, чтобы это работало?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я очень не хочу добавлять новый ответ, когда Гэри хорошо его подытожил, но просто чтобы добавить еще один вариант ради улучшения читабельности, Select Case будет хорошо работать здесь.

Select Case X
Case "Matrix"
    Hide_Matrix
Case "Radar"
    Hide_Radar
Case "Goal Ranks"
    Hide_Goal_Ranks
Case "Goal Breakdown"
    Hide_Goal_Ranks_bd
Case "KPI Values"
    Hide_KPI_Values
Case "Goal Ratios"
    Hide_Goal_Ratio
Case "KPI Ratios"
    Hide_KPI_Ratio
Case "Unitized Ratios"
    Hide_Unitized_Ratio
End Select

Select Caseхорошо работает для удобочитаемости, потому что вы сравниваете ту же переменную , где вы можете быстро собрать данные, посмотрев на случай, когда каждый из них ссылается на x.

в операторе If...ThenВы должны читать построчно, что заставляет вас читать больше, а также увеличивает вероятность ошибок.

0 голосов
/ 23 октября 2018

вы можете использовать Application.Run метод и передать его с выбранным суб-именем, взятым из выпадающего списка диапазон ввода (полученный из свойства ControlFormat ListFillRange) выбранной ячейки (полученный из ControlFormat ListIndex свойство):

Sub Hide_Charts_Combobox()
    Dim X As ControlFormat
    Set X = ActiveSheet.Shapes("Drop Down 95").ControlFormat

    Application.Run "Hide_" & Range(X.ListFillRange).Offset(X.ListIndex - 1).Resize(1).Value
End Sub
0 голосов
/ 23 октября 2018

Заменить:

 If X = Matrix Then

на

 If X = "Matrix" Then

и т. Д.

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