codeomnitrix
codeomnitrix

Reputation: 4249

Associated Library in QTP not working

I am new to QTP, just started using it. I have written one class definition in some functional library and also created a test as under:

Class ExcelFileReader
Public default Function Init(pathToExcel)
   Dim objFSO
   Dim result
   Set objFSO = CreateObject("Scripting.FileSystemObject")

   If objFSO.FileExists(pathToExcel) Then
            Rem File Found
            Dim objExcel
            Set objExcel = CreateObject("Excel.Application")
            objExcel.Workbooks.open(pathToExcel)

       Else
            REM File not found
            result = vbOk
            While result <> vbCancel
                result = Msgbox ("Unable to Locate the file", 5, "Error")
            Wend
            ExitAction(1)
       End If
End Function

End Class

Test:

 Dim objExcelReader : Set objExcelReader = New ExcelFileReader
objExcelReader.Init("D:\mytest.xlsx")

I have associated the functional library with the test but still I am getting an error at line number 2 in test stating class definition not found. Also if I copy complete code in the same file "test" then the things are working as intended.

Thanks in advance :)

Upvotes: 3

Views: 2230

Answers (1)

AutomatedChaos
AutomatedChaos

Reputation: 7500

Classes have local scope in your library. You have to construct them with a public function to make them publicly available:

Public Function new_ExcelFileReader()
    Set new_ExcelFileReader = new ExcelFileReader
End Function

Class ExcelFileReader
    Sub Class_Initialize
        MsgBox "Present!"
    End Sub
End Class

And in your other library:

Dim objExcelReader : Set objExcelReader = New_ExcelFileReader
objExcelReader.Init("D:\mytest.xlsx")

Protip: You can pass initialization parameters into your constructor function.

EDIT

On request: how to pass constructor parameters. Just add them to your constructor function:

Public Function new_ExcelFileReader2(filepath, sheetname)
    Set new_ExcelFileReader2 = new ExcelFileReader
    new_ExcelFileReader2.Init(filepath, sheetname)
End Function

' And the call:
Set myExcelFileReader = new_ExcelFileReader2("C:\temp\tempExcel.xlsx", "sheet1")

In my implementation I have sometimes the same object, but that gets 'configured' by multiple contructor functions. In your case you could have a new_ExcelFileReader, a new_CSVFileReader and a new_TabDelimitedReader all pointing to the same object but configured differently.

Another way to fancy up your code is to return the object (with the me keyword) by the init function. This will result in code like this:

Class ExcelFileReader

    private filepath_
    public function Init(filepath)
        filepath_ = filepath
        Set Init = me
    end function

End Class

Set myExcelFileReader = new ExcelFileReader.Init("C:\temp\tmpExcel.xlsx")

With a constructor function you can use it by just returning the object and then calling the Init function.

Public Function new_ExcelFileReader()   ' this is the same as the first function
    Set new_ExcelFileReader = new ExcelFileReader
End Function

Set myExcelFileReader = new_ExcelFileReader.Init("C:\temp\tmpExcel.xlsx")

Upvotes: 6

Related Questions