Làm sao đóng được cửa sổ VBA Trust Center bằng code VBA (1 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,076
Được thích
8,007
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
Ặ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à.

thì em mở môt file bình thường lên bỏ Trust Access đi chạy file bài 7 thì nó báo là False sau đó kiểm tra xem có check chưa thì hỏng thấy
sau đó tắt đi lại mở file mới lên kiểm tra thấy chưa check em lại thử check vô Ok hai lần xong... lại mở file bài 7 lên nó báo là False
Hỏng biết em làm vậy trúng hay trật
 
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ũ.

nếu Anh chỉ check hay ko check thì em sử code bài 5 ok mà
Check
PHP:
Sub Yes_Trust_Access()
    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
Không Check
PHP:
Sub No_Trust_Access()
    Dim regKey As String
    regKey = "HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\" & Application.Version & "\Excel\Security\AccessVBOM"
     With CreateObject("WScript.Shell")
        If .regRead(regKey) = 1 Then .RegWrite regKey, 0, "REG_DWORD"
     End With
End Sub
 
Upvote 0
nếu Anh chỉ check hay ko check thì em sử code bài 5 ok mà
Check
PHP:
Sub Yes_Trust_Access()
    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
Không Check
PHP:
Sub No_Trust_Access()
    Dim regKey As String
    regKey = "HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\" & Application.Version & "\Excel\Security\AccessVBOM"
     With CreateObject("WScript.Shell")
        If .regRead(regKey) = 1 Then .RegWrite regKey, 0, "REG_DWORD"
     End With
End Sub

Đã nói rồi, tình hình là mình đang cùng nhau rờ voi rồi. Với khả năng của mình thì đủ để biết là khi chạy code đăng ký vào Registry thì mục Trust sẽ được check và không check. Vấn đề còn liên quan Sub Reference. Dù đã check nhưng vẫn không chạy được Sub Reference.

Ngày mai tranh thủ ghé chỗ Mạnh để kiểm tra cái vụ lu xu bu này mới được.
 
Lần chỉnh sửa cuối:
Upvote 0
Lạ nhỉ, mình làm theo cách của mình Ok mà không cần tắt Ex đi mở lại, tức là có tác dụng tức thì, chạy được Sub Reference cuar Hải luôn (do sử dụng key trong HKEY_LOCAL_MACHINE)
Hải dùng mấy Office trong máy vậy? Có khi nào nó chạy
Office này mà đăng ký cho Office khác không?
Thử chạy dòng lệnh Msgbox
Excel.Application.Version hoặc Msgbox Application.Version xem.
 
Upvote 0
Lạ nhỉ, mình làm theo cách của mình Ok mà không cần tắt Ex đi mở lại, tức là có tác dụng tức thì, chạy được Sub Reference cuar Hải luôn (do sử dụng key trong HKEY_LOCAL_MACHINE)
Hải dùng mấy Office trong máy vậy? Có khi nào nó chạy
Office này mà đăng ký cho Office khác không?
Thử chạy dòng lệnh Msgbox
Excel.Application.Version hoặc Msgbox Application.Version xem.
Mình đang dùng Office 2010. Để mình kiểm tra thử trên máy khác xem sao. Cũng hơi tức tức.
 
Upvote 0
Mình đang dùng Office 2010. Để mình kiểm tra thử trên máy khác xem sao. Cũng hơi tức tức.

Nó báo TRUE hay FALSE thây kệ nó, miễn kiểm tra References ta thấy các mục đã check là được rồi
Sub Auto_Open nên sửa thành vầy mới đúng:
Mã:
Sub Auto_Open()
   Dim bChk As Boolean
   bChk = IsVBATrusted
   If bChk = False Then ChangeVBOM
   CheckReference
   [COLOR=#ff0000]MsgBox IsVBATrusted[/COLOR]
End Sub
Tóm lại code của anh thanhlanh là OK đó
 
Upvote 0
Đã kiểm tra trên máy tính của kieumanh, (có kieumanh chứng thực) các code trên đều bị giống nhau. Dù có chạy code đăng ký trong registry nhưng nếu không mở cửa số của Excel Option lên thì code nó cốc chịu hiểu. ---> đã thỏa mản vì ít nhất cũng biết có 1 máy giống như mình.
 
Upvote 0
Đã kiểm tra trên máy tính của kieumanh, (có kieumanh chứng thực) các code trên đều bị giống nhau. Dù có chạy code đăng ký trong registry nhưng nếu không mở cửa số của Excel Option lên thì code nó cốc chịu hiểu. ---> đã thỏa mản vì ít nhất cũng biết có 1 máy giống như mình.

Có khi nào liên quan đến UAC không? Kiểm tra lại xem. Nếu nó không được đặt ở mức thấp nhất thì hãy kéo thanh trượt xuống thấp, khởi động máy tính và thử lại code
 
Upvote 0
Có khi nào liên quan đến UAC không? Kiểm tra lại xem. Nếu nó không được đặt ở mức thấp nhất thì hãy kéo thanh trượt xuống thấp, khởi động máy tính và thử lại code
Chính là hắn rồi, phải kéo xuống mức thấp thì ok.
........
Tuy nhiên em đã tìm ra cách không thay đổi UAC nhưng code vẫn có thể hoạt động như ý bằng cách sử dụng SendKeys
Nó đây
PHP:
Sub GetTrustAccess()
SendKeys "{ENTER}", 1 / 10000
Application.CommandBars.ExecuteMso ("MacroSecurity")
End Sub
 
Upvote 0
Chính là hắn rồi, phải kéo xuống mức thấp thì ok.
........
Tuy nhiên em đã tìm ra cách không thay đổi UAC nhưng code vẫn có thể hoạt động như ý bằng cách sử dụng SendKeys
Nó đây
PHP:
Sub GetTrustAccess()
SendKeys "{ENTER}", 1 / 10000
Application.CommandBars.ExecuteMso ("MacroSecurity")
End Sub

Cho dù được thì cách này cũng.. kỳ kỳ sao ấy
Tôi rất ngại khi phải dùng SendKeys, ai mà biết lúc nào nó trở chứng (khi code đang chạy rồi người ta nhảy qua nhảy lại giữa các cửa số chẳng hạn).
Nói chung là khó khống chế cho được chính xác theo ý muốn lắm
 
Upvote 0

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

Back
Top Bottom