HeSanbi
Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
- Tham gia
- 24/2/13
- Bài viết
- 2,848
- Được thích
- 4,635
- Giới tính
- Nam
Hôm nay tôi sẽ chia sẻ cho các bạn phương pháp lập trình VBA cho tệp Office của bạn như Excel, Word, Access, để chính chúng có thể tự động cập nhật và cài đặt phiên bản mới nhất. Mà không cần phải tạo một tệp riêng lẻ để tải và cập nhật.
Phương pháp này nếu các bạn tìm trên mạng thì gần như rất khó tìm thấy. Nếu có tìm được thì sẽ có hướng dẫn tự động nhưng phải qua nhiều bước. Rất rắc rối cho người dùng.
Bài viết này sẽ giúp các bạn tạo một tệp duy nhất, ở đây sẽ ví dụ là tệp Excel chứa mã VBA, và chỉ cần mở và bật macro một lần duy nhất. Còn lại sẽ tự động tìm phiên bản mới qua mạng (API, Cloud) tải về và tự động cài đặt chính chúng, đồng thời tạo một bản sao lưu.
Tại sao cần có phương pháp này để VBA tự động cập nhật cho chính ứng dụng chứa nó?
Giải pháp tận dụng Win32 API để thực hiện các bước là:
Trong tệp add-in OfficeUpdaterProject.xlam bên dưới trong VBA có module A_Center chứa thông tin tải bản cập nhật, và khởi chạy lớp cập nhật.
Trong tệp bao gồm các lớp quan trọng để xử lý với tệp tải về như: hash file, ghi, đọc, giải nén, msgbox, inputBox hỗ trợ tiếng Việt, Dictionary, clsUnicode hỗ trợ nhập tiếng Việt trong mã, JsonConverter để phân tích Json.
Sau khi tải về mở lên, các nút thao tác sẽ nằm trên Ribbon có tên là Thử nghiệm
Nhấn nút Kiểm tra cập nhật, sẽ có thông báo Ballon tại hệ thống. Nhấn Cập nhật ngay, dự án sẽ được cập nhật, và có thông báo nếu có bản mới.
Đường dẫn trả về json để lấy thông tin tải tệp cập nhật:
Đường dẫn để Upload tệp lên cloud:
github.com
Các bạn có thể tự viết mã để thêm các API của riêng bạn mà không phải chỉ Github. Các bạn cần định nghĩa lại url_type và viết mã phân tích phiên bản cho API đó.
Phương thức dưới đây để thực hiện kiểm tra và cập nhật
Toàn bộ mã ở tệp ví dụ bên dưới đã được viết vào Class module, chỉ được biên dịch khi chạy, nên không gây tốn chi phí bộ nhớ.
MsgBox và InputBox hỗ trợ hiển thị tiếng Việt
(Pass VBA là 1)
Sao chép toàn bộ Module và Class Module vào dự án, đổi thông tin tại Module A_Center theo dự án cá nhân của bạn.
Phương pháp này nếu các bạn tìm trên mạng thì gần như rất khó tìm thấy. Nếu có tìm được thì sẽ có hướng dẫn tự động nhưng phải qua nhiều bước. Rất rắc rối cho người dùng.
Bài viết này sẽ giúp các bạn tạo một tệp duy nhất, ở đây sẽ ví dụ là tệp Excel chứa mã VBA, và chỉ cần mở và bật macro một lần duy nhất. Còn lại sẽ tự động tìm phiên bản mới qua mạng (API, Cloud) tải về và tự động cài đặt chính chúng, đồng thời tạo một bản sao lưu.
Tại sao cần có phương pháp này để VBA tự động cập nhật cho chính ứng dụng chứa nó?
1. VBA không thể ghi đè tệp Excel đang mở nếu không xử lý mã đúng phương pháp.
2. VBA có thể tự mở chính nó ở phiên ReadOnly và cập nhật ngược lại cho tệp chính tệp đang mở. Tuy nhiên không tách VBA ra khỏi tiến trình chính thì sẽ tự kết thúc tiến trình theo tệp chính nếu đóng tệp chính để cập nhật.
3. Có thể khởi tạo một Excel ở tiến trình mới tuy nhiên sẽ có cửa sổ trên màn hình, nếu ẩn bởi VBA vẫn tạo ra một nhấp nháy rất khó chịu cho người dùng.
4. Nếu không bỏ unlock tệp tải về thì không thể cập nhật để chạy được.
Giải pháp tận dụng Win32 API để thực hiện các bước là:
1. Tiến trình chính chạy http để tìm kiếm phiên bản mới.
2. Nếu có bản mới thì khởi chạy một ứng dụng Excel mới với CreateObject("Excel.Application") và mở tệp chính với ReadOnly.
3. Đăng ký đối tượng Workbook đó vào ROT để tiến trình tách rời khỏi ứng dụng Excel chính, để không bị đóng theo tiến trình chính.
4. Ở tiến trình mới, chạy mã quét lấy phiên bản mới tải về (giải nén, hoặc truy xuất binary).
5. Dùng API Win32 để bỏ unblock tệp đã giải nén để chạy được khi cài đặt vào Excel.
6. Ở tiến trình mới truy cập tất cả các tiến trình Excel để thoát tệp chính, gỡ cài đặt, ghi đè hoặc tạo bản lưu trữ.
7. Mở tệp phiên bản mới ở tất cả các tiến trình Excel. Và thông báo để hoàn thành.
***Ở tệp ví dụ bên dưới nếu tệp có đang mở chạy trên nhiều tiến trình Excel khác nhau, chương trình tự động vào ROT tìm và truy cập.
Hướng dẫn
Trong tệp add-in OfficeUpdaterProject.xlam bên dưới trong VBA có module A_Center chứa thông tin tải bản cập nhật, và khởi chạy lớp cập nhật.
Trong tệp bao gồm các lớp quan trọng để xử lý với tệp tải về như: hash file, ghi, đọc, giải nén, msgbox, inputBox hỗ trợ tiếng Việt, Dictionary, clsUnicode hỗ trợ nhập tiếng Việt trong mã, JsonConverter để phân tích Json.
Sau khi tải về mở lên, các nút thao tác sẽ nằm trên Ribbon có tên là Thử nghiệm
Nhấn nút Kiểm tra cập nhật, sẽ có thông báo Ballon tại hệ thống. Nhấn Cập nhật ngay, dự án sẽ được cập nhật, và có thông báo nếu có bản mới.
Đường dẫn trả về json để lấy thông tin tải tệp cập nhật:
Đường dẫn để Upload tệp lên cloud:
Releases · SanbiVN/OfficeUpdaterProject
Tự động cập nhật chính dự án Microsoft Office chứa mã VBA - SanbiVN/OfficeUpdaterProject
Các bạn có thể tự viết mã để thêm các API của riêng bạn mà không phải chỉ Github. Các bạn cần định nghĩa lại url_type và viết mã phân tích phiên bản cho API đó.
Các khóa trong json để lấy thông tin cần thiết để thực hiện kiểm tra và cập nhật:
- name: tên dự án không có khoảng trắng
- filename: tên tệp
- version: phiên bản để đối chiếu
- installer_url: đường dẫn tải thông tin hoặc tệp cần cập nhật
- url_type: kiểu đường dẫn tải thông tin là gì, ví dụ: github.api.releases.lastest có nghĩa là tải từ api github tại phiên bản cuối cùng.
- file_compress: tệp có được nén hay không
- path_compress: đường dẫn thư mục trong tệp nén dẫn đến vị trí chứa tệp cần cập nhật
- check_version_in: kiểm tra ở đâu trong dữ liệu được tải về từ github.api.releases.lastest, gồm: tag, title, asset (hoặc tự viết mã thêm)
- file_type: kiểu tệp cần cập nhật là gì, gồm: Excel, Word, Access, PowerPoint, file, ... (hoặc tự viết mã thêm)
- path_location: đường dẫn gốc thay cho đường dẫn tuyệt đối (nếu cần), gồm:
- directory: thư mục cùng với thư mục chứa ứng dụng
- temp: thư mục temp
- local: thư mục local
- programData
- UserProfiles
- Windows
- path_target: đường dẫn dẫn đến vị trí ghi tệp cần cập nhật (nếu có), nếu đường dẫn không có tiền tố thì lấy path_location nối vào.
- path_registry: đường dẫn registry, dùng để ghi và xuất thông tin (nếu cần)
- enabled: on/off, xét xem có cần cập nhật hay không nếu để on.
- modules: các dự án con (nếu có), modules chứa các thông tin như đã liệt kê cho các dự án con cần cập nhật.
Các khóa phụ để dự án được chi tiết hơn:
- title: tiêu đề dự án
- description: thông tin dự án
- group_id: id nhóm
- group_name: tên nhóm
- root: tên gốc chứa dự án
- hash: mã hash của tệp nếu có để đối chiếu
- website: trang web chính
- helps_file: tệp trợ giúp
- helps_url: đường dẫn trợ giúp
- author: người tạo
- status: trạng thái
JavaScript:
Public Const ProjectName = "OfficeUpdaterProject"
Public Const ProjectFileName = "OfficeUpdaterProject"
Public Const projectLibName = "OfficeUpdaterProject"
Public Const ProjectVersion = "1.0"
Public Const projectAuthor = "Sanbi"
Public Const projectGithubRepo = "SanbiVN/" & ProjectName
Private Function JsonProjectUpgrade() As String
Dim s$
s = "["
s = s & " {""" & ProjectName & """: "
s = s & " {"
s = s & " ""name"": """ & ProjectName & ""","
s = s & " ""filename"": """ & ProjectName & ".xlam"","
s = s & " ""version"": """ & ProjectVersion & ""","
s = s & " ""title"": """","
s = s & " ""description"": """","
s = s & " ""group_id"": ""group1"","
s = s & " ""group_name"": """","
s = s & " ""root"": """","
s = s & " ""installer_url"": ""https://api.github.com/repos/" & projectGithubRepo & "/releases/latest"","
s = s & " ""url_type"": ""github.api.releases.latest"","
s = s & " ""file_compress"": false,"
s = s & " ""path_compress"": """","
s = s & " ""check_version_in"": ""tag"","
s = s & " ""file_type"": ""Excel"","
s = s & " ""hash"": ""hashfile"","
s = s & " ""website"": ""https://github.com/" & projectGithubRepo & ""","
s = s & " ""helps_file"": """","
s = s & " ""helps_url"": ""https://github.com/" & projectGithubRepo & ""","
s = s & " ""enabled"": ""on"","
s = s & " ""path_location"": ""directory"","
s = s & " ""path_target"": """","
s = s & " ""path_registry"": """","
s = s & " ""author"": """ & projectAuthor & ""","
s = s & " ""status"": ""none"","
s = s & " ""modules"": []"
s = s & " }"
s = s & " }"
s = s & "]"
JsonProjectUpgrade = s
End Function
Phương thức dưới đây để thực hiện kiểm tra và cập nhật
JavaScript:
Public oaUpdater As z_c1a_AutoUpdater
Sub UpdateProject(Optional onlyCheck As Boolean, Optional ByVal byFile$)
If oaUpdater Is Nothing Then Set oaUpdater = New z_c1a_AutoUpdater
Dim p$, s
p = OfficeAppInfo.CurrentPath
If byFile <> "" Then
s = Split(p, ".")
oaUpdater.Update_From_File byFile, p, ProjectName & "." & s(UBound(s))
Else
oaUpdater.update_setup_json JsonProjectUpgrade, p, Not onlyCheck
End If
End Sub
Sub terminateUpdater()
If Not oaUpdater Is Nothing Then Set oaUpdater = Nothing
End Sub
Toàn bộ mã ở tệp ví dụ bên dưới đã được viết vào Class module, chỉ được biên dịch khi chạy, nên không gây tốn chi phí bộ nhớ.
Tham khảo thêm các lớp bổ trợ trong tệp ví dụ
Cách nhập tiếng Việt nhanh trong mã VBAMsgBox và InputBox hỗ trợ hiển thị tiếng Việt
(Pass VBA là 1)
Sao chép toàn bộ Module và Class Module vào dự án, đổi thông tin tại Module A_Center theo dự án cá nhân của bạn.
File đính kèm
Lần chỉnh sửa cuối:
