[Help] Hàm kiểm tra sự tồn tại của Hàm khác trong code VBA (1 người xem)

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

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

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
729
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Mình đang viết một addin nho nhỏ phục vụ mục đích cá nhân, trong quá trình tạo menu có gọi các hàm. Mình muồn khi gọi sẽ có quá trình kiểm tra xem hàm đó có không, nếu có thì thực thi còn không sẽ báo lỗi bằng msgbox
Mình có tìm trên diễn đàn nhưng không thấy có chỉ có kiểm tra sheet, .... Mong các sư huynh giúp
Cám ơn nhiều ạ
 
Mình đang viết một addin nho nhỏ phục vụ mục đích cá nhân, trong quá trình tạo menu có gọi các hàm. Mình muồn khi gọi sẽ có quá trình kiểm tra xem hàm đó có không, nếu có thì thực thi còn không sẽ báo lỗi bằng msgbox
Mình có tìm trên diễn đàn nhưng không thấy có chỉ có kiểm tra sheet, .... Mong các sư huynh giúp
Cám ơn nhiều ạ
Với các hàm tự tạo, khi ta gõ công thức trong sheet, khi không tồn tại hàm đó, tự động chúng sẽ được thông báo bằng #NAME?. Cho nên không cần phải nhọc công cho hàm kiểm tra này. Còn khi ta dùng thủ tục macro cho hàm đó, bảo đảm sẽ có một msgbox thông báo lỗi.
 
Upvote 0
Em làm phần menu theo hướng dẫn cua anh Duyệt thuộc tính .OnAction = "RunFuntions" sẽ chạy Hàm lấy trên sheet Menu
Vấn đề của em là khi chạy Menu trên nếu có tồn tại hàm sẽ thực thi còn không sẽ báo lỗi không tìm thấy hàm
 
Upvote 0
Mình đang viết một addin nho nhỏ phục vụ mục đích cá nhân, trong quá trình tạo menu có gọi các hàm. Mình muồn khi gọi sẽ có quá trình kiểm tra xem hàm đó có không, nếu có thì thực thi còn không sẽ báo lỗi bằng msgbox
Mình có tìm trên diễn đàn nhưng không thấy có chỉ có kiểm tra sheet, .... Mong các sư huynh giúp
Cám ơn nhiều ạ

Hàm là do bạn tự viết, sao lại có cái vụ phải kiểm tra xem HÀM CÓ HAY KHÔNG là sao? (yêu cầu lạ lùng)
Không có nghĩ là bạn chưa viết ---> Bây giờ sẽ viết
Có rồi thì.. cứ xài
Vậy thôi
 
Upvote 0
Dạ đúng rồi ạ, vì em viết tên menu trên sheet ở một cột và tên hàm ở một cột. Thuộc tính .OnAction = "RunFuntions" sẽ chạy hàm RunFuntions gọi tên hàm trong Sheet. Nếu hàm chưa có sẽ báo bằng msgbox
 
Upvote 0
Lỡ nó có tồn tại, nhưng private và nằm ở module khác thì bạn muốn báo như thế nào? chỉ nói "không có" hay là "có nhưng không gọi được"?
 
Upvote 0
Dạ đúng rồi ạ, vì em viết tên menu trên sheet ở một cột và tên hàm ở một cột. Thuộc tính .OnAction = "RunFuntions" sẽ chạy hàm RunFuntions gọi tên hàm trong Sheet. Nếu hàm chưa có sẽ báo bằng msgbox

Bạn viết add-in, mỗi menu gọi 1 macro do bạn tự tạo nên? Thì bạn biết là đã có hay chưa. Gọi hàm mà ai đó đã viết và bạn đã Insert module? Thế tại sao bạn lại cho OnAction = ABC mà không cho OnAction = XYZ? Vì bạn đã xem code của ABC và thấy nó làm đúng cái việc mà OnAction sẽ phải làm?. Chả nhẽ bạn viết bừa?

Mà thôi. Bạn có 10, 100, 1000 cái menu? Bôi đen tên macro --> Edit --> Find. Nếu tìm thấy thì bạn cũng biết nó ở đâu.
 
Upvote 0
Dạ đúng rồi ạ, vì em viết tên menu trên sheet ở một cột và tên hàm ở một cột. Thuộc tính .OnAction = "RunFuntions" sẽ chạy hàm RunFuntions gọi tên hàm trong Sheet. Nếu hàm chưa có sẽ báo bằng msgbox
Yêu cầu hơi kỳ cục nhưng thôi cứ làm đại theo yêu cầu.
PHP:
Function CheckExistSub(SubName As String) As Boolean
On Error Resume Next
Dim i As Long
With ActiveWorkbook.VBProject
  Do
    i = i + 1
    If .VBComponents(i).Type = 1 Then CheckExistSub = (.VBComponents(i).CodeModule.ProcBodyLine(SubName, vbext_pk_Proc) > 0)
  Loop Until i = .VBComponents.Count Or CheckExistSub
End With
End Function
Lưu ý: Hàm chỉ kiểm tra sự tồn tại của một thủ tục trong các Module ở cùng Workbook với hàm. Nếu muốn mở rộng phạm vi kiểm tra thì bạn tự chỉnh sửa lại nhé.
 
Upvote 0
Ý của em không phải là mình đã biết có hàm đó hay chưa trong Modul của mình, cái vấn đề em cần ở đây là kiểm tra tên hàm trong Modul đó nếu có hoặc đúng tên thi gọi hàm thực thi không sẽ báo lỗi bằng msgbox
 

File đính kèm

Upvote 0
Em có tìm được hàm này trên diễn đàn
'Ham kiem tra su ton tai cua Mode


