Bill Benson
bensonforums at gmail.com
Sat Apr 12 22:03:11 CDT 2014
Works fine... that is what I did. Private Sub Form_Load() Select Case Nz(DLookup("Function", "TblRestartFunctions"), "") Case Is = "Routine1": Application.Run "Routine1", True 'ALTERNATIVE 'Case Is = "Routine1": x = Eval("Routine1" & " (True)") Case Is = "Routine2": Application.Run "Routine2", vbNull, True 'Thanks Stuart M. 'ALTERNATIVE Case Is = "Routine2": x = Eval("Routine2" & " (False,True)") End Select CurrentDb.Execute "Delete * from TblRestartFunctions" End If End Sub A thorny problem is how to pass objects and other argument types, having first read them and their values from my table of function names and arguments. I think I can do this... As a for instance, if for Function X, there were 3 arguments of class Boolean, String, and Tabledef, I could store in fields named Arg1Type, Arg2Type, Arg3 Type, ..., Arg6 Type, the values: "Boolean", "String", "Tabledef", "#N/A", "#N/A", "#N/A" and in fields named Arg1Value, Arg2Value, Arg3Value, Arg4Value, Arg5Value, Arg6Value, the values "True", "Bill", "TblCompany"... And in my routine that looks up and wants to use this info, I could have a Select Case which assigns variants to whatever is required according to that ArgnType. Select Case Nz(DLookup("Arg1Type", "TblRestartFunctions"), "") Case is = "Boolean" VarArg1Value = CBool(Nz(DLookup("Arg1Value", "TblRestartFunctions"), False) Case is = "String" VarArg1Value = CBool(Nz(DLookup("Arg1Value", "TblRestartFunctions"), """") Case is = "Tabledef" Set VarArg1Value = currentdb.tabledefs(Nz(DLookup("Arg1Value", "TblRestartFunctions"), """")) '''Possibly a few more types and assignment options Case Else Set VarArg1Value =Empty End Select '... Repeat for Args2 thru 6 Type and Value, possibly with more items in the Select Case HOWEVER ... Using Application.Run, I think I should be able to pass the VarArg1Value, VarArg2Value, etc... Function Routine2(Optional T, Optional Restarted) If Not IsMissing(Restarted) Then MsgBox "restarted is " & CBool(Restarted) GoTo Afterwards Else MsgBox "restarted is False" End If MsgBox "Before Routine2, my database size is " & Format(FileLen(CurrentDb.Name), "#,###") 'Do some real work involving parameter T GoTo exit_me Afterwards: MsgBox "Main parts of Routine2 were bypassed because we just wanted to check the size after compaction, it is " & Format(FileLen(CurrentDb.Name), "#,###") exit_me: End Function Function Routine1(Optional Restarted) If Not IsMissing(Restarted) Then MsgBox "restarted is " & CBool(Restarted) GoTo Afterwards Else MsgBox "restarted is False" End If MsgBox "Before Routine1, my database size is " & Format(FileLen(CurrentDb.Name), "#,###") 'Do some real work GoTo exit_me Afterwards: MsgBox "Main parts of Routine1 were bypassed because we just wanted to check the size after compaction, it is " & Format(FileLen(CurrentDb.Name), "#,###") exit_me: End Function -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Stuart McLachlan Sent: Saturday, April 12, 2014 10:34 PM To: Access Developers discussion and problem solving Subject: Re: [AccessD] Application.Run not passing my arguments declared optionally After doing a bit of testing, it certainly looks like a limitation on Application.Run (guess they were too busy creating multivalue fields etc to make it work properly). I'd consider going with a wrapper function with a SELECT CASE block and specifically calling a function depending on the input parameter.