2016-05-05 1 views
0

У меня есть пользовательская форма, которая имеет список имен листов в книге и имеет три кнопки: один удаляет все листы, выбранные в списке, просто удаляет эти листы, а другой удаляет диаграммы с этого листа. Я в настоящее время есть три суб функции, которые выглядят почти идентично, так как каждый раз проходит один субфункцию на петле, на основе выбранной кнопки:Передача имени подфункции в качестве аргумента в функции

Sub DeleteSheets() 'Removes sheets selected by user in ListBox 

    For k = 0 To sheetNameListBox.ListCount - 1  
    If sheetNameListBox.Selected(k) = True Then  
     DeleteSheet sheetNameListBox.List(k)   
    End If 
    Next k 

End Sub 

Sub ClearSheets() 'Clears sheets selected by user in ListBox 

    For k = 0 To sheetNameListBox.ListCount - 1  
    If sheetNameListBox.Selected(k) = True Then  
     ClearSheet sheetNameListBox.List(k)    
    End If 
    Next k 

End Sub 

Sub DeleteCharts() 'Removes charts from sheets selected by user 

    For k = 0 To sheetNameListBox.ListCount - 1 
    If sheetNameListBox.Selected(k) = True Then 
     DeleteChart sheetNameListBox.List(k)   
    End If 
    Next k 

End Sub 

Чтобы решить эту проблему, я решил разработать подфункции, как это:

Sub RemoveSheetData(removeType As String) 

     For k = 0 To sheetNameListBox.ListCount - 1 
     If sheetNameListBox.Selected(k) = True Then 
      If removeType = "DeleteSheet" Then DeleteSheet sheetNameListBox.List(k) 
      If removeType = "ClearSheet" Then ClearSheet sheetNameListBox.List(k) 
      If removeType = "DeleteChart" Then DeleteChart sheetNameListBox.List(k) 
     End If 
     Next k 

End Sub 

Это, похоже, также неэффективно, поскольку у меня должно быть три случая для каждого. Есть ли способ, которым я могу напрямую ввести имя функции, которую я хочу вызвать, и запустить ее?

ответ

3

Вот ответ явно украдена из here

Sub test() 
    Dim ftnName As String 
    Dim argument As String 
    Dim result As String 

    ftnName = "myFunction" 
    argument = "cat" 

    result = Application.Run(ftnName, argument) 

    MsgBox result 
End Sub 

Function myFunction(inString As String) As String 
    myFunction = inString & " has " & Len(inString) & " letters." 
End Function 
Смежные вопросы