Liệt kê từ khóa trong một hàm, thủ tục bằng VBA (1 người xem)

  • Thread starter Thread starter VMH0307
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

VMH0307

real women for private encounters
Tham gia
5/8/11
Bài viết
766
Được thích
609
Giới tính
Nữ
Nghề nghiệp
live girls online
Kính gửi: mọi người!
Xin hỏi các Anh, Chị có cách nào để liệt kê được các từ khóa/tên hàm sẵn có của VBA được sử dụng trong 1 hàm, thủ tục tự tạo trong VBA bằng VBA không. (không liệt kê các biến, giá trị, phép tính, chú thích)
ví dụ:
[GPECODE=vb]
Private Sub Demo( a as Range, b as Range) as long
Dim Trung_gian as long
if isnumeric(a) and isnumeric(b) then Trung_gian =a+b
Demo=Trung_gian
End Sub
[/GPECODE]
Thì các từ khóa cần liệt kê: Private, Sub, as, Range, long, Dim, if, isnumeric, then,and, end
Cám ơn các Anh, Chị!
 
Đi download một quyển sách ebook về lập trình VBA.
Giở ra phần liệt kê từ khoá - copy
Giở ra phần liệt kê hàm - copy
Copy 2 phần trên vào thành những strings trong VBA.
Nạp 2 phần trên 1 vào Dictionary Dic1. Phần 1 value 1, phần 2 value 2

Đọc code của hàm muốn khảo sát và dò trong Dic1. Nếu ra 1 thì là từ khoá, 2 thì là hàm; khôg ra gì cả thì là gì gì đó.
 
Upvote 0
Đi download một quyển sách ebook về lập trình VBA.
Giở ra phần liệt kê từ khoá - copy
Giở ra phần liệt kê hàm - copy
Copy 2 phần trên vào thành những strings trong VBA.
Nạp 2 phần trên 1 vào Dictionary Dic1. Phần 1 value 1, phần 2 value 2

Đọc code của hàm muốn khảo sát và dò trong Dic1. Nếu ra 1 thì là từ khoá, 2 thì là hàm; khôg ra gì cả thì là gì gì đó.
Cám ơn bạn, tôi sẽ thử, xong sẽ nhờ bạn và các anh chị xem giúp
 
Upvote 0
Khi bắt đầu duyệt (parse) câu lệnh, bạn cần tạo ra một danh sách những ký tự xác định từ (dấu tống, dấu chấm, phẩy, móc ngoặc, vv...)
Bạn có thể dùng hàm spilt để tách một dòng lệnh ra thành nhiều từ.
Nếu muốn chuyên nghiệp hơn thì dùng RegEx. Trên mạng có nhiều bài điển hình dùng JavaScript hoặc Perl để đọc câu lệnh và phân tích thành từ khoá. Lưu ý là các ngôn ngữ mới không cần dùng Dictionary vì chúng có rất ít từ khoá, nhưng VBA thì khác, có rất nhiều từ khoá.
 
Upvote 0
Kính gửi: mọi người và anh/chị VetMini
Do trong phạm vi trình độ và nhận thức giới hạn hiện tại, theo hướng dẫn của anh/ chị VetMini tôi thực hiện theo cách sau:
1. Hàm lấy nội dung của thủ tục/ hàm trong module
[GPECODE=vb]
Function CopyCodeProc(NameModule As String, NameProc As String) As String
On Error GoTo EndSub:
Dim StartLine As Long, CountLine As Long
Dim ID_Module As LongDim VBACode As CodeModule
Set VBACode = ThisWorkbook.VBProject.VBComponents(NameModule).CodeModule
If NameProc <> vbNullString Then
With VBACode
StartLine = .ProcBodyLine(NameProc, vbext_pk_Proc)
CountLine = .ProcCountLines(NameProc, vbext_pk_Proc)
CopyCodeProc = .Lines(StartLine, CountLine)
End With
Else
With VBACode
StartLine = 1
CountLine = .CountOfLines
CopyCodeProc = .Lines(StartLine, CountLine)
End With
End If
EndSub:
If Err <> 0 Then MsgBox Err.Description, vbCritical, Err.Number
Set VBCode = Nothing
End Function
[/GPECODE]
2. Tôi liệt kê các từ khóa (key word, function, Command, Method...) vào Sheet1[A1:B137] (chưa thống kê được tất cả).
3. Sử dụng hàm sau để so sánh và tìm ra từ khóa, giá trị trả về là chuỗi.
[GPECODE=vb]
Function FilterCodeWord(NameModule As String, NameProc As String)
Dim MyDic As Object, MyResult As Object, TmpArr, CodeArr, MyString As String, ResultArr(), n As Integer, iWord
On Error Resume Next
Set MyDic = CreateObject("Scripting.Dictionary")
Set MyResult = CreateObject("Scripting.Dictionary")
'Nap Dic
With MyDic
TmpArr = Sheets("Sheet1").Range("A1:B137").Value2
For iRow = 1 To UBound(TmpArr, 1)
.CompareMode = vbTextCompare
.Add TmpArr(iRow, 1), TmpArr(iRow, 2)
Next
MyString = CopyCodeProc(NameModule, NameProc)
MyString = Replace(MyString, Chr(13), " ")
CodeArr = Split(MyString, " ")
For iWord = 0 To UBound(CodeArr)
If .Exists(CodeArr(iWord)) Then
MyResult.Add CodeArr(iWord), .Item(CodeArr(iWord))
End If
Next
End With
FilterCodeWord = Join(MyResult.Keys, Chr(13))
Set MyResult = Nothing
Set MyDic = Nothing
End Function
[/GPECODE]
4. Thủ tục chạy thử
[GPECODE=vb]
Sub Test()
Dim CodeString As String
MsgBox "Code la:" & Chr(13) & CopyCodeProc("MyCode", "Demo")
MsgBox "Tu khoa la: " & Chr(13) & FilterCodeWord("MyCode", "Demo")
End Sub
[/GPECODE]
Hạn chế:
- Tôi sử dụng dấu cách " " để phân biệt từ từ trong code nên sẽ không phân biệt được một số từ khóa, ví dụ; End với End Sub, End If..., for với for each...
- Kết quả trả về chưa liệt kê hết, ví dụ phần test trên phải cho ra 5 từ khóa (Sub, as, String, Dim, Msgbox, End Sub) nhưng kết quả trả về mới có 3 từ khóa (Sub, As, String). Hiện tôi chưa biết sửa ra sao.
Vậy rất mong nhận được sự giúp đỡ của các Anh, Chị!
 

