Skip to content

Commit 3d5a13a

Browse files
committed
use Application.Run to call procedures (calling add-in procedures is possible)
1 parent 087c104 commit 3d5a13a

File tree

1 file changed

+95
-6
lines changed

1 file changed

+95
-6
lines changed

source/modules/ACLibFileManager.cls

Lines changed: 95 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -417,12 +417,12 @@ Private Sub ImportFilesFromImportCollection( _
417417
If (0 / 1) + (Not Not m_CLI.ExecuteList) Then
418418
AccessProgressBar.Init "Run executes ...", UBound(m_CLI.ExecuteList) + 1, 1
419419
For i = 0 To UBound(m_CLI.ExecuteList)
420-
AccessProgressBar.PerformStep
421-
If StringTools.Contains(m_CLI.ExecuteList(i), REPOSTITORY_ROOT_CODE_PRIVATEROOT) Then
422-
Eval VBA.Strings.Replace(m_CLI.ExecuteList(i), REPOSTITORY_ROOT_CODE_PRIVATEROOT, LocalRepositoryRootDirectory())
423-
Else
424-
Eval (m_CLI.ExecuteList(i))
425-
End If
420+
AccessProgressBar.PerformStep
421+
If StringTools.Contains(m_CLI.ExecuteList(i), REPOSTITORY_ROOT_CODE_PRIVATEROOT) Then
422+
ApplicationRunProcedure VBA.Strings.Replace(m_CLI.ExecuteList(i), REPOSTITORY_ROOT_CODE_PRIVATEROOT, LocalRepositoryRootDirectory())
423+
Else
424+
ApplicationRunProcedure m_CLI.ExecuteList(i)
425+
End If
426426
Next
427427
If AccessProgressBar.IsInitialized Then AccessProgressBar.Clear
428428
End If
@@ -438,6 +438,95 @@ Private Sub ImportFilesFromImportCollection( _
438438

439439
End Sub
440440

441+
Private Sub ApplicationRunProcedure(ByVal ProcedureCall As String)
442+
443+
If InStr(1, ProcedureCall, ".") Then
444+
If TryRunAddInProcedure(ProcedureCall) Then
445+
Exit Sub
446+
End If
447+
End If
448+
449+
CallApplicationRun ProcedureCall
450+
451+
End Sub
452+
453+
Private Function TryRunAddInProcedure(ByVal ProcedureCall As String) As Boolean
454+
455+
Dim AddInFilePath As String
456+
457+
ProcedureCall = Replace(ProcedureCall, "%addins%", Environ$("appdata") & "\Microsoft\AddIns", , , vbTextCompare)
458+
ProcedureCall = Replace(ProcedureCall, "%appdata%", Environ("appdata"), , , vbTextCompare)
459+
460+
AddInFilePath = Left(ProcedureCall, InStrRev(ProcedureCall, ".")) & "accda"
461+
If Len(VBA.Dir(AddInFilePath)) = 0 Then
462+
Exit Function
463+
End If
464+
465+
TryRunAddInProcedure = True
466+
CallApplicationRun ProcedureCall
467+
468+
End Function
469+
470+
Private Function CallApplicationRun(ByVal ProcedureCall As String)
471+
472+
Dim ProcName As String
473+
Dim ProcParams() As String
474+
Dim ParamCount As Long
475+
476+
ParamCount = GetProcNameAndParams(ProcedureCall, ProcName, ProcParams)
477+
478+
Select Case ParamCount
479+
Case 0
480+
Application.Run ProcName
481+
Case 1
482+
Application.Run ProcName, ProcParams(0)
483+
Case 2
484+
Application.Run ProcName, ProcParams(0), ProcParams(1)
485+
Case 3
486+
Application.Run ProcName, ProcParams(0), ProcParams(1), ProcParams(2)
487+
Case 4
488+
Application.Run ProcName, ProcParams(0), ProcParams(1), ProcParams(2), ProcParams(3)
489+
Case Else
490+
Err.Raise vbObjectError, "ACLibFileManager.CallApplicationRun", "Only 4 parameters implemented"
491+
End Select
492+
493+
End Function
494+
495+
Private Function GetProcNameAndParams(ByVal ProcedureCall As String, ByRef ProcName As String, ByRef ProcParams() As String) As Long
496+
497+
Dim ProcParamString As String
498+
Dim ParamPos As Long
499+
500+
ProcedureCall = Replace(ProcedureCall, "()", vbNullString)
501+
502+
ParamPos = InStr(1, ProcedureCall, "(")
503+
504+
If ParamPos = 0 Then
505+
ProcName = ProcedureCall
506+
GetProcNameAndParams = 0
507+
Exit Function
508+
End If
509+
510+
ProcName = Left(ProcedureCall, ParamPos - 1)
511+
ProcParamString = Trim(Mid(ProcedureCall, ParamPos + 1))
512+
513+
If Right(ProcParamString, 1) = ")" Then
514+
ProcParamString = Left(ProcParamString, Len(ProcParamString) - 1)
515+
End If
516+
517+
ProcParams = Split(ProcParamString, ",")
518+
519+
Dim i As Long
520+
For i = LBound(ProcParams) To UBound(ProcParams)
521+
ProcParams(i) = Trim(ProcParams(i))
522+
If Left(ProcParams(i), 1) = """" Then
523+
ProcParams(i) = Mid(ProcParams(i), 2, Len(ProcParams(i)) - 2)
524+
End If
525+
Next
526+
527+
GetProcNameAndParams = UBound(ProcParams) + 1
528+
529+
End Function
441530

442531
Private Function IgnoreFolder(ByRef TestFolder As Object) As Boolean
443532
'/*

0 commit comments

Comments
 (0)