Làm sao đóng được cửa sổ VBA Trust Center bằng code VBA (5 người xem)

Liên hệ QC

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

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,073
Được thích
8,004
Nghề nghiệp
Làm đủ thứ
Mình mở cửa sổ VBA ra thế này nhưng không biết làm sao đóng lại. Nhờ các anh chị hướng dẫn dùm
PHP:
Sub Trigger()
Application.CommandBars.FindControl(ID:=3627).Execute
End Sub
 
Mình mở cửa sổ VBA ra thế này nhưng không biết làm sao đóng lại. Nhờ các anh chị hướng dẫn dùm
PHP:
Sub Trigger()
Application.CommandBars.FindControl(ID:=3627).Execute
End Sub
Dùng cách khác để check vào Trust Access...

Máy mình dùng Office 2010

Mã:
Sub Test()
    Dim oshell As Object
    Set oshell = CreateObject("WScript.Shell")
    oshell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security\AccessVBOM", 1, "REG_DWORD"
    Set oshell = Nothing

End Sub
 
Upvote 0
Mình mở cửa sổ VBA ra thế này nhưng không biết làm sao đóng lại. Nhờ các anh chị hướng dẫn dùm
PHP:
Sub Trigger()
Application.CommandBars.FindControl(ID:=3627).Execute
End Sub

Khi cửa sổ ấy mở lên thì đâu có thao tác gì được nữa. Chỉ có cách:
- Đặt code đóng cửa sổ trong 1 file Excel khác đồng thời khởi động file này trên 1 session khác (mục đích để thoát khỏi sự "khống chế" của cửa sổ Excel Options)
- Có thể dùng các hàm API để đóng cửa sổ (thông qua Handle).

Ví dụ là code này:
Mã:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Const GW_HWNDNEXT = 2
Function CloseWindow(ByVal WinCap As String)
  Dim hWnd As Long
  Dim sTitle As String
  hWnd = FindWindow(vbNullString, vbNullString)
  Do While hWnd <> 0
    sTitle = Space$(255)
    sTitle = Left$(sTitle, GetWindowText(hWnd, sTitle, Len(sTitle)))
    If sTitle Like WinCap Then
      SendMessage hWnd, &H10, 0&, 0&
      Exit Function
    End If
    hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  Loop
End Function
Sub Main()
  Const WinCap = "Trust Center"
  CloseWindow WinCap
End Sub
Thí nghiệm:
- Khởi động file Excel trắng, cho Sub Trigger vào và chạy nó để mở Trust Center
- Xong, khởi động Excel mới (Start\Run, gõ Excel và Enter) ---> Tức mở Excel mớ trên 1 session mới rồi cho code của tôi vào, chạy Sub Main và kiểm tra kết quả
 
Lần chỉnh sửa cuối:
Upvote 0
Sự cố mình đang gặp là thế này. Theo dòng chảy của code thì khi mở file lên thì Sub Auto sẽ kích hoạt.
Sub này sẽ kiểm tra Trust Access và chạy Sub ChangeVBOM. Mặc dù kiểm tra thủ công sẽ thấy mục Trust Access được checked rồi nhưng code không hiểu nên không thể nào thực hiện được Sub CheckReference
và biến bChk sẽ luôn là False nếu ta không mở cửa sổ Trust Access lên.
PHP:
Sub Auto_Open()
   Dim bChk As Boolean
   bChk = IsVBATrusted
   If bChk = False Then ChangeVBOM
   CheckReference
   MsgBox bChk
End Sub
Sub CheckReference()
On Error Resume Next
Dim Script As String, VBIDE As String, AdoRef As String
Script = "{420B2830-E718-11CF-893D-00A0C9054228}"
VBIDE = "{0002E157-0000-0000-C000-000000000046}"
AdoRef = "{B691E011-1797-432E-907A-4D8C69339129}"
ThisWorkbook.VBProject.References.AddFromGuid Script, 1, 0
ThisWorkbook.VBProject.References.AddFromGuid AdoRef, 6, 0
ThisWorkbook.VBProject.References.AddFromGuid VBIDE, 5, 3
End Sub
Sub ChangeVBOM()
  Dim regKey As String
  regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" _
  & Application.Version & "\Excel\Security\AccessVBOM"
  CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
End Sub
Function IsVBATrusted() As Boolean
  Application.Volatile
  On Error Resume Next
  IsVBATrusted = Not ThisWorkbook.VBProject Is Nothing
