Well, Iām going to do this with difficulty because Iām going to assume that you do not want to load VBE classes from my repository to make it a little easier to work, but they are an example of what is possible independently.
Microsoft Visual Basic 5.3 VBA , . (, Office 2010)
, - , .
vba, , . , Run, , . . results. , , , , .
Option Explicit
Private Sub Run()
Dim results As New Collection
Dim component As VBIDE.VBComponent
For Each component In Application.VBE.ActiveVBProject.VBComponents
If component.Type = vbext_ct_StdModule Then
' find public functions with no arguments
Dim codeMod As CodeModule
Set codeMod = component.CodeModule
If InStr(1, codeMod.Lines(1,codeMod.CountOfDeclarationLines), "Option Private Module") = 0 Then
Dim lineNumber As Long
lineNumber = codeMod.CountOfDeclarationLines + 1
Dim procName As String
Dim procKind As vbext_ProcKind
Dim signature As String
' loop through all lines in the module
While (lineNumber < codeMod.CountOfLines)
procName = codeMod.ProcOfLine(lineNumber, procKind) 'procKind is an OUT param
Dim lines() As String
Dim procLineCount As Long
procLineCount = codeMod.ProcCountLines(procName, procKind)
lines = Split(codeMod.lines(lineNumber, procLineCount), vbNewLine)
Dim i As Long
For i = 0 To UBound(lines)
If lines(i) <> vbNullString And Left(Trim(lines(i)), 1) <> "'" Then
signature = lines(i)
Exit For
End If
Next
' this would need better parsing, but should be reasonably close
If InStr(1, signature, "Public Function", vbTextCompare) > 0 Then 'first make sure we have a public function
results.Add signature
End If
lineNumber = lineNumber + procLineCount + 1 ' skip to next procedure
Wend
End If
End If
Next component
Dim str
For Each str In results
Debug.Print str
Next
End Sub
Public Function foo()
End Function
Private Function bar()
End Function
Public Function qwaz(duck)
End Function