Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 是否有一种方法可以根据模块中的子例程数量动态地向表单添加项?_Vba_Autocad - Fatal编程技术网

Vba 是否有一种方法可以根据模块中的子例程数量动态地向表单添加项?

Vba 是否有一种方法可以根据模块中的子例程数量动态地向表单添加项?,vba,autocad,Vba,Autocad,我在IntelliCAD工作,但如果你知道ACAD的诀窍,我想听听,因为它们都一样。我正在制作一个userform供用户运行一些例程,并希望制作一个列表框,根据它在模块下看到的子例程的数量动态添加项。我遇到的问题是,由于子例程没有存储在集合/数组中,因此无法通过它们对每个进行。这是一个问题,因为如果它不是其中之一,我不知道它是什么,也不知道如何访问所有成员 好的,我已经提出了一些代码,可以看到项目中的子例程,以及区分私有和公共子例程(不言自明,但这是因为我不希望用户能够看到表单中的私有子例程)

我在IntelliCAD工作,但如果你知道ACAD的诀窍,我想听听,因为它们都一样。我正在制作一个
userform
供用户运行一些例程,并希望制作一个列表框,根据它在
模块下看到的
子例程的数量动态添加项。我遇到的问题是,由于子例程没有存储在
集合/数组中
,因此无法通过它们对每个
进行
。这是一个问题,因为如果它不是其中之一,我不知道它是什么,也不知道如何访问所有成员

好的,我已经提出了一些代码,可以看到项目中的子例程,以及区分私有和公共子例程(不言自明,但这是因为我不希望用户能够看到表单中的私有子例程)。我不知道如何设置答案,所以我求助于编辑

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

您将需要调整代码以使其在IntelliCAD环境中而不是Excel中工作,但这演示了如何做到这一点-首先在Excel中进行测试以确保其工作,然后调整代码以简单地计算它们而不是列出它们,然后在工作完成后,将其转换为IntelliCAD应该相当简单-我是说数一数例行程序。我会先处理这个问题。将控件添加到窗体将是一个单独的问题,以解决之后,因为将有很多事情要考虑这样做。好吧,这些让我走上了正确的道路。我正在使用VB7.1,所以这可能就是原因,但我没有看到VBIDE obj/属性,而是在应用程序中存在一个VBE属性。真正令人恼火的是,嵌入IntelliCAD的IDE甚至不知道VBE有哪些成员,因此我必须查找Excel中存在哪些属性和方法,然后盲目地在IntelliCAD中键入,只有在运行时我才知道它是否工作。无论如何,感谢您的快速响应,我想我会很好。如果您想使用intellisense,您需要使用早期绑定而不是后期绑定。将Excel引用添加到IntelliCAD,然后它将像您习惯的那样“了解”Excel对象模型。完成后,您始终可以将其切换回后期绑定。您需要调整代码以使其在IntelliCAD环境中而不是Excel中工作,但这演示了如何做到这一点-首先在Excel中测试它以确保其工作,然后调整代码以简单地计算它们,而不是列出它们,然后在工作后,将其转换为工作IntelliCAD应该相当简单。我所说的“it”-是指计算例程。我会先处理这个问题。将控件添加到窗体将是一个单独的问题,以解决之后,因为将有很多事情要考虑这样做。好吧,这些让我走上了正确的道路。我正在使用VB7.1,所以这可能就是原因,但我没有看到VBIDE obj/属性,而是在应用程序中存在一个VBE属性。真正令人恼火的是,嵌入IntelliCAD的IDE甚至不知道VBE有哪些成员,因此我必须查找Excel中存在哪些属性和方法,然后盲目地在IntelliCAD中键入,只有在运行时我才知道它是否工作。无论如何,感谢您的快速响应,我想我会很好。如果您想使用intellisense,您需要使用早期绑定而不是后期绑定。将Excel引用添加到IntelliCAD,然后它将像您习惯的那样“了解”Excel对象模型。完成后,始终可以将其切换回后期绑定。