End Function
Nhưng nếu ta dùng code này để mở cửa sổ Trust Access lên rồi bấm chọn OK thì mọi thứ hoạt động
PHP:
Sub Trigger()
Application.CommandBars.FindControl(ID:=3627).Execute
End Sub
Cho nên file đính kèm khi mở lên lúc nào cũng thông báo tình trạng là False
File trước đính kèm bị nhầm. Các anh chị xem lại file này.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sự cố mình đang gặp là thế này. Theo dòng chảy của code thì khi mở file lên thì Sub Auto sẽ kích hoạt.
Sub này sẽ kiểm tra Trust Access và chạy Sub ChangeVBOM. Mặc dù kiểm tra thủ công sẽ thấy mục Trust Access được checked rồi nhưng code không hiểu nên không thể nào thực hiện được Sub CheckReference
và biến bChk sẽ luôn là False nếu ta không mở cửa sổ Trust Access lên.
PHP:
Sub Auto_Open()
   Dim bChk As Boolean
   bChk = IsVBATrusted
   If bChk = False Then ChangeVBOM
   CheckReference
   MsgBox bChk
End Sub
Sub CheckReference()
On Error Resume Next
Dim Script As String, VBIDE As String, AdoRef As String
Script = "{420B2830-E718-11CF-893D-00A0C9054228}"
VBIDE = "{0002E157-0000-0000-C000-000000000046}"
AdoRef = "{B691E011-1797-432E-907A-4D8C69339129}"
ThisWorkbook.VBProject.References.AddFromGuid Script, 1, 0
ThisWorkbook.VBProject.References.AddFromGuid AdoRef, 6, 0
ThisWorkbook.VBProject.References.AddFromGuid VBIDE, 5, 3
End Sub
Sub ChangeVBOM()
  Dim regKey As String
  regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" _
  & Application.Version & "\Excel\Security\AccessVBOM"
  CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
End Sub
Function IsVBATrusted() As Boolean
  Application.Volatile
  On Error Resume Next
  IsVBATrusted = Not ThisWorkbook.VBProject Is Nothing
End Function
Nhưng nếu ta dùng code này để mở cửa sổ Trust Access lên rồi bấm chọn OK thì mọi thứ hoạt động
PHP:
Sub Trigger()
Application.CommandBars.FindControl(ID:=3627).Execute
End Sub
Cho nên file đính kèm khi mở lên lúc nào cũng thông báo tình trạng là False
File trước đính kèm bị nhầm. Các anh chị xem lại file này.
Đã có ghi thì phải có đọc. Bạn chỉ cần đọc trong registry xem coi nó đã được đánh dấu kiểm hay chưa, nếu chưa (Giá trị là 0) thì lúc đó bạn đánh dấu vào (Giá trị là 1)

Mã:
Sub Auto_Open()
    Dim regKey As String
    regKey = "HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\" & Application.Version & "\Excel\Security\AccessVBOM"
     With CreateObject("WScript.Shell")
        If .regRead(regKey) = 0 Then .RegWrite regKey, 1, "REG_DWORD"
     End With
End Sub
 
Upvote 0
Cũng không cách nào tự động được theo hướng này.
Kiểm tra thủ công thì thấy nó có đánh dấu vào rồi, nhưng code vẫn không hiểu là đang được check mới tức.
 
Upvote 0

File đính kèm

Upvote 0
Hi hi, mình phát hiện ra trong file Hải còn có Sub Workbook_Open() bỏ bớt đi thôi, đánh bom tùm lum vậy?
 
Upvote 0
Tạm thời tìm ra 1 giải pháp, hơi kỳ cục nhưng cũng tạm coi là 1 cách hay khi chưa có cách khác.
Dùng cái này thì đóng được cái cửa sổ Trust Access
PHP:
Sub GetTrustAccess()
   ChangeVBOM
   If Application.Wait(Now + TimeValue("00:00:01") / 100000) Then SendKeys "{ENTER}"
   Application.CommandBars.ExecuteMso ("MacroSecurity")
End Sub
 

File đính kèm

Upvote 0
Tạm thời tìm ra 1 giải pháp, hơi kỳ cục nhưng cũng tạm coi là 1 cách hay khi chưa có cách khác.
Dùng cái này thì đóng được cái cửa sổ Trust Access
PHP:
Sub GetTrustAccess()
   ChangeVBOM
   If Application.Wait(Now + TimeValue("00:00:01") / 100000) Then SendKeys "{ENTER}"
   Application.CommandBars.ExecuteMso ("MacroSecurity")
End Sub

Không thể chấp nhận được. Hải lưu ý trong file của mình có code này:
Mã:
Sub Auto_Close()    Dim strRegKeyName As String
    'Ver = Excel.Application.Version
    strRegKeyName = "Software\Microsoft\Office\" & Excel.Application.Version & "\Excel\Security"