Function ModExists(ByVal mdName As String) As Boolean
Dim Modul
For Each Modul In ThisWorkbook.VBProject.VBComponents
If Modul.Name = mdName Then
ModExists = True: Exit Function
End If
Next
End Function

If ModExists(ThisWorkbook.Sheets("Menu.Cells(r, 3)")) Then
Application.Run UtilName
Else
GoTo OpenErr
End If

Nhưng nó không chạy, nhờ các anh sửa giúp
 
Lần chỉnh sửa cuối:
Upvote 0
Ý của em không phải là mình đã biết có hàm đó hay chưa trong Modul của mình, cái vấn đề em cần ở đây là kiểm tra tên hàm trong Modul đó nếu có hoặc đúng tên thi gọi hàm thực thi không sẽ báo lỗi bằng msgbox

Bạn đã thử hàm ở bài #8 chưa?
 
Upvote 0
Ý của em không phải là mình đã biết có hàm đó hay chưa trong Modul của mình, cái vấn đề em cần ở đây là kiểm tra tên hàm trong Modul đó nếu có hoặc đúng tên thi gọi hàm thực thi không sẽ báo lỗi bằng msgbox

Nhiệm vụ của bạn là cung cấp đầy đủ các macro. Việc cung cấp này là việc làm trong "design time". Còn nếu muốn hiện hộp thoại báo lỗi (quên làm trong design time?) trong "run time"? Thì chả cần làm gì cả. Nếu không có macro thì tự Excel nó hiển thị hộp thoại thôi. Sao lại có chuyện mua việc khi việc đó "tự" nó sẽ làm?

Tôi nói lại: nếu muốn hiện hộp thoại báo lỗi trong "run time" thì chả cần làm gì cả. Chấm hết.
 
Upvote 0
Bạn đã thử hàm ở bài #8 chưa?

Thằng quên hướng dẫn người ta vào Tools\Reference check check cái gì đó thì làm sao mà chạy được. Còn không thì chuyển luôn hằng số vbext_pk_Proc thành giá trị nào đó luôn đi
Ngoài ra, code cũng sẽ không chạy nếu chưa check mục "Trust access to VBA project" (cái này không phải ai cũng biết)
-----------------
Mà nói chung thì mình thấy yêu cầu của tác giả nó.. buồn cười thế nào ấy (không đủ sức thuyết phục cái sự cần thiết phải có của hàm CheckExist gì gì đó)
 
Upvote 0
Thằng quên hướng dẫn người ta vào Tools\Reference check check cái gì đó thì làm sao mà chạy được. Còn không thì chuyển luôn hằng số vbext_pk_Proc thành giá trị nào đó luôn đi
Ngoài ra, code cũng sẽ không chạy nếu chưa check mục "Trust access to VBA project" (cái này không phải ai cũng biết)
-----------------
Mà nói chung thì mình thấy yêu cầu của tác giả nó.. buồn cười thế nào ấy (không đủ sức thuyết phục cái sự cần thiết phải có của hàm CheckExist gì gì đó)

Em dùng Excel 2007 đâu phải Reference đến cái gì đâu anh. Chỉ có điều đúng là phải check vào mục "Trust access to VBA project"
 
Upvote 0
Em dùng Excel 2007 đâu phải Reference đến cái gì đâu anh. Chỉ có điều đúng là phải check vào mục "Trust access to VBA project"
Chính xác là phải check mục "Microsoft Visual Basic for Application Extensibility"
Thắng kiểm tra lại trong cửa sổ Immediate dòng lệnh ?vbext_pk_Proc xem nó ra cái gì (cho cả 2 trường hợp check hoặc không check Preference trên)
 
Upvote 0
Chính xác là phải check mục "Microsoft Visual Basic for Application Extensibility"
Thắng kiểm tra lại trong cửa sổ Immediate dòng lệnh ?vbext_pk_Proc xem nó ra cái gì (cho cả 2 trường hợp check hoặc không check Preference trên)
Check thì kết quả là 0, không check thì kết quả là chuỗi rỗng. Nhưng em không check thì hàm CheckExistSub ở bài #8 vẫn trả về kết quả đúng. Không biết check vào cái đó có tác dụng gì vậy anh?
 
Upvote 0
Check thì kết quả là 0, không check thì kết quả là chuỗi rỗng. Nhưng em không check thì hàm CheckExistSub ở bài #8 vẫn trả về kết quả đúng. Không biết check vào cái đó có tác dụng gì vậy anh?

Ra rổng là đúng rồi. Ví dụ Thắng gõ tào lao thế này: ?ABC rồi Enter nó cũng ra rổng vậy (vì nó có hiểu ABC là cái cóc khô gì đâu)
vbext_pk_Proc là hằng số riêng do thằng Microsoft Visual Basic for Application Extensibility quy định. Vậy nên không check vào nó đâu có hiểu vbext_pk_Proc là cái gì (giống như không hiểu ABC là cái gì)
Nếu không muốn check preference thì thay vbext_pk_Proc thành số 0
----------
Ví dụ khác:
- Ta sang VB6 lập trình gì đó có liên quan đến Excel
- Ta dùng hằng số xlYes, xlNo, xlGuess (để Sort ấy mà) nhưng lại không check prefereces "Excel Application" thì làm gì code nó biết được mấy hằng số kia là giống gì
- Nếu không có dòng On Error Resume Next thì chắc chắn nó sẽ báo lỗi "Variable not defined" ngay tại mấy hằng số ấy liền
Bởi vì xlYes, xlNo, xlGuess là hằng số riêng chỉ có trong Excel
Nếu không muốn check prefereces "Excel Application" thì bắt buộc phải thay xlGuess bằng số 0, xlYes bằng số 1 và xlNo bằng số 2
Vấn đề tương tự vậy đởi với hằng số vbext_pk_Proc
Vậy thôi!
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom