Lập trình VBA với Google Drive, OneDrive, DropBox cho Upload-Download-Copy-Move... (2 người xem)

Liên hệ QC

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

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,786
Được thích
10,296
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lưu trữ dữ liệu lên cloud bạn thường dùng các drive phổ biến như Google Drive, OneDrive, DropBox. Nếu phần mềm viết bằng Excel VBA hay ngôn ngữ nào đó muốn truy xuất tự động lên các drive thì bạn cần phải biết lập trình. Bài viết này tôi hướng dẫn bạn lập trình với thư viện Add-in A-Tools rất dễ dàng. Tất cả các ngôn ngữ lập trình cho Windows như VBA/VB6, Delphi, C#, VB.NET, C/C++ hay các ngôn ngữ .NET đều lập trình được với Add-in A-Tools. Bài viết này tôi hướng dẫn bằng ngôn ngữ VBA.

Video hướng dẫn nhanh

Để lập trình với các drive/cloud bạn cần cài đặt Add-in A-Tools tối thiểu v10 ngày 01-03-2025.

Mã nguồn

Nếu đây là lần đầu bạn xem hướng dẫn lập trình VBA cho Google Sheets và Excel Online thì bạn nên xem trước Bài 01- Hướng dẫn lập trình với Google Sheets và Excel Online bằng Excel VBA và Add-in A-Tools

Trước khi lập trình bạn cần nhúng thư viện AddinATools.DLL vào VBAProject trong file của bạn. Cách nhúng như sau.
Trong môi trường VBA, vào menu Tools - > References... check mục "AddinATools.dll"

referencesAddinATools.png

Trong VBA, chọn VBAProject của file bạn muốn viết code, vào menu Insert - > Module (nếu muốn tạo module mới).
Trên đầu module khai báo hằng số MyCloudType để chỉ định loại drive bạn muốn kết nối.
C#:
Private Const MyCloudType = ctGoogleDrive
'Private Const MyCloudType = ctOneDrive
'Private Const MyCloudType = ctDropBox

Tất cả mã nguồn trong bài viết này dùng chung cho cả Google Drive, OneDrive, DropBox.

Kết nối và đọc thông tin tìa khoản
C#:
Sub Drive_AccountInfo()
   Dim MyCloud As New BSCloud
   On Error GoTo lbEnd
   If Not MyCloud.Connected(MyCloudType) Then
      If Not MyCloud.OpenAuthor(Application, MyCloudType, Application.Hwnd) Then Exit Sub
   End If
   Debug.Print MyCloud.Account
   Debug.Print MyCloud.AccountDisplay
   Debug.Print MyCloud.AccountIconLink
lbEnd:
   If Err <> 0 Then
      Debug.Print "Error: " & Err.Description
   End If
   Set MyCloud = Nothing
End Sub
Sau khi chạy thủ tục trên kết quả sẽ là.

Dòng lệnh MyCloud.Connected(MyCloudType) kiểm tra đã kết nối hay chưa.
Dòng lệnh MyCloud.OpenAuthor(...) để mở màn hình hoặc website để đăng nhập và ủy quyền.

Nếu lần đầu kết nối tới drive thì xuất hiện màn hình đăng nhập tài khoản. Đây là giao diện web do hãng cloud cung cấp không phải Add-in A-Tools theo cơ chế đăng nhập và phê duyệt quyền truy cập. A-Tools không biết mật khẩu tài khoản của bạn. Quy trình này hoàn toàn do Google và Microsoft, Dropbox (những dịch vụ cloud mà bạn sử dụng) thực hiện theo giao thức OAuth 2.0 chứ không phải A-Tools tự làm nên bạn cần hiểu A-Tools không thể biết thông tin đăng nhập cũng như không thể tự ý truy cập vào dữ liệu của bạn. Hãy xem bài viết này để hiểu cặn kẽ hơn.

Tùy vào loại drive mà bạn có các màn hình đăng nhập như sau:

gdrive-login.png.aspx
onedrive-login.png.aspx
dropbox-login.png.aspx