[COLOR=#ff0000]    Call SetKeyDataValue(lngRegKey1ROOT, strRegKeyName, lngKeyDataType, strKeyAccessVBOMName, 0)[/COLOR]
[COLOR=#ff0000]    DeleteRegValue lngRegKey1ROOT, strRegKeyName, strKeyAccessVBOMName[/COLOR]
End Sub
Cho nên khi tắt đi mở lại nó trả về False (hoặc true) nếu trước khi mở file là False (hoặc true) là tất nhiên, Hải hãy tùy biến sử dụng chớ. Hai dòng màu đỏ có thể bỏ đi sẽ thấy.
 
Upvote 0
Máy mình kiểm tra tình trạng không có vấn đề gì hết. Bạn QuangHai xem lại nhé.
 
Upvote 0
Cảm ơn các anh.

Mình đang cảm giác bị đơ đơ sau ấy. Cái óc nó đang xoắn lại. Để thong thả tí sẽ quay lại kiểm tra lại vụ này.
 
Upvote 0
Các anh em dành tí thời gian test giúp theo trình tự sau xem coi tình trạng có giống như mình bị hay không


  1. Mở file của bài 7 lên. Lúc này tình trạng có thể là True hoặc False.
  2. Vào cửa sổ VBE, chọn Tools, Reference và bỏ chọn 3 mục (nếu có): Microsoft Visual Basic for Applications Extensibility, Microsoft Scripting Runtime, Microsoft AtiveX Data >>>Ok
  3. Vào Excel Options, Trust Center > Trust Center Setting > Macro Settings, bỏ chọn Trust Access >>> Ok
  4. Bây giờ vào lại VBE và thử kích hoạt Sub Auto_Open. Theo mong đợi thì sẽ xuất hiện thông báo True nhưng luôn xuất hiện thông báo False và khi kiểm tra các mục Reference (tại 2) thì các mục này chưa được đánh dấu chọn.
  5. Nhưng nếu bây giờ ta vào Excel Option để kiểm tra thì thấy mục Trust Access đã được đánh dấu chọn rồi. Nếu ta chọn Ok để thoát thì lúc này Sub Auto sẽ chạy ào ào, nhưng nếu ta thoát của sổ này bằng phím Cancel thì Sub Auto vẫn tình trạng cũ.
 
Upvote 0
Các anh em dành tí thời gian test giúp theo trình tự sau xem coi tình trạng có giống như mình bị hay không


  1. Mở file của bài 7 lên. Lúc này tình trạng có thể là True hoặc False.
  2. Vào cửa sổ VBE, chọn Tools, Reference và bỏ chọn 3 mục (nếu có): Microsoft Visual Basic for Applications Extensibility, Microsoft Scripting Runtime, Microsoft AtiveX Data >>>Ok
  3. Vào Excel Options, Trust Center > Trust Center Setting > Macro Settings, bỏ chọn Trust Access >>> Ok
  4. Bây giờ vào lại VBE và thử kích hoạt Sub Auto_Open. Theo mong đợi thì sẽ xuất hiện thông báo True nhưng luôn xuất hiện thông báo False và khi kiểm tra các mục Reference (tại 2) thì các mục này chưa được đánh dấu chọn.
  5. Nhưng nếu bây giờ ta vào Excel Option để kiểm tra thì thấy mục Trust Access đã được đánh dấu chọn rồi. Nếu ta chọn Ok để thoát thì lúc này Sub Auto sẽ chạy ào ào, nhưng nếu ta thoát của sổ này bằng phím Cancel thì Sub Auto vẫn tình trạng cũ.

em test tới test lui đâu có gì mới đâu ngoài báo True và False thôi
nếu tích vào Trust Access trước thì báo là True và ngược lại là False
 
Upvote 0
em test tới test lui đâu có gì mới đâu ngoài báo True và False thôi
nếu tích vào Trust Access trước thì báo là True và ngược lại là False
Ặc ặc, sao tình hình này giống như đang rờ voi quá...
Đã nói là không tick vào Trust Access mà... đang muốn cho nó tick tự động. Cho nên mới cần là bỏ tick ra trước rồi mới test code xem coi có báo true được hay không mà.
 
Upvote 0
Ặc ặc, sao tình hình này giống như đang rờ voi quá...
Đã nói là không tick vào Trust Access mà... đang muốn cho nó tick tự động. Cho nên mới cần là bỏ tick ra trước rồi mới test code xem coi có báo true được hay không mà.

Anh xem lại máy hoặc sang máy khác test thử nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom