D
Deleted member 1392
Guest
1. Đặt vấn đề
Mỗi khi chúng ta viết một chương trình hay một Tool cho người khác sử dụng. Mỗi khi có vấn đề, ta thường phải viết lại Code trong Module của Tool hay chương trình đó và gởi cho người sử dụng. Nghĩa là, nếu người sử dụng không có kiến thức về VBA thì họ buộc phải xóa chương trình cũ, tải lại chương trình mới của chúng ta. Thật là phiền toái.
Hôm nay, Tôi sẽ giới thiệu có các bạn một cách giúp chúng ta có thể cập nhật được chương trình thông qua Internet. Nó sẽ giúp các bạn có thể cập nhật File, Module từ xa mà người dùng không cần phải có thao tác nào trong VBA
2. Nội dung
2.1. Nguyên tắc cốt lõi
Chương trình sẽ dùng đường Links bạn gắn sẵn để Download một tiệp tin về và đọc kiểm tra tiệp tin đó để xác định 2 điều:
- Phiên bản hiện tại có phải phiên bản mới nhất chưa?
- Download chương trình mới, Module mới... nếu chưa phải phiên bản mới.
2.2. Cách tiến hành
2.2.1. Các Function
Chúng ta sẽ dùng 2 hàm API URLDownloadToFile và InternetGetConnectedState
- Hàm URLDownloadToFile: Dùng để download file vào đường dẫn cho trước
- Hàm InternetGetConnectedState: Kiểm tra kết nối Internet (
2.2.2. Các thủ tục
Set 2 biến là URL và Path của file cần tải về. Các bạn cần lưu ý, URL phải là dạng Direct link. Để có được link dạng này, các bạn làm theo hướng dẫn bên dưới
Ta sẽ xét hướng dẫn đối với Google Drive:
Mở file cần lấy Link dưới dạng đường dẫn > Mở bằng > Direct Link Creator > Share All and Get Direct Links
Đây là giao diện trong Google Drive
Đây là giao diện trong Direct Link Creator
Kiểm tra, đảm bảo kết nối Internet
Xóa file đã tải về tránh bị lỗi trùng lặp
Nếu tải file thành công, sẽ mở file lên. Đọc và ghi nhận giá trị của 3 dòng đầu tiên vào 3 biến xác định(strVersion, strNameModule, strLinkModule)
- strVersion: Số phiên bản
- strNameModule: Tên File, Module cần tải về
- strLinkModule: URL File, Module cần tải về
Kiểm tra, so sánh với số phiên bản cũ. Tôi đang mặc định để số phiên bản cũ nằm ở ô A1 tại Sheet1
Nếu phát hiện phiên bản mới hơn, Tiến hành thông báo và tải File, Module mới về. Bên dưới code, tôi đang giả sử là nội dung cần Update là cập nhật dữ liệu mới trong Module nên sẽ cần thêm thao tác xóa, nạp Module mới (đoạn code số 48).
(Đây là giao diện file UpdateAuto.txt)
Tại đoạn code số 48, ta sẽ gọi một thủ mới để nạp Module mới.
Quy trình xóa, nạp Module mới (In nghiên là có hoặc không): Lấy tên Module mới > [Đổi tên Module cũ] > Nạp Module mới > [Xóa Module cũ] > [Chạy lệnh gì đó] > Thông báo
Lệnh chạy gì đó: lệnh này tôi đang mặc định với tên thủ tục là "ActionUpdate", các bạn có thể sửa lại
3. Tổng kết
Những gì các bạn vừa đọc phía trên chỉ là một ví dụ nhỏ trong phương pháp cập nhật dữ liệu từ xa qua Internet. Nguyên tắc cốt lõi vẫn là tải file về từ URL cho trước và lấy dữ liệu từ đó. Theo nguyên tắc này, các bạn chỉ cần đưa file cập nhật lên Google Drive theo các phiên bản, sau đó thông báo cho người dùng nhấn nút cập nhật là xong. Điều quan trọng là bạn phải giữ được URL cố định này trong Google Drive, hãy lưu nó ở một Folder riêng và lưu giữ nó. Cách này có thể tùy biến rất nhiều cách khác nhau tùy theo nhu cầu riêng.
Trên đây là những gì được tôi tổng hợp được trong quá trình công tác công việc thực tế. Chính vì lý do đó nên sơ suất trong Code là khó tránh khỏi, rất mong nhận được những phản hồi và đóng góp từ các bạn!
Mỗi khi chúng ta viết một chương trình hay một Tool cho người khác sử dụng. Mỗi khi có vấn đề, ta thường phải viết lại Code trong Module của Tool hay chương trình đó và gởi cho người sử dụng. Nghĩa là, nếu người sử dụng không có kiến thức về VBA thì họ buộc phải xóa chương trình cũ, tải lại chương trình mới của chúng ta. Thật là phiền toái.
Hôm nay, Tôi sẽ giới thiệu có các bạn một cách giúp chúng ta có thể cập nhật được chương trình thông qua Internet. Nó sẽ giúp các bạn có thể cập nhật File, Module từ xa mà người dùng không cần phải có thao tác nào trong VBA
2. Nội dung
2.1. Nguyên tắc cốt lõi
Chương trình sẽ dùng đường Links bạn gắn sẵn để Download một tiệp tin về và đọc kiểm tra tiệp tin đó để xác định 2 điều:
- Phiên bản hiện tại có phải phiên bản mới nhất chưa?
- Download chương trình mới, Module mới... nếu chưa phải phiên bản mới.
2.2. Cách tiến hành
2.2.1. Các Function
Chúng ta sẽ dùng 2 hàm API URLDownloadToFile và InternetGetConnectedState
- Hàm URLDownloadToFile: Dùng để download file vào đường dẫn cho trước
- Hàm InternetGetConnectedState: Kiểm tra kết nối Internet (
Bạn cần đăng nhập để thấy link
)
Mã:
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As LongPtr) As LongPtr
Private Declare PtrSafe Function InternetGetConnectedState Lib "wininet.dll" (lpdwFlags As LongPtr, ByVal dwReserved As Long) As Boolean
'//DOWNLOAD FILE TU DUONG DAN CHO TRUOC
Public Function DownloadFile(URL As String, SavePath As String) As Boolean
#If VBA7 Then
Dim myResult As LongPtr
#Else
Dim myResult As Long
#End If
myResult = URLDownloadToFile(0, URL, SavePath, 0, 0)
DownloadFile = (myResult = 0)
End Function
'//KIEM TRA KET NOI INTERNET
Public Function GetInternetConnectedState() As Boolean
GetInternetConnectedState = InternetGetConnectedState(0&, 0&)
End Function
Set 2 biến là URL và Path của file cần tải về. Các bạn cần lưu ý, URL phải là dạng Direct link. Để có được link dạng này, các bạn làm theo hướng dẫn bên dưới
Ta sẽ xét hướng dẫn đối với Google Drive:
Mở file cần lấy Link dưới dạng đường dẫn > Mở bằng > Direct Link Creator > Share All and Get Direct Links
Bạn cần đăng nhập để thấy hình ảnh
Đây là giao diện trong Google Drive
Bạn cần đăng nhập để thấy hình ảnh
Đây là giao diện trong Direct Link Creator
Mã:
'Dây là URL ví dụ, các bạn có thể thay đổi thành URL của mình
LinksDownload = "https://docs.google.com/uc?export=download&id=1ZUKzhxKOixsuyydtW6IillWHMmHHtg8z"
PathDownload = Environ("Temp") & "UpdateAuto.txt"
Mã:
If GetInternetConnectedState = False Then
Msgbox "Please connect to the internet", vbOk + vbInformation
Exit Sub
End If
Mã:
If FSO.FileExists(PathDownload) Then FSO.DeleteFile (PathDownload)
- strVersion: Số phiên bản
- strNameModule: Tên File, Module cần tải về
- strLinkModule: URL File, Module cần tải về
Kiểm tra, so sánh với số phiên bản cũ. Tôi đang mặc định để số phiên bản cũ nằm ở ô A1 tại Sheet1
Nếu phát hiện phiên bản mới hơn, Tiến hành thông báo và tải File, Module mới về. Bên dưới code, tôi đang giả sử là nội dung cần Update là cập nhật dữ liệu mới trong Module nên sẽ cần thêm thao tác xóa, nạp Module mới (đoạn code số 48).
Mã:
If DownloadFile(LinksDownload, PathDownload) Then
'//MO FILE UPTEDATE
i = 1
Open PathDownload For Input As #1
While Not EOF(1)
Line Input #1, TxtRow
'//NAP CAC GIA TRI DOC DUOC TU TXT VAO BIEN
If i = 1 Then
lngInItr = InStr(TxtRow, "Version: ")
If lngInItr <> 0 Then strVersion = Replace(TxtRow, "Version: ", "")
ElseIf i = 2 Then
lngInItr = InStr(TxtRow, "Name Module: ")
If lngInItr <> 0 Then strNameModule = Replace(TxtRow, "Name Module: ", "")
ElseIf i = 3 Then
lngInItr = InStr(TxtRow, "Links: ")
If lngInItr <> 0 Then strLinkModule = Replace(TxtRow, "Links: ", "")
End If
i = i + 1
Wend
Close #1
With Sheets("Sheet1").Range("A1")
'//KIEM TRA VERSION
If .Value >= CDbl(strVersion) Then
MsgBox "You are using the latest version: " & .Value
Exit Sub
Else
'//NEU LA PHIEN BAN CU THI UPDATE
If MsgBox("Last version: " & .Value & vbNewLine & "New version: " & strVersion & vbNewLine & "Do you want to update to new version?", vbOKCancel + vbQuestion) <> vbOK Then Exit Sub
'//SET DUONG DAN FILE
PathDownloadMod = Environ("Temp") & strNameModule
'//BAY LOI
If FSO.FileExists(PathDownloadMod) Then FSO.DeleteFile (PathDownloadMod) 'Neu file *.bas ton tai thi xoa no di
'//BAY LOI
If DownloadFile(strLinkModule, PathDownloadMod) = False Then
MsgUni UniVBA("Error download")
Exit Sub
Else
'//UPDATE
Call Update(PathDownloadMod)
.Value = CDbl(strVersion)
End If
End If
End With
End If
Bạn cần đăng nhập để thấy hình ảnh
(Đây là giao diện file UpdateAuto.txt)
Tại đoạn code số 48, ta sẽ gọi một thủ mới để nạp Module mới.
Quy trình xóa, nạp Module mới (In nghiên là có hoặc không): Lấy tên Module mới > [Đổi tên Module cũ] > Nạp Module mới > [Xóa Module cũ] > [Chạy lệnh gì đó] > Thông báo
Lệnh chạy gì đó: lệnh này tôi đang mặc định với tên thủ tục là "ActionUpdate", các bạn có thể sửa lại
Mã:
Sub Update(ByRef vPath As Variant)
Dim vPathUpdate, sNameModule, Buf, CacheMod As Variant
Dim strLineTMP As String
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
CacheMod = "CacheMode"
'CHON FILE UPDATE
vPathUpdate = vPath
'LAY TEN MODULE FILE .BAS DUOC CHON
Open vPathUpdate For Input As #1
While Not EOF(1)
Line Input #1, Buf
strLineTMP = InStr(Buf, "Attribute VB_Name = """)
If strLineTMP <> 0 Then sNameModule = Right(Replace(Buf, "Attribute VB_Name = """, ""), Len(Replace(Buf, "Attribute VB_Name = """, "")) - 1)
Wend
Close #1
'DOI TEN MODULE CU
On Error Resume Next
ThisWorkbook.VBProject.VBComponents(sNameModule).Name = CacheMod
On Error GoTo 0
'NAP MODLE MOI
Workbooks(ThisWorkbook.Name).VBProject.VBComponents.Import (vPathUpdate)
'XOA MODULE CU
On Error Resume Next
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(CacheMod)
'CHAY LENH SETUP
Application.Run "'" & ThisWorkbook.Name & "'!" & "ActionUpdate"
On Error GoTo 0
'THONG BAO HOAN THANH
Msgbox "Completed" & FSO.GetBaseName(vPathUpdate), vbInformation + vbOKOnly
End Sub
3. Tổng kết
Những gì các bạn vừa đọc phía trên chỉ là một ví dụ nhỏ trong phương pháp cập nhật dữ liệu từ xa qua Internet. Nguyên tắc cốt lõi vẫn là tải file về từ URL cho trước và lấy dữ liệu từ đó. Theo nguyên tắc này, các bạn chỉ cần đưa file cập nhật lên Google Drive theo các phiên bản, sau đó thông báo cho người dùng nhấn nút cập nhật là xong. Điều quan trọng là bạn phải giữ được URL cố định này trong Google Drive, hãy lưu nó ở một Folder riêng và lưu giữ nó. Cách này có thể tùy biến rất nhiều cách khác nhau tùy theo nhu cầu riêng.
Trên đây là những gì được tôi tổng hợp được trong quá trình công tác công việc thực tế. Chính vì lý do đó nên sơ suất trong Code là khó tránh khỏi, rất mong nhận được những phản hồi và đóng góp từ các bạn!