Tự động chèn code vào sheet của 1 File Excel

Liên hệ QC

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,070
Được thích
7,992
Nghề nghiệp
Làm đủ thứ
Mình mở chủ đề này để giới thiệu cho các bạn nào quan tâm đến việc tự động chèn code vào 1 file excel nào đó.
Giả định trên file hiện tại có 1 sheet mang tên là "ABC", giờ ta muốn chèn code vào sheet này
Để phát triển thêm ta có thể thay ActiveWorkBook bằng tên của File ta cần chèn code
PHP:
Sub add_code_to_existing_sheet()
Dim CodeLines As Long, sheetCode
   sheetCode = ActiveWorkbook.Sheets("ABC").CodeName
   With ActiveWorkbook.VBProject.VBComponents(sheetCode).CodeModule
        CodeLines = .CountOfLines + 1
        .InsertLines CodeLines, _
            "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & Chr(13) & _
            "     MsgBox ""Code Created"" " & Chr(13) & _
            "End Sub"
    End With
End Sub
Ta cũng có thể tạo ra 1 sheet mới rồi chèn code vào sheet vừa được tạo bằng code bên dưới.
PHP:
Sub add_code_to_NewSheet()
Dim CodeLines As Long
   Sheets.Add
   With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
        CodeLines = .CountOfLines + 1
        .InsertLines CodeLines, _
            "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & Chr(13) & _
            "     msgbox ""Code Created"" " & Chr(13) & _
            "End Sub"
    End With
End Sub
Nếu cần chèn code vào WorkBook ta áp dụng code này
PHP:
Sub add_code_to_thisworkbook()
Dim CodeLines As Long
   With ActiveWorkbook.VBProject.VBComponents("Thisworkbook").CodeModule
        CodeLines = .CountOfLines + 1
        .InsertLines CodeLines, _
            "Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)" & Chr(13) & _
            "     msgbox ""Code Created"" " & Chr(13) & _
            "End Sub"
    End With
End Sub
Nếu cần thêm 1 module mới rồi chèn code vào module này thì ta làm như code bên dưới.
Chú ý: Để chèn được Module thì phải vào Tools, tìm và chọn mục Microsoft Visual Basic for Appliations extensibility 5.3
Hoặc khi viết code đến dòng ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) thì Excel sẽ tự động hỏi mình có muốn chọn mục này hay không.
PHP:
Sub Add_Module_and_Code()
Dim CodeLines As Long, VBComp
   Set VBComp = ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
   With ActiveWorkbook.VBProject.VBComponents(VBComp.Name).CodeModule
        CodeLines = .CountOfLines + 1
        .InsertLines CodeLines, _
            "Sub Add_Module_and_Code" & Chr(13) & _
            "     msgbox ""Code Created"" " & Chr(13) & _
            "End Sub"
    End With
End Sub

Hy vọng là bài viết hữu ích cho những bạn mới học VBA
 
Lần chỉnh sửa cuối:
Hì hì, nó True là tốt rồi :)
Mở regedit, tới HKLM, Policies\Office\xxx\Excel đấy, xóa nó hay cho nó về 0 đi, rồi test lại thử bạn.
 
Upvote 0
Hì hì, nó True là tốt rồi :)
Mở regedit, tới HKLM, Policies\Office\xxx\Excel đấy, xóa nó hay cho nó về 0 đi, rồi test lại thử bạn.
OK ròi đó ............. nhưng có 2 cái rắc rối:

1/ Làm mờ Trust Access .......... khắc phục đơn giản sử dụng code xóa nó đi ..........xong
2/ Phải Run As mới chịu .............. cái này tính sao khi UAC đang cao hay chạy dưới quyền Administrtor ???????!!!!!

hóng tiếp
 
Upvote 0
Thật ra mấy vụ này nếu có thời gian thì nghiên cứu cho vui, cứ coi như là tập thể dục cho bộ não thôi. Căn bản là vọc xong rồi quên mất tiêu. Mấy đoạn code mình viết đã từng chạy rần rần giờ xem lại hỏng biết mình đã viết cái quái gì trong đó.
 
Upvote 0
Hì hì, không phải vô hiệu hóa, mà là luôn enable hay disable không cho user can thiệp, thay đổi trong Trust Center dialog.
Đây là cơ chế policy của Windows và Office thôi.
MSO.dll khi phát hiện có key của AccessVBOM trong Policy registry thì nó sẽ check/uncheck checkbox đó và disable nó đi, không cho user can thiệp.
Nó làm việc này trong MsoFWndProc export function.
PS: Về cái vụ "mèo què" (malwares) và virus, tui cũng có biết chút chút :)
https://kaspersky.proguide.vn/kinh-nghiem-thu-thuat/cach-nhan-biet-co-dinh-ma-doc-ddos-hay-khong/
 
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, không phải vô hiệu hóa, mà là luôn enable hay disable không cho user can thiệp, thay đổi trong Trust Center dialog.
Đây là cơ chế policy của Windows và Office thôi.
MSO.dll khi phát hiện có key của AccessVBOM trong Policy registry thì nó sẽ check/uncheck checkbox đó và disable nó đi, không cho user can thiệp.
Nó làm việc này trong MsoFWndProc export function.
PS: Về cái vụ "mèo què" (malwares) và virus, tui cũng có biết chút chút :)
https://kaspersky.proguide.vn/kinh-nghiem-thu-thuat/cach-nhan-biet-co-dinh-ma-doc-ddos-hay-khong/
Cái hay của nó nếu ta đăng nhập với quyền Admin thì ta có thể vô hiệu Hóa Trust Access ... lại với Các User khác không làm gì được hết :D
http://svkit.com/joomla/index.php/w...isual-basic-project-word-excel-macro-security
Capture.PNG

Còn bài 64 câu 2 ý Bạn tính sao ................... có mằn được không đó ?! :eek::p ............ Hay Next
 
Upvote 0
Hì hì, với tui tới đây là được rồi, tui không thích phải dùng API để viết 1 đống code để nâng quyền current user lên.
Thế thôi, stop here :)
 
Upvote 0
Thế code này khác gì so với code của tôi ở bài 25?
Ở đây người ta muốn có cách nào đó hoàn hảo hơn chứ vẫn sendkeys thì nói làm gì nữa

Anh thử cách này xem. Tại em gà mờ nên chỉ biết dùng cái nào được là ok thôi ạ:) Cái này nhét trong module chạy được, còn không thì bỏ bỏ cái đoạn code vào file vbs chạy cũng được ạ. Em thấy hoạt động trên máy em, còn trên của các anh chị thì em mù tịt.

Private Sub entrustVBAProject()
On Error Resume Next

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")

Dim strRegPath
Dim Application_Version
Application_Version = "15.0"
strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\AccessVBOM"
WshShell.RegWrite strRegPath, 1, "REG_DWORD"

If Err.Code <> o Then
MsgBox "Error" & Chr(13) & Chr(10) & Err.Source & Chr(13) & Chr(10) & Err.Message
End If

WScript.Quit
End Sub
 
Upvote 0
Lại nhảm nữa
 
Upvote 0
Anh thử cách này xem. Tại em gà mờ nên chỉ biết dùng cái nào được là ok thôi ạ:) Cái này nhét trong module chạy được, còn không thì bỏ bỏ cái đoạn code vào file vbs chạy cũng được ạ. Em thấy hoạt động trên máy em, còn trên của các anh chị thì em mù tịt.

Private Sub entrustVBAProject()
On Error Resume Next

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")

Dim strRegPath
Dim Application_Version
Application_Version = "15.0"
strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\AccessVBOM"
WshShell.RegWrite strRegPath, 1, "REG_DWORD"

If Err.Code <> o Then
MsgBox "Error" & Chr(13) & Chr(10) & Err.Source & Chr(13) & Chr(10) & Err.Message
End If

WScript.Quit
End Sub
Tức là cái này mọi người đã làm hết cả rồi và gặp phải vấn đề:
- Registry có thay đổi
- Mục "Trust access to...." trong Trust Center Settings có thay đổi (nếu ta mở lên bằng tay và nhìn bằng... mắt)
- Nhưng hình như Excel không cập nhật trạng thái, vẫn không thể truy cập vào VBAProject
 
Upvote 0
Tức là cái này mọi người đã làm hết cả rồi và gặp phải vấn đề:
- Registry có thay đổi
- Mục "Trust access to...." trong Trust Center Settings có thay đổi (nếu ta mở lên bằng tay và nhìn bằng... mắt)
- Nhưng hình như Excel không cập nhật trạng thái, vẫn không thể truy cập vào VBAProject
Lát em gửi đoạn code của em dùng anh test thử giúp em nha. Hôm qua em chạy trên máy tính em thấy ok. Cho phép enable macro và trust luôn. Chắc rảnh em đọc thêm vì em cũng cần cái này khi viết cái app nhỏ.
 
Upvote 0
Tức là cái này mọi người đã làm hết cả rồi và gặp phải vấn đề:
- Registry có thay đổi
- Mục "Trust access to...." trong Trust Center Settings có thay đổi (nếu ta mở lên bằng tay và nhìn bằng... mắt)
- Nhưng hình như Excel không cập nhật trạng thái, vẫn không thể truy cập vào VBAProject
Anh thử xem chạy được không ạ. Của em dùng office 2013, Anh chỉ version lại cho phù hợp.

Private Sub Workbook_Open()
Dim WshShell, strVBAWarningsPath, strAccessVBOMPath, Application_Version
Set WshShell = CreateObject("WScript.Shell")

Application_Version = "15.0"
strVBAWarningsPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\VBAWarnings"
WshShell.RegWrite strVBAWarningsPath, 1, "REG_DWORD"

strAccessVBOMPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\AccessVBOM"
WshShell.RegWrite strAccessVBOMPath, 1, "REG_DWORD"

Set WshShell = Nothing
Call vnpWELCOME
End Sub
Private Sub vnpWELCOME()
MsgBox "Welcom you to Forum"
End Sub
 
Upvote 0
Anh thử xem chạy được không ạ. Của em dùng office 2013, Anh chỉ version lại cho phù hợp.

Private Sub Workbook_Open()
Dim WshShell, strVBAWarningsPath, strAccessVBOMPath, Application_Version
Set WshShell = CreateObject("WScript.Shell")

Application_Version = "15.0"
strVBAWarningsPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\VBAWarnings"
WshShell.RegWrite strVBAWarningsPath, 1, "REG_DWORD"

strAccessVBOMPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Excel\Security\AccessVBOM"
WshShell.RegWrite strAccessVBOMPath, 1, "REG_DWORD"

Set WshShell = Nothing
Call vnpWELCOME
End Sub
Private Sub vnpWELCOME()
MsgBox "Welcom you to Forum"
End Sub
Mình cùng thí nghiệm thế này nhé:
1> Đầu tiên bạn Uncheck bằng tay mục "Trust access to..." trong Trust Center Settings
2> Xong, copy code dưới đây cho vào chung code của bạn
Mã:
Function IsVBATrusted() As Boolean
  Application.Volatile
  On Error Resume Next
  IsVBATrusted = Not ThisWorkbook.VBProject Is Nothing
End Function
3> Trên bảng tính, tại cell A1, gõ =IsVBATrusted() ---> Bạn nhận được giá trị FALSE
4> Giờ chạy code của bạn rồi kiểm tra lại kết quả ở cell A1, nếu TRUE thì thành công và ngược lại
---------------------------------------------
Vấn đề là chỗ này đây!
 
Upvote 0
Mình cùng thí nghiệm thế này nhé:
1> Đầu tiên bạn Uncheck bằng tay mục "Trust access to..." trong Trust Center Settings
2> Xong, copy code dưới đây cho vào chung code của bạn
Mã:
Function IsVBATrusted() As Boolean
  Application.Volatile
  On Error Resume Next
  IsVBATrusted = Not ThisWorkbook.VBProject Is Nothing
End Function
3> Trên bảng tính, tại cell A1, gõ =IsVBATrusted() ---> Bạn nhận được giá trị FALSE
4> Giờ chạy code của bạn rồi kiểm tra lại kết quả ở cell A1, nếu TRUE thì thành công và ngược lại
---------------------------------------------
Vấn đề là chỗ này đây!

Anh thử cái này nha. Vì code này dùng để nghiên cứu là chính nên em sẽ xóa sau khi anh lấy về, sợ mấy bạn nào tọc mạch dùng phá hoại thì hơi mệt.
(Lưu ý cái này có kiểm tra macro đã được enable hay chưa, em nghiên cứu tiếp các xử lý nó sau).
 

File đính kèm

Upvote 0
lại ấy ấy nữa Ròi ...""":::":\
 
Upvote 0
Anh thử cái này nha. Vì code này dùng để nghiên cứu là chính nên em sẽ xóa sau khi anh lấy về, sợ mấy bạn nào tọc mạch dùng phá hoại thì hơi mệt.
(Lưu ý cái này có kiểm tra macro đã được enable hay chưa, em nghiên cứu tiếp các xử lý nó sau).
Hàm IsVBATrusted vẫn cho kết quả = FALSE
(mặc dù tôi đã sửa Application.Version cho phù hợp với máy tính của mình)
 
Upvote 0
lại ấy ấy nữa Ròi ...""":::":\
Hai xin lỗi anh làm không được không có nghĩa là người khác làm không được. Em chỉ thảo luận học hỏi tìm phương pháp, còn các anh đang cố để bảo vệ chính kiến của mình thôi. File dưới em đã sửa lỗi cả lỗi báo sendkey và không cần delete sau khi đóng workbook.
 

File đính kèm

Upvote 0
Flow của chương trình như sau
1. Nạp Mở file workbook
2. Tạo một file REG và chạy nó thay đổi trong registry nhằm tạo đánh lừa là cái Policy đã được thiết lập
3. Xóa nó đi, để tránh hiển thị bị mờ.
4. Nạp lại đăng ký cho hai giá trị Macro và Trust. (Bước này không có chắc cũng không sao)
5. Bật cái khung hiển thị thiết lập trong macro (Vì MS nó chỉ active cái Application.Volatile khi khung này được bật)
6. Dùng sendkey OK để tắt nó đi (Để tránh hiển thị chớp nháy thì cho thêm một xử lý kiểm soát, và không cho báo Alert)
7. Để kiểm tra đúng hay chưa em sẽ thêm một add một hàm kiểm tra vào ô A1.
8. Vì ô này chỉ chạy giá trị khi nó được update nên sau khi chèn Fomula thì cần sendkey Enter.

Vậy thôi. Các bác muốn test cũng được, không em cũng không dám làm phiền.
 
Upvote 0
Web KT

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

Back
Top Bottom