Bỏ chọn "MISSING: Microsoft Windows Common Controls 6.0 (SP6)" khi khởi động File (1 người xem)

Liên hệ QC

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

ThaiDieuAnh

Thành viên hoạt động
Tham gia
8/8/16
Bài viết
139
Được thích
24
Nghề nghiệp
Xây dựng
Em có file excel có chứa VBA, khi chuyển file sang máy tính khác thì báo lỗi thiếu thư viện. Nếu vào Tools - References và bỏ dòng "MISSING: Microsoft Windows Common Controls 6.0 (SP6)" thì hết lỗi. Em muốn hỏi các anh chị có cách nào khi khởi động file sẽ tự động bỏ chọn dòng trên và không báo lỗi nữa không ạ. Em xin cảm ơn
 
Em có file excel có chứa VBA, khi chuyển file sang máy tính khác thì báo lỗi thiếu thư viện. Nếu vào Tools - References và bỏ dòng "MISSING: Microsoft Windows Common Controls 6.0 (SP6)" thì hết lỗi. Em muốn hỏi các anh chị có cách nào khi khởi động file sẽ tự động bỏ chọn dòng trên và không báo lỗi nữa không ạ. Em xin cảm ơn
Thế sao bạn không bỏ check từ file gốc
 
Upvote 0
Em có file excel có chứa VBA, khi chuyển file sang máy tính khác thì báo lỗi thiếu thư viện. Nếu vào Tools - References và bỏ dòng "MISSING: Microsoft Windows Common Controls 6.0 (SP6)" thì hết lỗi. Em muốn hỏi các anh chị có cách nào khi khởi động file sẽ tự động bỏ chọn dòng trên và không báo lỗi nữa không ạ. Em xin cảm ơn

Nếu bạn bỏ check mà file Excel vẫn chạy bình thường thì bỏ đi cho hết bệnh. Còn bỏ đi mà lỗi là do file Excel này đã dùng tới ActiveX Controls của MSCOMCTL.OCX - Loại này không hỗ trợ trên Office 64-bit nên khi file mở trên Office 64-bit là lỗi.
 
Upvote 0
Upvote 0
e có file excel add-in cung bi lỗi này khi bỏ chọn missing thì vô đc nhưng k biết bỏ chọn trong file gốc bằng cách nào.nhờ các a chỉ giúp voi ah.e cảm on
 
Upvote 0
Khai báo chọn thư viện Microsoft Windows Common Controls 6.0 (SP6) trong Tools là không nhất thiết.

Phần khai báo thư viện chỉ dành cho nhà phát triển (lập trình viên). Hoặc code sử dụng Sự kiện trong thư viện thì mới khai báo.

Trong lập trình cho người dùng cuối thì các khai báo đối tượng phải chuyển thành như sau.


1. Trường hợp khai báo đối tượng bình thường không cần khai báo thư viện:

Vì cách khai báo và code dưới đây dành cho nhà phát triển:

-----------------------
PHP:
''Ví dụ:
Dim XLApp As Excel.Application
Set XLApp = Excel.Application
Set XLApp = New Excel.Application
-----------------------
Nên có thể Chuyển thành đối tượng chung:
PHP:
''Ví dụ:
Dim XLApp As Object
Set XLApp = VBA.GetObject(,"Excel.Application")
Set XLApp = VBA.CreateObject("Excel.Application")
Cách này dành cho người dùng cuối.

Nếu code thuộc trường hợp này thì chuyển tất cả thành khai báo chung, bỏ Check thư viện và chèn đoạn code sau vào mỗi Thủ tục có chứa khai báo liên quan đến Thư viện để chuyển từ lỗi ứng dụng sang một thông báo lỗi:


--------------------
PHP:
''Chèn đoạn này vào Code có sử dụng thư viện
''Lưu ý ComctlLib có nhiều phiên bản nên Guid sẽ khác nhau, vì vậy khi phát triển phải Copy Guid của phiên bản đó với Sub GetReferencesGuid.
Sub ABC()
  On Error GoTo Ends
  If CheckLibrarySYS("MSComctlLib", "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}", 2, 0) = "" Then
    VBA.err.Raise 11111, , "MISSING: Library MSComctlLib"
  End If
  ''------------------------
  ''Code có sử dụng thư viện ở đây
  ''------------------------
Ends:
End Sub

''Copy đoạn code dưới vào một Public Module
Public Function CheckLibrarySYS(LibraryName As String, _
                                GuidAdd As String, _
                                Major As Long, _
                                Minor As Long, _
                 Optional ByVal VBProject As Object) As String
  On Error Resume Next
  If VBProject Is Nothing Then Set VBProject = ThisWorkbook.VBProject
  GoSub Lib
  ThisWorkbook.VBProject.References.AddFromGuid GuidAdd, Major, Minor
  GoSub Lib
Exit Function
Lib:
  Dim Ref As Object ''Reference
  For Each Ref In ThisWorkbook.VBProject.References
    With Ref
       If VBA.LCase(.Name) = VBA.LCase(LibraryName) Then
          CheckLibrarySYS = .FullPath: Exit Function
       End If
    End With
  Next Ref
  On Error GoTo 0
Return
End Function
Sub GetReferencesGuid()
  Dim Ref As Object
  For Each Ref In ThisWorkbook.VBProject.References
    With Ref
      If .GUID <> "" Then _
      Debug.Print ".AddFromGuid "; """" & .GUID & """"; ",Major:=" & .Major; ",Minor:=" & .Minor; "'"; .Name, .FullPath
    End With
  Next Ref
  Application.VBE.Windows("Immediate").Visible = True
End Sub


(Cũng có thể thao tác tay như trường hợp 2 bên dưới)
-----------------
2. Trường hợp bắt buộc khai báo thư viện, khi một đối tượng có bắt sự kiện:

PHP:
''Ví dụ:
Private WithEvents XLApp As Excel.Application
Trường hợp này bắt buộc khai báo thư viện.

Và không thể sửa thành đối tượng chung:

PHP:
''Ví dụ:
Private WithEvents XLApp As Object

Vì sao như vậy?
Vì các sự kiện cần được đảm bảo là khởi tạo trước khi chạy, lúc đó thư viện sẽ mở một luồng bắt sự kiện tới một đối tượng trước.
Nếu khai báo trước thì Thư viện sẽ được biên dịch trước khi code được dịch.


Trường hợp này chỉ có thể thực hiện thao tác tay nếu thư viện không có trong System mà thôi:

Tải về MSCOMCTL.OCX, copy vào Win64 thì c:\Windows\SysWOW64\ không thì c:\Windows\System32\

Mở cmd với quyền Admin copy lệnh dưới đây vào và ấn Enter:

Win32 thì:
regsvr32 MSCOMCTL.OCX
Win64 thì:
cd c:\Windows\SysWOW64\ && regsvr32 MSCOMCTL.OCX

Hoặc Chạy Sub RegistryMSCOMCTL:
PHP:
Sub RegistryMSCOMCTL()
  On Error Resume Next
   Dim sPath$
   sPath = "MSCOMCTL.OCX"
   #If Win64 Then
       VBA.CreateObject("Shell.Application").ShellExecute "cmd.exe", "/c c:\Windows\SysWOW64\Regsvr32 /s " & sPath, 0, "Runas", True
   #Else
       VBA.CreateObject("Shell.Application").ShellExecute "cmd.exe", "/c Regsvr32 /s " & sPath, 0, "Runas", True
   #End If
   ''Muốn cài ở SysWOW64 (nếu có) hoặc System32 tùy ý
End Sub




 
Upvote 0
Web KT

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

Back
Top Bottom