Nếu đăng nhập thành công MyCloud nắm giữ điều khiển drive của bạn. Từ điều khiển này bạn có thể lập trình với các tập tin trên drive, lấy và đồng bộ dữ liệu với Google Sheets, Excel Online.
Các dòng lệnh sau đó bạn nhận 3 thông tin gồm: Tài khoản đăng nhập (email); Tên tài khoản; Url tải hình ảnh - avatar.

account-info.png

Mở cửa sổ để nhận thông tin tập tin trên drive

C#:
Sub Drive_OpenFileDialog()
   Dim MyCloud As New BSCloud
   Dim MyFile As BSFileInfo
   On Error GoTo lbEnd
   If Not MyCloud.Connected(MyCloudType) Then
      If Not MyCloud.OpenAuthor(Application, MyCloudType, Application.Hwnd) Then Exit Sub
   End If
   If MyCloud.FileManager.OpenFileDialog(MyFile, atUnknown, , "Title", , Application.Hwnd) Then
      MsgBox MyFile.PathOrID, vbInformation
   End If
lbEnd:
   If Err <> 0 Then
      Debug.Print "Error: " & Err.Description
   End If
   Set MyCloud = Nothing
End Sub

Cấu trúc hàm OpenFileDialog()

C#:
Function OpenFileDialog(FileInfo As BSFileInfo, [AppType As BSAppType = atUnknown], [Filters], [Title As String], [ButtonText As String], [ParentHandle]) As Boolean

Tham số:
+ FileInfo (kiểu BSFileInfo): nhận thông tin của đối tượng được chọn, khi hàm trả về TRUE.
+ AppType (kiểu BSAppType): chỉ định loại tập tin sẽ được chọn. ví dụ aiUnknow (ngầm định) là chọn được tất cả các loại tập tin; atGoogleSheet chỉ chọn loại định dạng của Google Sheets; atExcel chỉ chọn tập tin Excel.... Hãy xem thêm các hằng số trong BSAppType.
+ Filters (Variant): chuỗi mô tả cấu trúc lọc đối tượng. Có thể bỏ qua.
+ Title: (String): tiêu đề hộp thoại.
+ ButtonText (String): tên nút bấm. Có thể là một tên nào đó hoặc chuỗi JSON mô tả các thông tin của nút bấm. Có thể bỏ qua. Ví dụ:
{
"imageIndex":11,
"text":"Mở"
}
+ ParentHandle (Long/LongLong): là handle (điều khiển) của cửa sổ cha. Ví dụ Application.Hwnd. Nếu bỏ qua tham số này sẽ nhận giá trị handle của cửa sổ hiện tại.

(imageIndex là chỉ số ảnh, nhận giá trị từ 0 đến 14. Tài liệu bổ sung sau)

Hàm OpenFileDialog(...) để mở hộp thoại có toàn bộ cấu trúc và các tài nguyên lưu trên tài khoản drive của bạn. Nếu hàm trả về TRUE thì tham số FileInfo sẽ nhận giá trị của tập tin (BSFileInfo.ItemType = itFile) được chọn. Màn hình khi chạy hàm hiển thị như dưới đây (ví dụ với MyCloudType = ctGoogleDrive)

GDrive.png

Sau khi chọn nút "Open"/"Mở" hàm OpenFileDialog() trả thông tin của đối tượng chọn vào biến MyFile có kiểu BSFileInfo.

BSFileInfo là kiểu Type gồm có các trường dữ liệu:

+ PathOrID (String): Đường dẫn - ID của đối tượng. Đây là thông tin được dùng để kết nối hay mở tài nguyên trên cloud
+ Path (String): đường dẫn hình thức trên drive (theo tên đối tượng, không phải ID)
+ Name (String): Tên của đối tượng
+ FullName (String): đường dẫn đầy đủ trên drive
+ AppType (BSAppType): loại ứng dụng mở, ví dụ atGoogleSheets, atGoogleDocs, atExcel,...)
+ CloudType (BSCloudType): loại cloud lưu trữ (ctGoogleDrive, ctOneDrive, ctDropBox)
+ ItemType (BSCloudItemType): loại đối tượng, ví dụ itFolder, itFile
+ Ext (String): phần mở rộng tập tin, ví dụ .xlsx, .xlsxb, .jpg,...
+ MimeType (String): tên định dạng của đối tượng
+ UrlDownload (String): đường link tải đối tượng
+ UrlWeblink (String): đường link mở trên trình duyệt để xem, soạn thảo. Dùng cho Google Sheets, Excel Online.
+ Size (Variant/Long/LongLong): kích thước tập tin tính bằng byte.
+ CloudPath (String): đường dẫn trên drive.
+ CreationDate (Date): ngày giờ tạo đối tượng.
+ ModifiedDate (Date): ngày giờ thay đổi nội dung đối tượng.

BSAppType là kiểu Enum gồm các hằng số:
atUnknown = 0;
atExcel = 1;
atWord = 2;
atPowerpoint = 3;
atAccess = 4;
atGoogleSheets = 5;
atGoogleDocument = 6;
atGooglePPT = 7;

BSCloudTypelà kiểu Enum gồm các hằng số:
ctUnKnown_ = 0;
ctGoogleDrive = 1;
ctOneDrive = 2;
ctDropBox = 3;
BSCloudItemType là kiểu Enum gồm các hằng số:
itFile = 0; (tập tin)
itFolder = 1; (thư mục)
itFolderLevelUp = 2; (đối tượng chọn là [...] để mở thư mục cha)
itRoot = 3; (đường dẫn gốc trên drive)

Dùng hàm SaveFileDialog() - Nhận thông tin folder

C#:
Sub Drive_SaveFileDialog()
   Dim MyCloud As New BSCloud
   Dim MyPath As BSFileInfo
   On Error GoTo lbEnd
   If Not MyCloud.Connected(MyCloudType) Then
      If Not MyCloud.OpenAuthor(Application, MyCloudType, Application.Hwnd) Then Exit Sub
   End If
   If MyCloud.FileManager.SaveFileDialog(MyPath, atUnknown, , "Title", , Application.Hwnd) Then
      MsgBoxW MyPath.FullName, VbMsgBoxStyle.vbInformation, , strUNICODE
   End If
lbEnd:
   If Err <> 0 Then
      Debug.Print "Error: " & Err.Description
   End If
   Set MyCloud = Nothing
End Sub

Sau khi chạy thủ tục trên sẽ hiển thị hộp thoại giống với OpenFileDialog nhưng hàm sẽ trả về thông tin của folder (tức BSFileInfo.ItemType = itFolder) thay vì của tập tin.

Dùng hàm OpenFolderDialog() - Nhận thông tin folder
Hàm này hiển thị hộp thoại chỉ có các folder, khác với OpenFileDialog, SaveFileDialog hiển thị cả folder và tập tin.

C#:
Sub Drive_OpenFolderDialog()
   Dim MyCloud As New BSCloud
   Dim MyPath As BSFileInfo
   On Error GoTo lbEnd
   If Not MyCloud.Connected(MyCloudType) Then
      If Not MyCloud.OpenAuthor(Application, MyCloudType, Application.Hwnd) Then Exit Sub
   End If
   If MyCloud.FileManager.OpenFolderDialog(MyPath, , , Application.Hwnd) Then
      MsgBoxW MyPath.PathOrID, VbMsgBoxStyle.vbInformation, , strUNICODE
   End If
lbEnd:
   If Err <> 0 Then
      Debug.Print "Error: " & Err.Description
   End If
   Set MyCloud = Nothing
End Sub

Sau khi chạy thủ tục trên sẽ xuất hiện hộp thoại để chọn folder

openfolderdialog.png


Lưu ý: sử dụng hộp thoại SaveFileDialog() và OpenFolderDialog() để lấy thông tin folder vào tham số BSFileInfo. Biến này hoặc trường thông tin PathOrID được dùng để đưa vào hàm Upload, Copy, Move để dữ liệu vào đường folder đó.

Ở ví dụ trên khi nhấn nút "Select" sẽ nhận giá trị vào biến MyPath như dưới đây

openfolderdialog-result.png

Bài viết gốc tại đây
Download Add-in A-Tools

Bài viết tiếp theo tôi sẽ hướng dẫn các bạn cách Upload và Download với các drive.
Còn tiếp...
 
Web KT

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

Back
Top Bottom