Giới thiệu Tool phân tích code

tuhocvba

Administrator
Thành viên BQT
Chúng ta muốn phân tích code bằng VBA, nếu có thể thì liệt kê kết quả thật dễ hiểu, dễ nhìn.
Để phân tích code bằng VBA, hiện tại không có công thức Excel nào có thể làm được việc này. Tuy nhiên, bằng chính code VBA, chúng ta có thể thực hiện được điều này.
Hiện tại trên diễn đàn, đã có một chủ đề liên quan tới vấn đề này, đó là . Tool này phân tích mang tính logic, bên trong một thủ tục, thì có những thủ tục nào được gọi. Điều này là có ý nghĩa với người code.
Để nhìn lại công sức code, đánh giá thành quả, thì chúng ta cần một bản tổng hợp dễ hiểu, dễ nhìn, và có thật đầy đủ số lượng dòng code, thuộc Module nào...
Và hôm nay tôi giới thiệu với các bạn điều này.

Cách suy nghĩ khi lựa chọn Tool phân tích code bằng VBA.
Dù nói là phân tích code, nhưng quả thật phương pháp phân tích thì có nhiều. Như tôi đã nói ở trên, chúng ta đã có một phương pháp phân tích Tree View Code.
Đó cũng là một trong những cách nghĩ khi phân tích code.

Sau đây, tôi trình bày một số lý do khi phân tích code:
Trong quá trình phát triển Tool, chúng ta muốn so sánh sự khác nhau giữa phiên bản trước và phiên bản hiện tại.
Cách sử dụng kết quả phân tích code.
Với các chương trình nhỏ, thì một người có thể hoàn thành Tool. Tuy nhiên, đối với một dự án quy mô, thì trường hợp một người làm Tool là rất hiếm. Thường là chia ra mỗi người sẽ đảm nhiệm một chức năng nào đó của Tool, trường hợp này là phổ biến hơn cả.
Vì vậy, nếu như điều tra biết rõ được, code như thế nào, được viết ở đâu (Module nào), thì đó là điều rất tiện lợi, hữu ích để mọi người tham khảo.
Điều này rất thuận tiện để quản lý các version của Tool. Tóm lại, mỗi người có cách sử dụng kết quả phân tích vào các mục đích khác nhau, tuy nhiên thông thường nhất là để thuận tiện quản lý các version của Tool.

Làm thế nào để liệt kê thông tin dễ nhìn và dễ hiểu, dễ hình dung quy mô của dự án.
Hãy nhớ lại khi chúng ta lần mò lại code do chính mình viết ra cách đây vài tháng. Điều chúng ta muốn biết là tên Module, tên thủ tục,...
Vì vậy, ở đây, chúng ta sẽ đề xuất liệt kê các thông tin sau: Tên Module, tên thủ tục, số lượng dòng code.

Hình ảnh trước khi chạy chương trình sẽ như thế này:
Bạn cần đăng nhập để thấy đính kèm


Kết quả chạy code mong muốn như thế này:
Bạn cần đăng nhập để thấy đính kèm


Code mẫu:
Mã:
Sub phantichcode()
        'Khai bao bien so
        Dim intWriteRow As Long         'Dong ghi du lieu
        Dim intMdlTotalNum As Long      'So luong Module
        Dim intProTotalNum As Long      'So luong sub/function
        Dim intCodeTotalNum As Long     'Tong So luong dong code
        Dim strMdlName As String        'Module Name
        Dim strProName As String        'Sub/Function Name
        Dim intCodeNum As Long          'So dong code
        Dim intRowCount As Long         'So dong data
        
        '①Lay so luong Module
        Dim intMdlNum As Integer 'So luong Module
        intMdlTotalNum = ActiveWorkbook.VBProject.VBComponents.Count
        
        '②Vong lap xu ly lan luot cac Module
        Dim i As Long, j As Long
        intProTotalNum = 0
        intCodeTotalNum = 0
        intRowCount = 1
        intWriteRow = 9
        For i = 1 To intMdlTotalNum
           With ActiveWorkbook.VBProject.VBComponents(i)
                '③Ten Module
                strMdlName = .Name
                With .CodeModule
                    'Vong lap xu ly lan luot tung thu tuc
                    For j = 1 To .CountOfLines
                        If strProName <> .ProcOfLine(j, 0) Then
                            '④Ten Sub/Function, so dong code
                            strProName = .ProcOfLine(j, 0)
                            intCodeNum = .ProcCountLines(strProName, 0)
                            
                            '⑤Ghi No., Module Name, Sub/Function Name, so dong code vao bang thong tin chi tiet
                            With Worksheets("ALL")
                                .Cells(intWriteRow, 2).Value = intRowCount  'No
                                .Cells(intWriteRow, 3).Value = strMdlName   'Module Name
                                .Cells(intWriteRow, 4).Value = strProName   'Sub/Function Name
                                .Cells(intWriteRow, 5).Value = intCodeNum   'So dong code
                            End With
                                                    
                            'Tong so Sub/Function, Tong so dong code
                            intProTotalNum = intProTotalNum + 1
                            intCodeTotalNum = intCodeTotalNum + intCodeNum
                            
                            'Dong ghi du lieu tang len 1
                            intWriteRow = intWriteRow + 1
                            
                            'No. tang len 1
                            intRowCount = intRowCount + 1
                            
                        End If
                    Next j
                    
                    'Gan Sub/Function Name = "" de sang vong lap tiep theo
                    strProName = ""
                End With
            End With
        Next i
        
        '⑥Ghi du lieu tong hop
        Worksheets("ALL").Cells(3, 3).Value = intMdlTotalNum
        Worksheets("ALL").Cells(4, 3).Value = intProTotalNum
        Worksheets("ALL").Cells(5, 3).Value = intCodeTotalNum
        
    End Sub
