I try to improve a report I made to document databases, by adding a VBA line count to Modules and Forms. The following code works perfectly in a standard module:
Sub test()
Dim accObj As AccessObject, bwasOpen As Boolean, objName As String
objName = "Form1"
Set accObj = CurrentProject.AllForms(objName)
bwasOpen = accObj.IsLoaded
If Not bwasOpen Then
DoCmd.OpenForm objName, acDesign, WindowMode:=acHidden
End If
If Forms(objName).HasModule Then
DoCmd.OpenModule "Form_" & objName
Debug.Print Modules("Form_" & objName).CountOfLines
End If
If Not bwasOpen Then
DoCmd.Close acForm, objName, acSaveNo
End If
End Sub
But when I use a similar code in the report itself, I have an error. And since that error is happening in the class module (the report), I feel a bit stuck with debugging. The code in the report:
Set accObj = CurrentProject.AllForms(objName)
bwasOpen = accObj.IsLoaded
If Not bwasOpen Then
DoCmd.OpenForm objName, acDesign, WindowMode:=acHidden 'Breaks here
End If
If Forms(objName).HasModule Then
DoCmd.OpenModule "Form_" & objName
GetExtraInfo = Modules("Form_" & objName).CountOfLines
End If
If Not bwasOpen Then
DoCmd.Close acForm, objName, acSaveNo
End If
The code is called from a report control using =GetExtraInfo(). The whole thing works well, except this new part where I want to return the CountOfLines for Forms.
Update: I have added some error trapping, and it gives error:
2486 – You can’t carry out this action at the present time
The whole db can be downloaded here, its’s only 300 KB. The report is named “rptObjList”.
The “bad” code has been commented out. It is an Access 2003 db.
Thanks for your help.
Your code opens a form and checks its
.HasModuleproperty. And if the form has a module, you open that module to check.CountOfLines. However, you need not open the module to determine its.CountOfLines. And I would try to avoid opening the form, too.If you ask for
.CountOfLinesfor a module which doesn’t exist, such as the following, you can trap error #9 (‘Subscript out of range‘) to give you an alternative to checking the.HasModuleproperty:Or you could check for the code module with a function similar to minimally tested
ModuleExists()outlined below.Note I’m unsure how helpful my suggestions will be because I struggled to follow your code. Furthermore I unwisely chose to step through the code behind
rptObjListand became frustrated by all the unhandled errors when it callsGetDesc()for objects which have noDescriptionproperty. I just gave up.