Я работаю в IntelliCAD, но если у вас есть ноу-хау для ACAD, я хочу услышать это, потому что они все одинаковы. Я делаю userform
для пользователей, чтобы запускать некоторые подпрограммы, и хотел создать список, который бы динамически добавлял элементы в зависимости от того, сколько subroutines
он видит под module
. Проблема, с которой я столкнулся, заключается в том, что, поскольку подпрограммы не хранятся в collection / array
, я не могу использовать For Each
через них. И это проблема, потому что если это не один из тех, что я не знаю, что это такое или как получить доступ ко всем участникам.
Хорошо, я придумал код, который может видеть подпрограммы в проектах, а также различать частные и publi c подпрограммы (понятно, но из-за этого я не хочу, чтобы пользователи могли видеть частные подписки в форме). Привет braX за помощь, я не знаю, как задать что-то в качестве ответа, поэтому прибегаю к редактированию.
Dim ProcKind As VBIDE.vbext_ProcKind
Dim StartLine As Long
Dim EndLine As Long
Sub CountCode()
' All ints in this code are arbitrary and just what worked for me
For Each vbproj In Application.VBE.vbprojects
If vbproj.Name = "CommonProjects" Then
For Each component In vbproj.VBComponents
With component.CodeModule
If .CountOfLines > 3 Then ' This just filters out my own garbage
LineNum = .CountOfDeclarationLines + 3 ' Line numbers are calc'd after compilation so really I don't know wtf is happening
LineNum = .procStartLine(.procOfLine(LineNum, ProcKind), ProcKind)
Do Until LineNum >= .CountOfLines
StartLine = LineNum
EndLine = LineNum + 3
procName = .ProcOfLine(LineNum, ProcKind)
If .Find("Private", StartLine, 1, EndLine, 3) Then ' Ok the ints here are actually good tho. No need to search all columns when 'private' is gonna appear in the first one
MsgBox("Private: " & procName & vbNewLine & vbNewLine & "LineNum: " & LineNum)
Else
MsgBox ("Public: " & procName & vbNewLine & vbNewLine & "LineNum: " & LineNum)
End If
LineNum = .procStartLine(procName, ProcKind) + .ProcCountLines(procName, ProcKind) + 1
Loop
End If
End With
Next
End If
Next
End Sub