Khắc phục lỗi Hàm kiểm tra sự tồn tại Module

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

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,908
Em lập một Hàm kiểm tra sự tồn tại của một module, khi chạy nó báo lỗi như hình bên dưới
Module(Err).JPG
Vậy xin hỏi các anh chị cách khắc phục lỗi này.
Chú ý: Trước đây em làm một AddIn có sử dụng hàm này chạy tốt, nhưng với 1 file mới này thì không được?
Xin cảm ơn các anh chị.
 
Bạn thử vào Reference chọn Microsoft Visual Basic for Extensibility Library x.x thử xem sao nhé
 
Upvote 0
Bạn chưa tham chiếu tới đối tượng Microsoft Visual Basic for Extensibility Library x.x
Bạn có thể làm theo cách của thầy: domfootwear hoặc trong thisworkbook tao marco như sau:

Mã:
Private Sub Workbook_Open()
ThisWorkbook.VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}", _
        Major:=5, Minor:=3
End Sub

Bạn có thể dùng hàm kiểm tra module này nhanh hơn:

Mã:
Function ModExists(ByVal YourProject As VBProject, ModName As String) As Boolean

        'Bay loi
        On Error Resume Next

        ModExists = Len(YourProject.VBComponents(ModName).Name) <> 0

End Function

Muốn thao tac nhiều hơn tới mã VBA thì vào topic của mình mà tải file về tham khảo mã trong file mình có để chế độ PassWord nhưng không có gì cứ bấm vào là mở được:
http://www.giaiphapexcel.com/forum/...ỉnh-sửa-Code-trong-VBA-viết-bằng-VBA-và-mã-mở!
Mã:
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử vào Reference chọn Microsoft Visual Basic for Extensibility Library x.x thử xem sao nhé
Cái này em đã có tích chọn rồi
Mã:
Private Sub Workbook_Open()
ThisWorkbook.VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}", _
        Major:=5, Minor:=3
End Sub
Code này báo lỗi, kiểm tra giúp mình với, bạn nói mục đích của nó luôn nhé
Bạn giúp mình thêm trong trường hợp đã đặt mật khẩu VBAProject của mình nhưng vẫn thực hiện được copy hay chèn code được không. Cảm ơn bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Code trên cũng có tác dụng như việc bạn chọn thêm Reference Microsoft Visual Basic for Extensibility Library x.x thôi.
Còn theo báo lỗi của bạn ở bài trên thì là thiếu Reference hoặc có một Hàm Modul đã tồn tại, hoặc đầu module bạn khai báo biến đó là đối tượng khác
P/S: code báo lỗi là do bạn đã chọn Reference rồi
 
Upvote 0
Không để ý câu hỏi sau của bạn, thông cảm nhé!
Trước đây mình có làm trong trường hợp đã đặt mật khẩu VBAProject. Sau này mình muốn mọi thứ đều mã mở nên không dùng nữa. Nhưng giờ tìm mãi không thấy code đâu cả
Để tới chiều tìm trên mạng xem nếu thấy mình sẽ báo!
 
Upvote 0
Không để ý câu hỏi sau của bạn, thông cảm nhé!
Trước đây mình có làm trong trường hợp đã đặt mật khẩu VBAProject. Sau này mình muốn mọi thứ đều mã mở nên không dùng nữa. Nhưng giờ tìm mãi không thấy code đâu cả
Để tới chiều tìm trên mạng xem nếu thấy mình sẽ báo!
Giải pháp mình làm làm lúc đầu lỗi, nhưng quá trình làm mình chẳng biết sao bây giờ được
Giải pháp trước mắc là đưa code vào bảng tính rồi xuất code. cụ thể là (cho dù thấy không hay lắm)
PHP:
Sub CopyCodeModule()
Dim Tmp As String
On Error Resume Next If IsModule(ActiveWorkbook) = True Then Exit Sub
  Tmp = ThisWorkbook.Sheets("Menu").Range("P2").Value
 With ActiveWorkbook.VBProjec
      .VBComponents.Add(vbext_ct_StdModule).Name = "TinhKL"
      .VBComponents("TinhKL").CodeModule.AddFromString Tmp
 End With
