2016-03-30 3 views
0

Мой вопрос может быть очень глупым. но я хотел бы знать, возможно ли это и как? с одной из функций \ sub может i создать еще одну функцию.Добавить функцию Sub из другой функции sub

Пример:

Sub first() 
    x = 10 
    if x = 10 Then 
     'Add Another Sub based on the Condition in another module. 
     Sub Second() 
     End Sub 
    End If 
End Sub 

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

+0

См. Здесь http://www.cpearson.com/excel/vbe.aspx о том, как программировать код в VBA –

+0

. Запись через VBE увлекательна, но я бы избегал этого, если возможно. если функция кнопки уже известна во время разработки, вы можете ее закодировать и назначить каждому свойству действия кнопки с полной ссылкой (см. ниже), поскольку субтитры можно вызывать, даже если они находятся в разных книгах. у вас есть два пути: либо добавив лист «target» (где находится кнопка) ссылку на «базовую» книгу (где находится функция), либо с помощью метода «Run» («Application.Run» «BaseMacrosSheet.xlsm «!Имя_макроса»). Первый не требует, чтобы «базовая» книга была открыта во время выполнения, в то время как последняя делает. – user3598756

ответ

2

По умолчанию, мой подход был бы:

Sub first() 
    x = 10 
    if x = 10 Then 
     'Call Another Sub based on the Condition. 
     Call Second() 
    End If 
End Sub 

Sub Second() 
' do stuff 
End Sub 

При создании новых листов и добавление кнопок с кодом за ними, весь код, кнопки дизайна и т.д. должно быть сделано. Любая настройка будет через параметры.

0

Это больше дизайн вашего кода. Во-первых, вы не можете поместить sub внутри другого суб, это не так, как это работает, к сожалению.

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


Самый простой и рекомендуемый метод является просто писать другим подразделам так или иначе, но только вызов это, если определенное условие.

Public Sub Main_Sub() 

Dim x As Integer 

x = 11 '// Change x to 5 and the other sub won't run 

If x > 10 Then 
    Other_Sub 
    '// Code execution will resume here once 'Other_Sub' has finished 
    MsgBox "Other Sub complete!" 
End If 

End Sub 

Private Sub Other_Sub() 

    MsgBox "You're in the other sub now!" 

End Sub 

Другой способ просто выйти подлодку, если ваше условие не выполняется, хотя используется больше для обработки ошибок, чем условное исполнение:

Public Sub Main_Sub() 

Dim x As Integer 

x = 11 '// Change x to 5 and the other sub won't run 

If x > 10 Then 
    Other_Sub 
    '// Code execution will resume here once 'Other_Sub' has finished 
    MsgBox "Other Sub complete!" 
Else 
    Exit Sub 
End If 

MsgBox "You will only see this message if x was greater than 10!" 

End Sub 

Private Sub Other_Sub() 

    MsgBox "You're in the other sub now!" 

End Sub 

Один окончательного метод может использовать метки, и хотя это жизнеспособное решение, я рекомендую это, потому что это сильно влияет на читаемость и логику вашего кода:

Public Sub Main_Sub() 

Dim x As Integer 

x = 11 '// Change x to 5 and the other sub won't run 

If x < 11 Then GoTo Skip_Other_Sub: 

Other_Sub 

Skip_Other_Sub: 

MsgBox "You will see this regardless of the other sub being run!" 

End Sub 

Private Sub Other_Sub() 

    MsgBox "You're in the other sub now!" 

End Sub 

Основным моментом здесь является то, что лучше писать все кода, которые могут или не могут быть необходимы и назвать его условно, а не пытаться создать код «на лету», который является грязным в лучше всего и требует программного доступа к VBE, который может оставить ваш компьютер уязвимым, если вы не на 100% уверены в том, что делаете.

Смежные вопросы