How can I automatically populate the VBA Editor with line numbers?

前端 未结 7 1642
甜味超标
甜味超标 2020-12-02 01:41

I want to have line numbers in my VBA code for debugging reasons. That will allow me to know where a particular error occurred.

Is there an automatic feature for thi

相关标签:
7条回答
  • 2020-12-02 02:18

    I use this code for adding line numbers to my Excel projects. I found it online a while back and I don't remember where I got it, so credit goes to whoever originally wrote this:

    Sub AddLineNumbers(wbName As String, vbCompName As String)
        'See MakeUF
        Dim i As Long, j As Long, lineN As Long
        Dim procName As String
        Dim startOfProceedure As Long
        Dim lengthOfProceedure As Long
        Dim newLine As String
    
        With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
            .CodePane.Window.Visible = False
    
            For i = 1 To .CountOfLines
                procName = .ProcOfLine(i, vbext_pk_Proc)
    
                If procName <> vbNullString Then
                    startOfProceedure = .ProcStartLine(procName, vbext_pk_Proc)
                    lengthOfProceedure = .ProcCountLines(procName, vbext_pk_Proc)
    
                    If startOfProceedure + 1 < i And i < startOfProceedure + lengthOfProceedure - 1 Then
                        newLine = RemoveOneLineNumber(.Lines(i, 1))
                        If Not HasLabel(newLine) And Not (.Lines(i - 1, 1) Like "* _") Then
                            .ReplaceLine i, CStr(i) & ":" & newLine
                        End If
                    End If
                End If
    
            Next i
            .CodePane.Window.Visible = True
        End With
    End Sub
    
    Sub RemoveLineNumbers(wbName As String, vbCompName As String)
        'See MakeUF
        Dim i As Long
        With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
            For i = 1 To .CountOfLines
                .ReplaceLine i, RemoveOneLineNumber(.Lines(i, 1))
            Next i
        End With
    End Sub
    
    Function RemoveOneLineNumber(aString)
        RemoveOneLineNumber = aString
        If aString Like "#:*" Or aString Like "##:*" Or aString Like "###:*" Then
            RemoveOneLineNumber = Mid(aString, 1 + InStr(1, aString, ":", vbTextCompare))
        End If
    End Function
    
    Function HasLabel(ByVal aString As String) As Boolean
        HasLabel = InStr(1, aString & ":", ":") < InStr(1, aString & " ", " ")
    End Function
    

    You'll have to modify it to suit your needs since you're working in Access, but I'm sure the main meat of it still applies. In Excel, there's a userform that is used to kick off the code for the module you specify, but you should be able to just pass in the module name (vbCompName) to specify the module. I'm not well-versed in Access VBA, so I'm not sure what you'd replace Workbooks(wbName) with in the code.

    0 讨论(0)
提交回复
热议问题