End Sub
Vấn đề tiếp theo là đặt mật khẩu cho dự án mới (VBAProject được chèn code)?
 
Upvote 0
Em lập một Hàm kiểm tra sự tồn tại của một module, khi chạy nó báo lỗi như hình bên dưới
View attachment 78316
Vậy xin hỏi các anh chị cách khắc phục lỗi này.
Chú ý: Trước đây em làm một AddIn có sử dụng hàm này chạy tốt, nhưng với 1 file mới này thì không được?
Xin cảm ơn các anh chị.
Hàm bạn làm chẳng hợp lý tí nào cả
Sửa thành vầy:
PHP:
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
Để kiểm tra xem TinhKL đã có chưa, có thể viết thế này:
PHP:
Sub Test()
  If ModExists("TinhKL") Then
    MsgBox "Module này có roi"
  Else
    MsgBox "Module này chua có"
  End If
End Sub
Cách viết trên chẳng cần phải Add thêm gì trong Reference cả
 
Upvote 0
Ah.... còn 1 chiêu nữa ngắn hơn:
PHP:
Function ModExists(ByVal mdName As String) As Boolean
  On Error Resume Next
  ModExists = Not ThisWorkbook.VBProject.VBComponents(mdName) Is Nothing
End Function
Hoặc chạy trên ActiveWorkbook
PHP:
Function ModExists(ByVal mdName As String) As Boolean
  On Error Resume Next
  ModExists = Not ActiveWorkbook.VBProject.VBComponents(mdName) Is Nothing
End Function
 
Upvote 0
Đã tìm thấy bạn kiểm tra xem thử nhé. Chúc thành công!--=0
PHP:
'need reference To VBA Extensibility
'need To make sure that the target project Is the active project

Sub test()
'    UnprotectVBProject Workbooks("Book1.xls"), "password"
    ProtectVBProject Workbooks("Book1.xls"), "password"
End Sub
 
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
    '
    ' Bill Manville, 29-Jan-2000
    '
    Dim VBP As VBProject, oWin As VBIDE.Window
    Dim wbActive As Workbook
    Dim i As Integer
     
    Set VBP = WB.VBProject
    Set wbActive = ActiveWorkbook
     
    If VBP.Protection <> vbext_pp_locked Then Exit Sub
     
    Application.ScreenUpdating = False
     
    ' Close any code windows To ensure we hit the right project
    For Each oWin In VBP.VBE.Windows
        If InStr(oWin.Caption, "(") > 0 Then oWin.Close
    Next oWin
     
    WB.Activate
    ' now use lovely SendKeys To unprotect
    Application.OnKey "%{F11}"
    SendKeys "%{F11}%TE" & Password & "~~%{F11}", True
     
    If VBP.Protection = vbext_pp_locked Then
        ' failed - maybe wrong password
        SendKeys "%{F11}%TE", True
    End If
     
    ' leave no evidence of the password
    Password = ""
    ' go back To the previously active workbook
    wbActive.Activate
     
End Sub
 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub ProtectVBProject(WB As Workbook, ByVal Password As String)
     
    Dim VBP As VBProject, oWin As VBIDE.Window
    Dim wbActive As Workbook
    Dim i As Integer
     
    Set VBP = WB.VBProject
    Set wbActive = ActiveWorkbook
     
    ' Close any code windows To ensure we hit the right project
    For Each oWin In VBP.VBE.Windows
        If InStr(oWin.Caption, "(") > 0 Then oWin.Close
    Next oWin
     
    WB.Activate
    ' now use lovely SendKeys To unprotect
    Application.OnKey "%{F11}"
    SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & Password & "~"
    Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
    WB.Save
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
Upvote 0
Web KT

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

Đếm ngược thời gian

000
Ngày
00
Giờ
00
phút
00
giây
Back
Top Bottom