File đính kèm

Upvote 0
Nếu không dùng RegEx thì sử dụng kỹ thuật căn bản để tách từ như sau:

Trước khi dùng hàm Split:
- Dùng hàm Replace để đổi tất cả dấu chấm, dấu phẩy, dấu ngoặc, ... thành ra dấu cách
- Dùng hàm Application.Trim để giảm tất cả các dấu cách liền nhau thành 1 dấu cách

RegEx có cách tách từ riêng của nó.

Lưu ý: VBA không phân biệt ký tự viết hoa hay thường. Vì vậy nếu tra từ thì LUÔN LUÔN đổi chúng về một dạng hoa hay thường đều được, nhưng phải thống nhất.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không dùng RegEx thì sử dụng kỹ thuật căn bản để tách từ như sau:

Trước khi dùng hàm Split:
- Dùng hàm Replace để đổi tất cả dấu chấm, dấu phẩy, dấu ngoặc, ... thành ra dấu cách
- Dùng hàm Application.Trim để giảm tất cả các dấu cách liền nhau thành 1 dấu cách

RegEx có cách tách từ riêng của nó.

Lưu ý: VBA không phân biệt ký tự viết hoa hay thường. Vì vậy nếu tra từ thì LUÔN LUÔN đổi chúng về một dạng hoa hay thường đều được, nhưng phải thống nhất.
Cám ơn bạn.
Còn vấn đề đó là: nếu sử dụng dấu cách để tách từ thì không phân biệt được các từ khóa bản thân nó có dấu cách ví dụ: End với End Sub, End If, End With... hoặc for với for each, Do với Do Until, Loop với Loop Until, Error với on Error.... v.v.
Xin ý kiến của bạn và mọi người về hướng giải quyết vấn đề này.
 
Upvote 0
Trước khi tách, đổi tất cả những "End " (có dấu cách phía sau) thành "End_". Như vậy End Sub sẽ thành End_Sub
Lúc tra Dic thì đổi lại.

Tương tự như thế với Exit, On, ...
 
Upvote 0
Trước khi tách, đổi tất cả những "End " (có dấu cách phía sau) thành "End_". Như vậy End Sub sẽ thành End_Sub
Lúc tra Dic thì đổi lại.

Tương tự như thế với Exit, On, ...
Vâng, cám ơn bạn. Vậy nhìn chung vẫn là việc sử lý kỹ thuật bằng đối chiếu, so sánh từ danh sách từ khóa tự lập, như vậy thì tôi có thể thực hiện được. Xin hỏi có "công nghệ" hay Script hay có object nào cho phép hỗ trợ việc này trong vba không?
 
Upvote 0
Vâng, cám ơn bạn. Vậy nhìn chung vẫn là việc sử lý kỹ thuật bằng đối chiếu, so sánh từ danh sách từ khóa tự lập, như vậy thì tôi có thể thực hiện được. Xin hỏi có "công nghệ" hay Script hay có object nào cho phép hỗ trợ việc này trong vba không?

Trên mạng có cả đống code JavaScript làm việc này.
Nếu muốn cao cấp thì vào các diễn đàn chuyên Linux mà xin code Perl. Perl mới là ngôn ngữ chuyên nghiệp về parse string.

Hình như cái bạn muốn cũng có thể thực hiện qua Reflection. Đến đây thì ngoài giới hạn của tôi.
 
Upvote 0
Không biết mục đích của bạn là gì, nhưng nếu chỉ xét từng chữ riêng biệt thì theo tôi có thể đi theo hướng này

1/ Tách các chữ ra

2/ Viết vào cửa sổ Code VBA

3/ Xét: nếu lỗi thì đó là một thành phần cần tìm (nhưng sẽ vẫn tồn tại một số giá trị riêng biệt như End...), còn nếu không nó là các đối số.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom