kiến thức [Office VBA] Tương tác với SharePoint và giải quyết một số yêu cầu thường thấy của người dùng

NguyenDang95

Senior Member
Giới thiệu sơ lược về SharePoint:
SharePoint là một hệ thống quản lý tài liệu, trang web nội bộ, làm việc cộng tác được nhiều doanh nghiệp ứng dụng rộng rãi trên thế giới. Theo như Microsoft mô tả, SharePoint cho phép (nguồn: SharePoint là gì - Microsoft):
  • Dựng site mạng nội bộ, rồi tạo trang, thư viện tài liệu và danh sách.
  • Thêm phần web để tùy chỉnh nội dung của bạn.
  • Hiển thị hình ảnh trực quan, tin tức và cập nhật quan trọng với site nhóm hoặc giao tiếp.
  • Khám phá, theo dõi và tìm kiếm site, tệp cùng mọi người trong toàn công ty.
  • Quản lý công việc hàng ngày của bạn với quy trình, biểu mẫu và danh sách.
  • Đồng bộ và lưu trữ tệp trong đám mây để bất cứ ai cũng có thể làm việc bảo mật với bạn.
  • Bắt đầu trên tin tức on-the-go với ứng dụng dành cho thiết bị di động.
Bắt tay vào viết macro:
Qua thực tế công việc, người dùng thường mong muốn những ứng dụng Office như Excel hay Outlook có thể tương tác tự động với SharePoint ở một chừng mực nào đó, và tất nhiên chúng ta sẽ phải phụ thuộc vào VBA được tích hợp vào các ứng dụng Office. Mặc dù VBA đã có tuổi đời gần 30 năm (xuất hiện từ năm 1993) và tỏ ra cũ kỹ cũng như không thân thiện với môi trường internet (đây là lý do tại sao Microsoft đã ngừng phát triển tính năng VBA và thay vào đó tìm đến một ngôn ngữ đa nền tảng như JavaScript, TypeScript, hiện đang có Office JS và Office Scripts), tuy vậy với những công cụ sẵn có hiện tại, người dùng có thể viết một macro VBA tương tác với một dịch vụ trực tuyến nào đó thông qua REST API nhằm mục đích như tiêu đề bài viết này chẳng hạn.

Microsoft xây dựng Graph API làm nền tảng lập trình kết nối đến các dịch vụ trực tuyến (vd: OneDrive, Team, Outlook on the web, v.v), để viết được macro VBA tương tác với nó, trước hết chúng ta cần ngâm cứu tài liệu: Get access on behalf of a user
Sau khi ngâm cứu kỹ tài liệu cũng như tiến hành đăng ký tài khoản Azure, lấy các thông tin cần thiết, chúng ta có thể viết một macro VBA với những chức năng như sau:
  • Xin quyền truy cập vào tài nguyên của tài khoản người dùng.
  • Lấy access token và đổi lấy access token mới khi access token cũ hết hạn.
  • Dùng access token để tương tác với SharePoint trong thẩm quyền mà người dùng đã đồng ý trao cho.
Như vậy, chúng ta sẽ viết code như sau (lưu ý: sẽ có nhiều cách viết khác nhau, cách viết trong bài này chỉ là một trong số đó):
Class Module MicrosoftGraphOAuth2:

Code:
Option Explicit

Private m_ApplicationName As String
Private m_ClientId As String
Private m_ClientSecret As String
Private m_Scope As Variant
Private m_AccessToken As String
Private m_FileResources As FileResources

Public Property Get FileResources() As FileResources
   Set FileResources = m_FileResources
End Property

Public Property Set FileResources(Value As FileResources)
   Set m_FileResources = Value
End Property

Public Property Get ApplicationName() As String
    ApplicationName = m_ApplicationName
End Property

Public Property Let ApplicationName(Value As String)
    m_ApplicationName = Value
End Property

Public Property Get ClientId() As String
    ClientId = m_ClientId
End Property

Public Property Let ClientId(Value As String)
    m_ClientId = Value
End Property

Public Property Get ClientSecret() As String
    ClientSecret = m_ClientSecret
End Property

Public Property Let ClientSecret(Value As String)
    m_ClientSecret = Value
End Property

Public Property Get Scope() As Variant
    Scope = m_Scope
End Property

Public Property Let Scope(Value As Variant)
    m_Scope = Value
End Property

Public Property Get AccessToken() As String
    AccessToken = m_AccessToken
End Property

Public Property Let AccessToken(Value As String)
    m_AccessToken = Value
End Property

Public Sub AuthorizeOAuth2()
    Dim objWinHttp As WinHttp.WinHttpRequest
    Dim strRequestBody As String
    Dim strURL As String
    Dim objReg As RegistryUtility
    Dim strAuthorizationCode As String
    Dim objFSO As Scripting.FileSystemObject
    Dim objFolder As Scripting.Folder
    Dim objFile As Scripting.TextStream
    Dim strFolder As String
    Dim strFile As String
    Dim strAccessToken As String
    Dim objJson As Scripting.Dictionary
    Dim dteExpTime As Date
    Dim strRefreshToken As String
    strFolder = Environ$("APPDATA") & "\" & ApplicationName
    strFile = strFolder & "\client_id_" & ClientId & ".token-response"
    Set objReg = New RegistryUtility
    Set objFSO = New Scripting.FileSystemObject
    If ApplicationName = vbNullString Then
        Err.Raise vbObjectError + 10, , "Please specify a name for your application"
    End If
    If objFSO.FolderExists(strFolder) Then
        Set objFolder = objFSO.GetFolder(strFolder)
        If objFSO.FileExists(strFile) Then
            If objReg.RegValueExists("HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AccessTokenExpirationTime") Then
                dteExpTime = CDate(objReg.ReadRegValue("HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AccessTokenExpirationTime"))
                If DateDiff("s", Now, dteExpTime) <= 0 Then
                    Set objFile = objFSO.OpenTextFile(strFile, ForReading, False)
                    Set objJson = JsonConverter.ParseJson(objFile.ReadAll)
                    objFile.Close
                    strRefreshToken = objJson.Item("refresh_token")
                    AccessToken = RefreshAccessToken(strRefreshToken)
                Else
                    Set objFile = objFSO.OpenTextFile(strFile, ForReading, False)
                    Set objJson = JsonConverter.ParseJson(objFile.ReadAll)
                    objFile.Close
                    AccessToken = objJson.Item("access_token")
                End If
            Else: AccessToken = GetAccessToken
            End If
        Else: AccessToken = GetAccessToken
        End If
    Else
        Set objFolder = objFSO.CreateFolder(strFolder)
        AccessToken = GetAccessToken
    End If
    Dim objFileResources As FileResources
    Set objFileResources = New FileResources
    objFileResources.AccessToken = AccessToken
    Set FileResources = objFileResources
End Sub

Private Function GetAccessToken() As String
    Dim objBrowser As UserForm1
    Dim objWinHttp As WinHttp.WinHttpRequest
    Dim strURL As String
    Dim strRequestBody As String
    Dim strAuthorizationCode As String
    Dim strFile As String
    Dim strFolder As String
    Dim strAccessToken As String
    Dim objReg As RegistryUtility
    Dim objJson As Scripting.Dictionary
    Dim objFSO As Scripting.FileSystemObject
    Dim objFile As Scripting.TextStream
    Set objFSO = New Scripting.FileSystemObject
    Set objReg = New RegistryUtility
    Set objBrowser = New UserForm1
    strFolder = Environ$("APPDATA") & "\" & ApplicationName
    strFile = strFolder & "\client_id_" & ClientId & ".token-response"
    Dim objWebUtilities As WebUtilities
    Set objWebUtilities = New WebUtilities
    If Not IsEmpty(Scope) Then
        strURL = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?" & "client_id=" & ClientId & "&scope=" & objWebUtilities.URLEncode(Join(Scope, " ")) & "&response_type=code&redirect_uri=" & objWebUtilities.URLEncode("https://login.microsoftonline.com/common/oauth2/nativeclient")
    Else
        Err.Raise vbObjectError + 13, , "Scope cannot be null. Please specify a valid scope and try again!"
    End If
    objBrowser.ClientId = ClientId
    objBrowser.ApplicationName = ApplicationName
    objBrowser.WebBrowser1.Navigate strURL
    objBrowser.Show vbModal
    If objReg.RegValueExists("HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AuthorizationCode") Then
        strAuthorizationCode = objReg.ReadRegValue("HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AuthorizationCode")
        objReg.DeleteRegValue "HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AuthorizationCode"
    End If
    If strAuthorizationCode <> vbNullString Then
        strRequestBody = "code=" & strAuthorizationCode & "&" & _
                        "client_id=" & ClientId & "&" & _
                        "redirect_uri=" & objWebUtilities.URLEncode("https://login.microsoftonline.com/common/oauth2/nativeclient") & "&" & _
                        "grant_type=authorization_code"
        Set objWinHttp = New WinHttp.WinHttpRequest
        With objWinHttp
            .Open "POST", "https://login.microsoftonline.com/common/oauth2/v2.0/token", False
            .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
            .SetRequestHeader "Accept", "application/json'"
            .Send strRequestBody
            If .Status = 200 Then
                Set objJson = JsonConverter.ParseJson(.ResponseText)
                strAccessToken = objJson.Item("access_token")
                If strAccessToken <> vbNullString Then
                    GetAccessToken = strAccessToken
                    Set objFile = objFSO.CreateTextFile(strFile, True)
                    objFile.Write .ResponseText
                    objFile.Close
                    objReg.WriteRegValue "HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AccessTokenExpirationTime", CStr(DateAdd("s", CDbl(objJson.Item("expires_in")), Now)), REG_SZ
                Else: Err.Raise vbObjectError + 2, , "Failed to get access code"
                End If
            Else
                Dim objJson As Scripting.Dictionary
                Set objJson = JsonConverter.ParseJson(.ResponseText)
                Err.Raise vbObjectError + .Status, , objJson.Item("error_description")
            End If
        End With
    Else
        Err.Raise vbObjectError + 1, , "Failed to obtain the authorization code."
    End If
End Function

Private Function RefreshAccessToken(RefreshToken As String) As String
    Dim objWinHttp As WinHttp.WinHttpRequest
    Dim objJson As Scripting.Dictionary
    Dim strRequestBody As String
    Dim strFolder As String
    Dim strFile As String
    Dim objReg As RegistryUtility
    strRequestBody = "client_id=" & ClientId & "&" & _
                    "refresh_token=" & RefreshToken & "&" & _
                    "grant_type=refresh_token"
    Set objWinHttp = New WinHttp.WinHttpRequest
    With objWinHttp
        .Open "POST", "https://login.microsoftonline.com/common/oauth2/v2.0/token"
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .SetRequestHeader "Accept", "application/json'"
        .Send strRequestBody
        If .Status = 200 Then
            Set objJson = JsonConverter.ParseJson(.ResponseText)
            strFolder = Environ$("APPDATA") & "\" & ApplicationName
            strFile = strFolder & "\client_id_" & ClientId & ".token-response"
            Call SaveNewAccessToken(strFile, objJson.Item("access_token"))
            RefreshAccessToken = objJson.Item("access_token")
            Set objReg = New RegistryUtility
            objReg.WriteRegValue "HKEY_CURRENT_USER\Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId & "\AccessTokenExpirationTime", CStr(DateAdd("s", CDbl(objJson.Item("expires_in")), Now)), REG_SZ
        End If
    End With
End Function

Private Sub SaveNewAccessToken(AccessTokenFile As String, NewAccessToken As String)
    Dim objFSO As Scripting.FileSystemObject
    Dim objFile As Scripting.TextStream
    Dim strText As String, strOldText As String, strNewText As String
    Set objFSO = New Scripting.FileSystemObject
    If objFSO.FileExists(AccessTokenFile) Then
        strNewText = Chr(34) & "access_token" & Chr(34) & ":" & Chr(34) & NewAccessToken & Chr(34)
        Set objFile = objFSO.OpenTextFile(AccessTokenFile)
        strText = objFile.ReadAll
        objFile.Close
        strOldText = Chr(34) & "access_token" & Chr(34) & ":" & Chr(34) & JsonConverter.ParseJson(strText).Item("access_token") & Chr(34)
        strText = VBA.Replace(strText, strOldText, strNewText, , , vbTextCompare)
        Set objFile = objFSO.OpenTextFile(AccessTokenFile, ForWriting)
        objFile.Write strText
        objFile.Close
    Else
        Call GetAccessToken
    End If
End Sub

Public Sub LogOut()
    Dim objWinHttp As WinHttp.WinHttpRequest
    Dim objFSO As Scripting.FileSystemObject
    Dim strFolder As String
    Dim objReg As RegistryUtility
    Dim objBrowser As UserForm1
    Dim objWebUtilities As WebUtilities
    Set objWebUtilities = New WebUtilities
    Set objBrowser = New UserForm1
    objBrowser.WebBrowser1.Navigate "https://login.microsoftonline.com/common/oauth2/v2.0/logout?post_logout_redirect_uri=" & objWebUtilities.URLEncode("https://login.microsoftonline.com/common/oauth2/nativeclient")
    objBrowser.Show vbModal
    Set objFSO = New Scripting.FileSystemObject
    strFolder = Environ$("APPDATA") & "\" & ApplicationName
    If objFSO.FileExists(strFolder & "\client_id_" & ClientId & ".token-response") Then objFSO.GetFile(strFolder & "\client_id_" & ClientId & ".token-response").Delete
    Set objReg = New RegistryUtility
    If objReg.RegKeyExists(HKEY_CURRENT_USER, "Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId) Then
        objReg.DeleteRegKey HKEY_CURRENT_USER, "Software\MicrosoftOAuth2VBA\" & ApplicationName & "\" & ClientId
    End If
End Sub

(Code trong bài viết này chỉ trình bày một phần, mọi người có thể tìm thấy code đầy đủ trong tập tin đính kèm theo bài viết này.)

Thử đăng nhập xem sao (lưu ý: trong video sử dụng tài khoản Microsoft 365 E5 Developer để minh họa):

Bài viết dài quá nên mình xin tạm dừng tại đây. Phần tiếp theo mình sẽ trình bày một số ví dụ thực tế mà người dùng thường yêu cầu.
Xin cảm ơn mọi người đã kiên nhẫn đọc bài viết này.
 

Attachments

  • MicrosoftGraphAPI-SharePoint.zip
    129.8 KB · Views: 58
Một số ví dụ về yêu cầu của người dùng:

Có một bạn hỏi thế này:

1672023076982.png


Như vậy, giả sử người dùng có một tệp Book1.xlsm Excel nằm trên SharePoint với đường dẫn như sau:
Excel Files/Book1.xlsm

1672023568281.png


Người dùng muốn lấy giá trị của vùng A2:E6 nằm trong Sheet1.

1672023637704.png


Dựa vào phần code đã có ở trên (tập tin đính kèm theo bài viết), chúng ta tiến hành bổ sung một số phương thức cho Class Module FileResources:

Code:
Option Explicit

Private Sub GetRangeValuesFromExcelFileInSharePoint()
    Dim objMicrosoftGraphOAuth2 As MicrosoftGraphOAuth2
    Dim objWinHttp As WinHttp.WinHttpRequest
    Dim objJson As Scripting.Dictionary
    Dim arrValues As Variant
    Dim objWebUtilities As WebUtilities
    Set objWebUtilities = New WebUtilities
    Set objMicrosoftGraphOAuth2 = New MicrosoftGraphOAuth2
    With objMicrosoftGraphOAuth2
        .ApplicationName = "Test OneDrive API"
        .ClientId = "510ce4dc-7eb1-48d9-a237-4efaa4c6852d"
        .Scope = Array("files.read", "offline_access")
        .AuthorizeOAuth2
    End With
    Set objWinHttp = New WinHttp.WinHttpRequest
    With objWinHttp
        .Open "GET", "https://graph.microsoft.com/v1.0/sites/danghome.sharepoint.com/drive/root:/Book.xlsx:/workbook/worksheets/Sheet1"
        .SetRequestHeader "Authorization", "Bearer " & objMicrosoftGraphOAuth2.AccessToken
        .SetRequestHeader "Accept", "application/json"
        .SetRequestHeader "Content-Type", "application/json"
        .Send
        .WaitForResponse
        If .Status = 200 Then
            Set objJson = JsonConverter.ParseJson(.ResponseText)
        End If
    End With
    Set objWinHttp = New WinHttp.WinHttpRequest
    With objWinHttp
        .Open "GET", "https://graph.microsoft.com/v1.0/sites/danghome.sharepoint.com/drive/root:/Book.xlsx:/workbook/worksheets/" & objWebUtilities.URLEncode(objJson.Item("id")) & "/range(address='A1:B2')", True
        .SetRequestHeader "Authorization", "Bearer " & objMicrosoftGraphOAuth2.AccessToken
        .SetRequestHeader "Accept", "application/json"
        .SetRequestHeader "Content-Type", "application/json"
        .Send
        .WaitForResponse
        If .Status = 200 Then
            Set objJson = JsonConverter.ParseJson(.ResponseText)
            Range("A1:B1").Value = ConvertJsonToArray(objJson)
        End If
    End With
End Sub

Private Sub LogOut()
    Dim objMicrosoftGraphOAuth2 As MicrosoftGraphOAuth2
    Set objMicrosoftGraphOAuth2 = New MicrosoftGraphOAuth2
    With objMicrosoftGraphOAuth2
        .ApplicationName = "Test OneDrive API"
        .ClientId = "510ce4dc-7eb1-48d9-a237-4efaa4c6852d"
        .LogOut
    End With
End Sub

Private Function ConvertJsonToArray(Json As Scripting.Dictionary) As Variant
    Dim arrValues() As Variant
    Dim i As Long, j As Long
    If Json.Item("values").Count > 1 Then
        If Json.Item("values")(2).Count > 1 And Json.Item("values")(2).Count > Json.Item("values")(1).Count Then
            ReDim arrValues(1 To Json.Item("values").Count, 1 To Json.Item("values")(2).Count)
            For i = 1 To Json.Item("values").Count
                For j = 1 To Json.Item("values")(i).Count
                    arrValues(i, j) = Json.Item("values")(i)(j)
                Next
            Next
        Else
            If Json.Item("values")(1).Count > 1 Then
                ReDim arrValues(1 To Json.Item("values").Count, 1 To Json.Item("values")(1).Count)
                For i = 1 To Json.Item("values").Count
                    For j = 1 To Json.Item("values")(i).Count
                        arrValues(i, j) = Json.Item("values")(i)(j)
                    Next
                Next
            End If
        End If
    ElseIf Json.Item("values").Count = 1 And Json.Item("values")(1).Count > 1 Then
        ReDim arrValues(1 To 1, 1 To Json.Item("values")(1).Count)
        For i = 1 To Json.Item("values")(1).Count
            arrValues(1, i) = Json.Item("values")(1)(i)
        Next
    ElseIf Json.Item("values").Count = 1 And Json.Item("values")(1).Count = 1 Then
        ReDim arrValues(1 To 1)
        arrValues(1) = Json.Item("values")(1)(1)
    End If
    ConvertJsonToArray = arrValues
End Function

Phương thức GetRangeValuesFromExcelFileOnSharePoint của Class Module FileResources gồm có năm tham số:
  • SiteId: tên site chứa tệp Excel cần lấy dữ liệu (vd: danghome.sharepoint.com:/sites/CompanyNews:).
  • SheetName: tên sheet chứa Range cần lấy dữ liệu trong tệp Excel nằm trên site (chính xác hơn là Document Library).
  • Range: Địa chỉ dạng A1 hoặc R1C1 của vùng dữ liệu cần lấy.
  • ExcelFileName: tên tập tin Excel nằm trên site.
  • (Tùy chọn) SiteFolderPath: Nếu tập tin Excel nằm trong thư mục gốc của Document Library thì có thể để trống tham số này, ngược lại thì chỉ định đầy đủ đường dẫn chứa tập tin Excel.
Chạy thử để xem kết quả:

 
Last edited:
Một ví dụ khác:
Một số bạn hỏi như sau:

1672025955097.png

1672026019953.png


Mình sẽ chọn giải quyết vấn đề thứ hai bởi vì nó bao hàm cả vấn đề thứ nhất.
Trường hợp này chúng ta sẽ viết macro trong Outlook.
Giả sử người dùng có site tên là danghome.sharepoint.com/sites/CompanyNews.
Người dùng muốn tự động tải tập tin đính kèm lên thư mục Excel Files nằm ở thư mục gốc của Document Library, sau đó đính kèm liên kết url của tập tin đính kèm đó và gửi đi.

1672026263310.png


Chúng ta sẽ bổ sung một số phương thức vào Class Module FileResources để tải lên tập tin và lấy liên kết url của tập tin đã tải lên (chi tiết vui lòng xem trong tập tin đính kèm theo bài viết này).
Tiến hành viết macro:

Code:
Option Explicit

Public Sub CreateEmailAndUploadAttachmentsToSharePointSite()
    Dim objMicrosoftGraphOAuth2 As MicrosoftGraphOAuth2
    Set objMicrosoftGraphOAuth2 = New MicrosoftGraphOAuth2
    With objMicrosoftGraphOAuth2
        .ApplicationName = "SharePoint API"
        .ClientId = "510ce4dc-7eb1-48d9-a237-4efaa4c6852d"
        .Scope = Array("files.readwrite", "sites.readwrite.all", "offline_access")
        .AuthorizeOAuth2
    End With
    On Error Resume Next
    If Not Application.ActiveInspector Is Nothing Then
        If TypeOf Application.ActiveInspector.CurrentItem Is Outlook.MailItem Then
            Dim objMail As Outlook.MailItem
            Set objMail = Application.ActiveInspector.CurrentItem
            If objMail.ConversationIndex = vbNullString Then
                With objMail
                    Dim objWE As Word.Document
                    Dim objSig As Word.Bookmark
                    Set objWE = .GetInspector.WordEditor
                    Dim objSel As Word.Selection
                    Set objSel = objWE.Windows.Item(1).Selection
                    If objWE.Content.Bookmarks.Exists("_MailAutoSig") Then
                        Set objSig = objWE.Content.Bookmarks.Item("_MailAutoSig")
                        objSig.Range.Select
                        objSel.Collapse wdCollapseStart
                        objSel.MoveUp wdParagraph, 1
                    End If
                    .Display
                End With
                Dim objXlApp As Object
                On Error Resume Next
                Set objXlApp = GetObject(, "Excel.Application")
                If Err.Number = 429 Then Set objXlApp = CreateObject("Excel.Application")
                On Error GoTo 0
                Dim objFilePicker As Office.FileDialog
                Set objFilePicker = objXlApp.FileDialog(msoFileDialogFilePicker)
                With objFilePicker
                    .AllowMultiSelect = True
                    .Title = "Select file"
                    .Show
                    If .SelectedItems.Count > 0 Then
                        Dim objFSO As Scripting.FileSystemObject
                        Set objFSO = New Scripting.FileSystemObject
                        Dim objFile As Scripting.File
                        Dim i As Long
                        Dim objDriveItem As DriveItem
                        Const strSiteId As String = "danghome.sharepoint.com:/sites/CompanyNews:"
                        Const strSiteFolderPath As String = "Excel Files"
                        For i = 1 To .SelectedItems.Count
                            Set objFile = objFSO.GetFile(.SelectedItems.Item(i))
                            Set objDriveItem = objMicrosoftGraphOAuth2.FileResources.UploadFileToSharePoint(strSiteId, objFile, strSiteFolderPath)
                            If Not objDriveItem Is Nothing Then
                                If objWE.Content.Bookmarks.Exists("_MailAutoSig") = False Then objSel.EndKey wdStory
                                objSel.InsertParagraph
                                objSel.InsertAfter "Attachment: " & objDriveItem.Name & ":" & vbCr
                                objSel.Collapse wdCollapseEnd
                                objWE.Content.Hyperlinks.Add objSel.Range, objDriveItem.WebUrl
                                objSel.InsertParagraph
                                objSel.Collapse wdCollapseEnd
                            End If
                        Next
                    End If
                End With
                objXlApp.Quit
            Else
                MsgBox "You need to create a new email. Please try again!", vbInformation, "No New Email Detected"
                Exit Sub
            End If
        End If
    Else
        MsgBox "You need to create a new email. Please try again!", vbInformation, "No New Email Detected"
        Exit Sub
    End If
End Sub

Xem kết quả:
 
Last edited:
hay, bác tự nghiêm cứu hay có tài liệu nào không ? Công ty mình cũng hay làm viêc nhiều trên sharepoint
 
hay, bác tự nghiêm cứu hay có tài liệu nào không ? Công ty mình cũng hay làm viêc nhiều trên sharepoint
Code trong bài viết này:
  • Class Module: Random do Microsoft cung cấp từ ngày xưa để giải quyết vấn đề đọc/ghi tập tin trên 2GB (giới hạn 32bit) của Visual Basic cũ.
  • Thư viện JsonConverter của tác giả TimHall: https://github.com/VBA-tools/VBA-JSON
  • Hai hàm URLEncode và URLDecode: ExcelVBA.ru
  • Còn lại đều là do mình tự nghiên cứu và viết
Tài liệu: Working with SharePoint sites in Microsoft Graph
 
Cái này tôi ko có căn bản nên nhin vô không biết nên bắt đầu từ đâu 🥲
Cái này chủ yếu là nắm được cách tạo http request theo hướng dẫn của tài liệu là được, thím có thể viết bằng bất cứ ngôn ngữ lập trình nào cũng được, như trong bài này mình dùng VBA có sẵn trong Excel.
 
Back
Top