Tham khảo từ:
 

vbano1

SMod
Thành viên BQT
Chắc các bạn đã nghe tới dự án hỗ trợ thành viên số 01. Đây là một dự án lớn mà BQT tuhocvba.net đã hỗ trợ thành viên, với hơn 4000 dòng code, hơn 100 thủ tục và hàm. Quả là những con số rất khó để tổng hợp bằng tay chân phải không nào.
Bạn cần đăng nhập để thấy đính kèm
Và để tổng hợp ra kết quả như trên, chúng tôi đã dùng chương trình trên để tổng hợp tự động.
Sau đây, tôi sẽ thuyết minh từng đoạn code ở trên.

Đoạn code dưới đây sẽ lấy số lượng thủ tục và hàm:
Mã:
Dim intMdlNum As Integer 'Số lượng Module
intMdlTotalNum = ActiveWorkbook.VBProject.VBComponents.Count
Trong mỗi Module, chúng ta sẽ chạy từ dòng code số 1 tới dòng cuối của Module ấy để xử lý:
Mã:
For j = 1 To .CountOfLines
 
Next i
Trong xử lý này, ta sẽ lấy tên các thủ tục và hàm, cũng như số lượng dòng code của thủ tục/hàm tương ứng.
Mã:
If strProName <> .ProcOfLine(j, 0) Then
'④Lấy tên thủ tục và hàm, số dòng code của thủ tục và hàm
strProName = .ProcOfLine(j, 0)                                  'Sub/Function Name
intCodeNum = .ProcCountLines(strProName, 0)       'Số dòng code của Sub/Function
End If
Sau khi lấy được thông tin, ta sẽ ghi nó ra Excel:
Mã:
'Ghi No, Module Name, Sub/Function Name, Số dòng code
With Worksheets("ALL")
    .Cells(intWriteRow, 2).Value = intRowCount  'No
    .Cells(intWriteRow, 3).Value = strMdlName   'Module Name
    .Cells(intWriteRow, 4).Value = strProName   'Sub/Function Name
    .Cells(intWriteRow, 5).Value = intCodeNum  'Số dòng code
End With
Sau đó, liên quan tới thông tin ở bảng tổng hợp tóm tắt, dữ liệu sẽ được cập nhật tăng lên.
Tuy nhiên chú ý dữ liệu này vẫn lưu trên các biến số mà chưa ghi ra Excel.
Mã:
'Tổng hợp số lượng Sub/Function, số lượng dòng code
intProTotalNum = intProTotalNum + 1
intCodeTotalNum = intCodeTotalNum + intCodeNum
Cuối cùng thì ta ghi kết quả này vào bảng tóm tắt trên Excel:
Mã:
'Bảng thông tin tóm tắt
Worksheets("ALL").Cells(3, 3).Value = intMdlTotalNum
Worksheets("ALL").Cells(4, 3).Value = intProTotalNum
Worksheets("ALL").Cells(5, 3).Value = intCodeTotalNum
 

giaiphapvba

Administrator
Thành viên BQT
Đây là một chủ đề hay. Có lẽ chúng ta nên khai thác thêm chủ đề, bàn luận thêm về cách quản lý Version sao cho hiệu quả.
Cùng nhau tạo ra các bản thiết kế để dễ quản lý.
Sau đây là một đề xuất:
Bạn cần đăng nhập để thấy đính kèm
 
Top