REM ======================================================================================================================= REM === The Access2Base library is a part of the LibreOffice project. === REM === Full documentation is available on http://www.access2base.com === REM ======================================================================================================================= Option Compatible Option Explicit REM ----------------------------------------------------------------------------------------------------------------------- Public Sub DebugPrint(ParamArray pvArgs() As Variant) 'Print arguments unconditionally in console 'Arguments are separated by a TAB (simulated by spaces) 'Some pvArgs might be missing: a TAB is still generated Dim vVarTypes() As Variant, i As Integer Const cstTab = 5 On Local Error Goto Exit_Sub ' Never interrupt processing Utils._SetCalledSub("DebugPrint") vVarTypes = Utils._AddNumeric(Array(vbEmpty, vbNull, vbDate, vbString, vbBoolean, vbObject, vbVariant, vbByte, vbArray + vbByte)) If UBound(pvArgs) >= 0 Then For i = 0 To UBound(pvArgs) If Not Utils._CheckArgument(pvArgs(i), i + 1, vVarTypes(), , False) Then pvArgs(i) = "[TYPE?]" Next i End If Dim sOutput As String, sArg As String sOutput = "" For i = 0 To UBound(pvArgs) sArg = Replace(Utils._CStr(pvArgs(i), _A2B_.DebugPrintShort), "\;", ";") ' Add argument to output If i = 0 Then sOutput = sArg Else sOutput = sOutput & Space(cstTab - (Len(sOutput) Mod cstTab)) & sArg End If Next i TraceLog(TRACEANY, sOutput, False) Exit_Sub: Utils._ResetCalledSub("DebugPrint") Exit Sub End Sub ' DebugPrint V0.9.5 REM ----------------------------------------------------------------------------------------------------------------------- REM --- PYTHON WRAPPERS --- REM ----------------------------------------------------------------------------------------------------------------------- REM ----------------------------------------------------------------------------------------------------------------------- Public Function PythonEventsWrapper(Optional poEvent As Variant) As Variant ' Python wrapper when Application.Events() method is invoked ' The ParamArray mechanism empties UNO objects when they are member of the arguments list ' As a workaround, the Application.Events function is executed directly If _ErrorHandler() Then On Local Error GoTo Exit_Function ' Do never interrupt PythonEventsWrapper = Null Dim vReturn As Variant, vArray As Variant Const cstObject = 1 vReturn = Application.Events(poEvent) vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type) PythonEventsWrapper = vArray Exit_Function: Exit Function End Function ' PythonEventsWrapper V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PythonWrapper(ByVal pvCallType As Variant _ , ByVal pvObject As Variant _ , ByVal pvScript As Variant _ , ParamArray pvArgs() As Variant _ ) As Variant ' Called from Python to apply ' - on object with entry pvObject in PythonCache ' Conventionally: -1 = Application ' -2 = DoCmd ' - a script pvScript which type is described by pvCallType ' - with arguments pvArgs(0)... (max. 8 for object methods) ' The value returned by the method/property is encapsulated in an array ' [0] => 0 = scalar or array returned by the method ' => 1 = basic object returned by the method ' => 2 = a null value ' [1] => the object reference or the returned value (complemented with arguments passed by reference, if any) or Null ' [2] => the object type or Null ' [3] => the object name, if any ' or, when pvCallType == vbUNO, as the UNO object returned by the property Dim vReturn As Variant, vArray As Variant Dim vObject As Variant, sScript As String, sModule As String Dim i As Integer, iNbArgs As Integer, vArg As Variant, vArgs() As Variant Const cstApplication = -1, cstDoCmd = -2 Const cstScalar = 0, cstObject = 1, cstNull = 2, cstUNO = 3 'Conventional special values Const cstNoArgs = "+++NOARGS+++", cstSymEmpty = "+++EMPTY+++", cstSymNull = "+++NULL+++", cstSymMissing = "+++MISSING+++" 'https://support.office.com/en-us/article/CallByName-fonction-49ce9475-c315-4f13-8d35-e98cfe98729a 'Determines the pvCallType Const vbGet = 2, vbLet = 4, vbMethod = 1, vbSet = 8, vbUNO = 16 If _ErrorHandler() Then On Local Error GoTo Error_Function PythonWrapper = Null 'Reinterpret arguments one by one into vArgs, examine iso-dates and conventional NoArgs/Empty/Null values iNbArgs = -1 vArgs = Array() If UBound(pvArgs) >= 0 Then For i = 0 To UBound(pvArgs) vArg = pvArgs(i) If i = 0 And VarType(vArg) = vbString Then If vArg = cstNoArgs Then Exit For End If If VarType(vArg) = vbString Then If vArg = cstSymEmpty Then vArg = Empty ElseIf vArg = cstSymNull Then vArg = Null ElseIf vArg = cstSymMissing Then Exit For ' Next arguments must be missing also Else vArg = _CDate(vArg) End If End If iNbArgs = iNbArgs + 1 ReDim Preserve vArgs(iNbArgs) vArgs(iNbArgs) = vArg Next i End If 'Check pvObject Select Case pvObject ' Always numeric Case cstApplication sModule = "Application" Select Case pvScript Case "AllDialogs" : If iNbArgs < 0 Then vReturn = Application.AllDialogs() Else vReturn = Application.AllDialogs(vArgs(0)) Case "AllForms" : If iNbArgs < 0 Then vReturn = Application.AllForms() Else vReturn = Application.AllForms(vArgs(0)) Case "AllModules" : If iNbArgs < 0 Then vReturn = Application.AllModules() Else vReturn = Application.AllModules(vArgs(0)) Case "CloseConnection" vReturn = Application.CloseConnection() Case "CommandBars" : If iNbArgs < 0 Then vReturn = Application.CommandBars() Else vReturn = Application.CommandBars(vArgs(0)) Case "CurrentDb" : vReturn = Application.CurrentDb() Case "CurrentUser" : vReturn = Application.CurrentUser() Case "DAvg" : vReturn = Application.DAvg(vArgs(0), vArgs(1), vArgs(2)) Case "DCount" : vReturn = Application.DCount(vArgs(0), vArgs(1), vArgs(2)) Case "DLookup" : vReturn = Application.DLookup(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case "DMax" : vReturn = Application.DMax(vArgs(0), vArgs(1), vArgs(2)) Case "DMin" : vReturn = Application.DMin(vArgs(0), vArgs(1), vArgs(2)) Case "DStDev" : vReturn = Application.DStDev(vArgs(0), vArgs(1), vArgs(2)) Case "DStDevP" : vReturn = Application.DStDevP(vArgs(0), vArgs(1), vArgs(2)) Case "DSum" : vReturn = Application.DSum(vArgs(0), vArgs(1), vArgs(2)) Case "DVar" : vReturn = Application.DVar(vArgs(0), vArgs(1), vArgs(2)) Case "DVarP" : vReturn = Application.DVarP(vArgs(0), vArgs(1), vArgs(2)) Case "Forms" : If iNbArgs < 0 Then vReturn = Application.Forms() Else vReturn = Application.Forms(vArgs(0)) Case "getObject" : vReturn = Application.getObject(vArgs(0)) Case "getValue" : vReturn = Application.getValue(vArgs(0)) Case "HtmlEncode" : vReturn = Application.HtmlEncode(vArgs(0), vArgs(1)) Case "OpenDatabase" : vReturn = Application.OpenDatabase(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case "ProductCode" : vReturn = Application.ProductCode() Case "setValue" : vReturn = Application.setValue(vArgs(0), vArgs(1)) Case "SysCmd" : vReturn = Application.SysCmd(vArgs(0), vArgs(1), vARgs(2)) Case "TempVars" : If iNbArgs < 0 Then vReturn = Application.TempVars() Else vReturn = Application.TempVars(vArgs(0)) Case "Version" : vReturn = Application.Version() Case Else GoTo Error_Proc End Select Case cstDoCmd sModule = "DoCmd" Select Case pvScript Case "ApplyFilter" : vReturn = DoCmd.ApplyFilter(vArgs(0), vArgs(1), vArgs(2)) Case "Close" : vReturn = DoCmd.mClose(vArgs(0), vArgs(1), vArgs(2)) Case "CopyObject" : vReturn = DoCmd.CopyObject(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case "FindNext" : vReturn = DoCmd.FindNext() Case "FindRecord" : vReturn = DoCmd.FindRecord(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) Case "GetHiddenAttribute" vReturn = DoCmd.GetHiddenAttribute(vArgs(0), vArgs(1)) Case "GoToControl" : vReturn = DoCmd.GoToControl(vArgs(0)) Case "GoToRecord" : vReturn = DoCmd.GoToRecord(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case "Maximize" : vReturn = DoCmd.Maximize() Case "Minimize" : vReturn = DoCmd.Minimize() Case "MoveSize" : vReturn = DoCmd.MoveSize(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case "OpenForm" : vReturn = DoCmd.OpenForm(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) Case "OpenQuery" : vReturn = DoCmd.OpenQuery(vArgs(0), vArgs(1), vArgs(2)) Case "OpenReport" : vReturn = DoCmd.OpenReport(vArgs(0), vArgs(1)) Case "OpenSQL" : vReturn = DoCmd.OpenSQL(vArgs(0), vArgs(1)) Case "OpenTable" : vReturn = DoCmd.OpenTable(vArgs(0), vArgs(1), vArgs(2)) Case "OutputTo" : vReturn = DoCmd.OutputTo(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7)) Case "Quit" : _A2B_.CalledSub = "Quit" : GoTo Error_Action Case "RunApp" : vReturn = DoCmd.RunApp(vArgs(0)) Case "RunCommand" : vReturn = DoCmd.RunCommand(vArgs(0)) Case "RunSQL" : vReturn = DoCmd.RunSQL(vArgs(0), vArgs(1)) Case "SelectObject" : vReturn = DoCmd.SelectObject(vArgs(0), vArgs(1), vArgs(2)) Case "SendObject" : vReturn = DoCmd.SendObject(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7), vArgs(8), vArgs(9)) Case "SetHiddenAttribute" vReturn = DoCmd.SetHiddenAttribute(vArgs(0), vArgs(1), vArgs(2)) Case "SetOrderBy" : vReturn = DoCmd.SetOrderBy(vArgs(0), vArgs(1)) Case "ShowAllRecords" vReturn = DoCmd.ShowAllRecords() Case Else GoTo Error_Proc End Select Case Else ' Locate targeted object If pvObject > UBound(_A2B_.PythonCache) Or pvObject < 0 Then GoTo Error_Object Set vObject = _A2B_.PythonCache(pvObject) If IsNull(vObject) Then If pvScript = "Dispose" Then GoTo Exit_Function Else GoTo Error_Object End If ' Preprocessing sScript = pvScript sModule = vObject._Type Select Case sScript Case "Add" If vObject._Type = "COLLECTION" And vObject._CollType = COLLTABLEDEFS Then vArgs = Array(_A2B_.PythonCache(vArgs(0))) Case "Close" sSCript = "mClose" Case "Type" sScript = "pType" Case Else End Select ' Execute method Select Case UBound(vArgs) ' Dirty but ... CallByName does not support an array of arguments or return values Case -1 If pvCallType = vbUNO Then With vObject Select Case sScript ' List all properties that should be called directly (UNO) Case "BoundField" : vReturn = .BoundField Case "Column" : vReturn = .Column Case "Connection" : vReturn = .Connection case "ContainerWindow" : vReturn = .ContainerWindow Case "ControlModel" : vReturn = .ControlModel Case "ControlView" : vReturn = .ControlView Case "DatabaseForm" : vReturn = .DatabaseForm Case "Document" : vReturn = .Document Case "FormsCollection" : vReturn = .FormsCollection Case "LabelControl" : vReturn = .LabelControl Case "MetaData" : vReturn = .MetaData Case "ParentComponent" : vReturn = .ParentComponent Case "Query" : vReturn = .Query Case "RowSet" : vReturn = .RowSet Case "Table" : vReturn = .Table Case "UnoDialog" : vReturn = .UnoDialog Case Else End Select End With ElseIf sScript = "ItemData" Then ' List all properties that should be called directly (arrays not supported by CallByName) vReturn = vObject.ItemData ElseIf sScript = "LinkChildFields" Then vReturn = vObject.LinkChildFields ElseIf sScript = "LinkMasterFields" Then vReturn = vObject.LinkMasterFields ElseIf sScript = "OpenArgs" Then vReturn = vObject.OpenArgs ElseIf sScript = "Selected" Then vReturn = vObject.Selected ElseIf sScript = "Value" Then vReturn = vObject.Value Else vReturn = CallByName(vObject, sScript, pvCallType) End If Case 0 Select Case sScript Case "AppendChunk" ' Arg is a vector, not supported by CallByName vReturn = vObject.GetChunk(vArgs(0), vArgs(1)) Case "GetRows" ' Returns an array, not supported by CallByName vReturn = vObject.GetRows(vArgs(0), True) ' Force iso dates Case Else vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0)) End Select Case 1 Select Case sScript Case "GetChunk" ' Returns a vector, not supported by CallByName vReturn = vObject.GetChunk(vArgs(0), vArgs(1)) Case Else vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1)) End Select Case 2 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2)) Case 3 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3)) Case 4 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4)) Case 5 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5)) Case 6 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) Case 7 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7)) End Select ' Postprocessing Select Case pvScript Case "Close", "Dispose", "Terminate" Set _A2B_.PythonCache(pvObject) = Nothing Case "Move", "MoveFirst", "MoveLast", "MoveNext", "MovePrevious" ' Pass the new BOF, EOF values (binary format) If vObject._Type = "RECORDSET" Then vReturn = (Iif(vObject.BOF, 1, 0) * 2 + Iif(vObject.EOF, 1, 0)) * Iif(vReturn, 1, -1) End If Case "Find" ' Store in array the arguments passed by reference If vObject._Type = "MODULE" And vReturn = True Then vReturn = Array(vReturn, vArgs(1), vArgs(2), vArgs(3), vArgs(4)) End If Case "ProcOfLine" ' Store in array the arguments passed by reference vReturn = Array(vReturn, vArgs(1)) Case Else End Select End Select ' Structure the returned array If pvCallType = vbUNO Then vArray = vReturn Else If IsNull(vReturn) Then vArray = Array(cstNull, Null, Null) ElseIf IsObject(vReturn) Then Select Case vReturn._Type Case "COLLECTION", "COMMANDBARCONTROL", "EVENT" vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type) Case Else vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type, vReturn.Name) End Select Else If VarType(vReturn) = vbDate Then vArray = Array(cstScalar, _CStr(vReturn), Null) ElseIf VarType(vReturn) = vbBigint Then ' Could happen for big integer database fields vArray = Array(cstScalar, CLng(vReturn), Null) Else vArray = Array(cstScalar, vReturn, Null) End If End If End If PythonWrapper = vArray Exit_Function: Exit Function Error_Function: TraceError(TRACEABORT, Err, "PythonWrapper", Erl) GoTo Exit_Function Error_Object: TraceError(TRACEFATAL, ERROBJECTNOTFOUND, "Python Wrapper (" & pvScript & ")", 0, , Array(_GetLabel("OBJECT"), "#" & pvObject)) GoTo Exit_Function Error_Action: TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0) GoTo Exit_Function Error_Proc: TraceError(TRACEFATAL, ERRPROCEDURENOTFOUND, "Python Wrapper", 0, , Array(pvScript, sModule)) GoTo Exit_Function End Function ' PythonWrapper V6.4 REM ----------------------------------------------------------------------------------------------------------------------- REM --- PYTHON HELPER FUNCTIONS --- REM ----------------------------------------------------------------------------------------------------------------------- REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyConvertFromUrl(ByVal pvFile As Variant) As String ' Convenient function to have common conversions of filenames from/to url notations both in Python and Basic On Local Error GoTo Exit_Function PyConvertFromUrl = "" If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function PyConvertFromUrl = ConvertFromUrl(pvFile) Exit_Function: Exit Function End Function ' PyConvertFromUrl V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyConvertToUrl(ByVal pvFile As Variant) As String ' Convenient function to have common conversions of filenames from/to url notations both in Python and Basic On Local Error GoTo Exit_Function PyConvertToUrl = "" If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function PyConvertToUrl = ConvertToUrl(pvFile) Exit_Function: Exit Function End Function ' PyConvertToUrl V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyCreateUnoService(ByVal pvService As Variant) As Variant ' Convenient function to create a UNO service in Python On Local Error GoTo Exit_Function Set PyCreateUnoService = Nothing If Not Utils._CheckArgument(pvService, 1, vbString) Then Goto Exit_Function Set PyCreateUnoService = CreateUnoService(pvService) Exit_Function: Exit Function End Function ' PyCreateUnoService V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyDateAdd(ByVal pvAdd As Variant _ , ByVal pvCount As Variant _ , ByVal pvDate As Variant _ ) As Variant ' Convenient shortcut to useful and easy-to-use Basic date functions Dim vDate As Variant, vNewDate As Variant On Local Error GoTo Exit_Function PyDateAdd = Null If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvCount, 2, Utils._AddNumeric()) Then Goto Exit_Function If Not Utils._CheckArgument(pvDate, 3, vbString) Then Goto Exit_Function vDate = _CDate(pvDate) vNewDate = DateAdd(pvAdd, pvCount, vDate) If VarType(vNewDate) = vbDate Then PyDateAdd = _CStr(vNewDate) Else PyDateAdd = vNewDate Exit_Function: Exit Function End Function ' PyDateAdd V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyDateDiff(ByVal pvAdd As Variant _ , ByVal pvDate1 As Variant _ , ByVal pvDate2 As Variant _ , ByVal pvWeekStart As Variant _ , ByVal pvYearStart As Variant _ ) As Variant ' Convenient shortcut to useful and easy-to-use Basic date functions Dim vDate1 As Variant, vDate2 As Variant On Local Error GoTo Exit_Function PyDateDiff = Null If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvDate1, 2, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvDate2, 3, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvWeekStart, 4, Utils._AddNumeric()) Then Goto Exit_Function If Not Utils._CheckArgument(pvWeekStart, 5, Utils._AddNumeric()) Then Goto Exit_Function vDate1 = _CDate(pvDate1) vDate2 = _CDate(pvDate2) PyDateDiff = DateDiff(pvAdd, vDate1, vDate2, pvWeekStart, pvYearStart) Exit_Function: Exit Function End Function ' PyDateDiff V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyDatePart(ByVal pvAdd As Variant _ , ByVal pvDate As Variant _ , ByVal pvWeekStart As Variant _ , ByVal pvYearStart As Variant _ ) As Variant ' Convenient shortcut to useful and easy-to-use Basic date functions Dim vDate As Variant On Local Error GoTo Exit_Function PyDatePart = Null If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvDate, 2, vbString) Then Goto Exit_Function If Not Utils._CheckArgument(pvWeekStart, 3, Utils._AddNumeric()) Then Goto Exit_Function If Not Utils._CheckArgument(pvWeekStart, 4, Utils._AddNumeric()) Then Goto Exit_Function vDate = _CDate(pvDate) PyDatePart = DatePart(pvAdd, vDate, pvWeekStart, pvYearStart) Exit_Function: Exit Function End Function ' PyDatePart V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyDateValue(ByVal pvDate As Variant) As Variant ' Convenient shortcut to useful and easy-to-use Basic date functions Dim vDate As Variant On Local Error GoTo Exit_Function PyDateValue = Null If Not Utils._CheckArgument(pvDate, 1, vbString) Then Goto Exit_Function vDate = DateValue(pvDate) If VarType(vDate) = vbDate Then PyDateValue = _CStr(vDate) Else PyDateValue = vDate Exit_Function: Exit Function End Function ' PyDateValue V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyFormat(ByVal pvValue As Variant, pvFormat As Variant) As String ' Convenient function to format numbers or dates On Local Error GoTo Exit_Function PyFormat = "" If Not Utils._CheckArgument(pvValue, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function pvValue = _CDate(pvValue) If IsEmpty(pvFormat) Then PyFormat = Str(pvValue) Else If Not Utils._CheckArgument(pvFormat, 2, vbString) Then Goto Exit_Function PyFormat = Format(pvValue, pvFormat) End If Exit_Function: Exit Function End Function ' PyFormat V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyGetGUIType() As Variant PyGetGUIType = GetGUIType() End Function ' PyGetGUIType V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyGetSystemTicks() As Variant PyGetSystemTicks = GetSystemTicks() End Function ' PyGetSystemTicks V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyGlobalScope(ByVal pvLib As Variant) As Variant Select Case pvLib Case "Basic" PyGlobalScope = GlobalScope.BasicLibraries() Case "Dialog" PyGlobalScope = GlobalScope.DialogLibraries() Case Else End Select End Function ' PyGlobalScope V6.4 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyInputBox(ByVal pvText As Variant _ , ByVal pvTitle As Variant _ , ByVal pvDefault As Variant _ , ByVal pvXPos As Variant _ , ByVal pvYPos As Variant _ ) As Variant ' Convenient function to open input box from Python On Local Error GoTo Exit_Function PyInputBox = Null If Not Utils._CheckArgument(pvText, 1, vbString) Then Goto Exit_Function If IsEmpty(pvTitle) Then pvTitle = "" If Not Utils._CheckArgument(pvTitle, 2, vbString) Then Goto Exit_Function If IsEmpty(pvDefault) Then pvDefault = "" If Not Utils._CheckArgument(pvDefault, 3, vbString) Then Goto Exit_Function If IsEmpty(pvXPos) Or IsEmpty(pvYPos) Then PyInputBox = InputBox(pvText, pvTitle, pvDefault) Else If Not Utils._CheckArgument(pvXPos, 4, Utils._AddNumeric()) Then Goto Exit_Function If Not Utils._CheckArgument(pvYPos, 5, Utils._AddNumeric()) Then Goto Exit_Function PyInputBox = InputBox(pvText, pvTitle, pvDefault, pvXPos, pvYPos) End If Exit_Function: Exit Function End Function ' PyInputBox V6.4.0 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyMsgBox(ByVal pvText As Variant _ , ByVal pvType As Variant _ , ByVal pvDialogTitle As Variant _ ) As Variant ' Convenient function to open message box from Python On Local Error GoTo Exit_Function PyMsgBox = Null If Not Utils._CheckArgument(pvText, 1, vbString) Then Goto Exit_Function If IsEmpty(pvType) Then pvType = 0 If Not Utils._CheckArgument(pvType, 2, Utils._AddNumeric()) Then Goto Exit_Function If IsEmpty(pvDialogTitle) Then PyMsgBox = MsgBox(pvText, pvType) Else If Not Utils._CheckArgument(pvDialogTitle, 3, vbString) Then Goto Exit_Function PyMsgBox = MsgBox(pvText, pvType, pvDialogTitle) End If Exit_Function: Exit Function End Function ' PyMsgBox V6.4.0 REM ----------------------------------------------------------------------------------------------------------------------- Public Function PyTimer() As Long ' Convenient function to call Timer from Python PyTimer = Timer End Function ' PyTimer V6.4 REM ----------------------------------------------------------------------------------------------------------------------- REM --- PRIVATE FUNCTIONS --- REM ----------------------------------------------------------------------------------------------------------------------- REM ----------------------------------------------------------------------------------------------------------------------- Private Function _CDate(ByVal pvValue As Variant) As Variant ' Return a Date type if iso date, otherwise return input Dim vValue As Variant vValue = pvValue If VarType(pvValue) = vbString Then If pvValue <> "" And IsDate(pvValue) Then vValue = CDate(pvValue) ' IsDate("") gives True !? End If _CDate = vValue End Function