Есть ли способ динамически добавлять элементы в форму в зависимости от количества подпрограмм в модуле? - PullRequest
1 голос
/ 26 мая 2020

Я работаю в IntelliCAD, но если у вас есть ноу-хау для ACAD, я хочу услышать это, потому что они все одинаковы. Я делаю userform для пользователей, чтобы запускать некоторые подпрограммы, и хотел создать список, который бы динамически добавлял элементы в зависимости от того, сколько subroutines он видит под module. Проблема, с которой я столкнулся, заключается в том, что, поскольку подпрограммы не хранятся в collection / array, я не могу использовать For Each через них. И это проблема, потому что если это не один из тех, что я не знаю, что это такое или как получить доступ ко всем участникам.

enter image description here

Хорошо, я придумал код, который может видеть подпрограммы в проектах, а также различать частные и 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
...