2017-02-08 3 views
2

В Access, используя VBA, я хочу использовать Application.Run и улавливать любые ошибки. К сожалению, Application.Run, похоже, захватывает ловушку ошибок. Есть ли способ исправить это?Application.Run with Error Trapping

On Error Resume Next 
Application.Run ... 

Я никогда не пройти Application.Run на ошибку, даже если я указываю On Error Resume Next или On Error GoTo ErrCatch. Моя настройка захвата ошибки игнорируется.

+2

Это потому, что 'Application.Run' в основном то же самое, что и внешний вызов. Что вы используете * для *? Возможно, есть обход. – Comintern

+0

Если это относительно небольшой список подпрограмм, которые могут быть запущены, вы можете использовать конструкцию выборочного шкафа, в которой различные случаи назовут непосредственно подводы –

+0

Спасибо за ваши ответы. Он должен быть более гибким, чем конструкция в виде шкафа. – someprogrammer

ответ

5

Если процедура вы вызываете внутри вашего проекта VBA, то вы можете просто вызвать процедуру непосредственно:

Sub Foo() 
    'Application.Run "SomeProc" 
    SomeProc 
End Sub 

Если вам нужно, чтобы быть в состоянии назвать вещи динамически по имени, вы могли бы изучить с использованием классов и CallByName:

'In a standard module 
Sub Foo() 
    Dim o as New ProcRunner 
    CallByName o, "SomeProc", VbMethod, args 
End Sub 

'In a class module called ProcRunner 
Sub SomeProc() 
    DoSomethingHere 
    'Or, do something in a standard module 
    Module1.SomeOtherProc 
End Sub 

Или, вы можете написать свой собственный динамический обработчик, вдоль линий:

Sub AppRun(ProcName As String, ParamArray Args) 
    Select Case ProcName 
    Case "SomeProc" 
     SomeProc 
    Case "SomeFunc" 
     SomeFunc 
    End Select 
End Sub 

Если вы вызываете процедуры в другом проекте VBA, вам может потребоваться добавить ссылку на этот проект, в зависимости от узла VBA.

Однако, если вы используете Application.Run, потому что вы вызываете функции, зарегистрированные в DLL или XLL, то вы не имеете никакого выбора, кроме как использовать Application.Run

+0

CallByName выглядит интересно, но у меня нет ProcRunner, доступного как Тип. Не могли бы вы представить, что такое Reference? – someprogrammer

+0

@someprogrammer Вам нужно добавить собственный класс под названием ProcRunner, пример которого я добавил в свой ответ. – ThunderFrame