Получите содержимое папки sharepoint с помощью Excel VBA

Обычно я использую этот фрагмент кода для получения содержимого папки в VBA. Но в случае с sharepoint это не работает. Как я могу сделать ?

Dim folder As folder
Dim f As File
Dim fs As New FileSystemObject

Set folder = fs.GetFolder("//sharepoint.address/path/to/folder")

For Each f In folder.Files
    'Do something
Next f

РЕДАКТИРОВАТЬ (после хорошего комментария шахкалпеша):

Я могу получить доступ к sharepoint, если введу адрес в проводнике Windows. Для доступа к sharepoint требуется аутентификация, но она прозрачна, поскольку зависит от входа в Windows.


person afewcc    schedule 28.08.2009    source источник
comment
Можете ли вы перейти к папке sharepoint с помощью проводника Windows?   -  person shahkalpeshp    schedule 28.08.2009
comment
Да ! Похоже на обычную сетевую папку.   -  person afewcc    schedule 28.08.2009


Ответы (9)


Единственный способ, который я нашел для работы с файлами в SharePoint, имея права сервера, - это сопоставить папку WebDAV с буквой диска. Вот пример реализации.

Добавьте ссылки на следующие библиотеки ActiveX в VBA:

  • Объектная модель хоста сценария Windows (wshom.ocx) - для WshNetwork
  • Microsoft Scripting Runtime (scrrun.dll) - для FileSystemObject

Создайте новый модуль класса, назовите его DriveMapper и добавьте следующий код:

Option Explicit

Private oMappedDrive As Scripting.Drive
Private oFSO As New Scripting.FileSystemObject
Private oNetwork As New WshNetwork

Private Sub Class_Terminate()
  UnmapDrive
End Sub

Public Function MapDrive(NetworkPath As String) As Scripting.Folder
  Dim DriveLetter As String, i As Integer

  UnmapDrive

  For i = Asc("Z") To Asc("A") Step -1
    DriveLetter = Chr(i)
    If Not oFSO.DriveExists(DriveLetter) Then
      oNetwork.MapNetworkDrive DriveLetter & ":", NetworkPath
      Set oMappedDrive = oFSO.GetDrive(DriveLetter)
      Set MapDrive = oMappedDrive.RootFolder
      Exit For
    End If
  Next i
End Function

Private Sub UnmapDrive()
  If Not oMappedDrive Is Nothing Then
    If oMappedDrive.IsReady Then
      oNetwork.RemoveNetworkDrive oMappedDrive.DriveLetter & ":"
    End If
    Set oMappedDrive = Nothing
  End If
End Sub

Затем вы можете реализовать это в своем коде:

Sub test()
  Dim dm As New DriveMapper
  Dim sharepointFolder As Scripting.Folder

  Set sharepointFolder = dm.MapDrive("http://your/sharepoint/path")

  Debug.Print sharepointFolder.Path
End Sub
person Chris Hayes    schedule 29.10.2009
comment
может быть сложно подключить сетевой диск; Я нашел how-to-map-sharepoint, полезный для решения этой проблемы. - person Adriaan; 16.01.2012
comment
Этот код выглядит очень многообещающим, но Sub test() выдает ошибку компиляции "Определенный пользователем тип не определен" для строки Dim dm as New DriveMapper. Возможно, мне не хватает ссылки на DLL? Я добавил среду выполнения сценариев Microsoft, а также объектную модель хоста сценариев Windows. Используя Excel 2010. - person Shrout1; 10.09.2013
comment
извините за столь поздний ответ @ shrout1, может быть, вы сделали модуль вместо класса? - person Chris Hayes; 12.01.2016
comment
Спасибо за отличный обходной путь. При прямом подключении мне пришлось вручную посетить сайт sharepoint, прежде чем получить активное соединение, но сопоставление диска, похоже, решает эту проблему. Один вопрос: как я могу избежать отключения диска до того, как закончится мой код, вызывающий класс DriveMapper? Я еще не очень хорошо знаком с тем, как они работают. - person Trm; 05.04.2016
comment
@Trm кто-то отредактировал мое сообщение, чтобы обернуть код в класс с методом удаления Class_Terminate, который отключает отображение диска. Когда класс выходит из области видимости, диск не отображается. Вы можете просто удалить метод Class_Terminate ... - person Chris Hayes; 11.04.2016
comment
@ChrisHayes да, я так и думал. Я удалил его, а затем каждый раз, когда я открывал соединение, зависал с кучей подключенных дисков. Я сделал обходной путь, сохранив букву подключенного диска в памяти и отключив ее в конце подпрограммы в модуле. Не уверен, что это самое элегантное решение. - person Trm; 11.04.2016

Используйте путь UNC, а не HTTP. Этот код работает:

Public Sub ListFiles()
    Dim folder As folder
    Dim f As File
    Dim fs As New FileSystemObject
    Dim RowCtr As Integer

    RowCtr = 1
    Set folder = fs.GetFolder("\\SharePointServer\Path\MorePath\DocumentLibrary\Folder")
    For Each f In folder.Files
       Cells(RowCtr, 1).Value = f.Name
       RowCtr = RowCtr + 1
    Next f
End Sub

Чтобы использовать UNC-путь, перейдите в папку в библиотеке документов, откройте меню «Действия» и выберите «Открыть в проводнике Windows». Скопируйте путь, который вы видите там, и используйте его.

person Chris Latta    schedule 28.08.2009
comment
См. this для включения объекта FileSystemObject. - person enderland; 04.09.2013
comment
Не работает с SharePoint онлайн. Вы можете получить доступ только через HTTP или WebDav - person Rob Nicholson; 21.04.2020

В добавление к:

myFilePath = replace(myFilePath, "/", "\")
myFilePath = replace(myFilePath, "http:", "")

также замените пробел:

myFilePath = replace(myFilePath, " ", "%20")
person Eileen    schedule 11.09.2013

Я немного поработал с этой проблемой и нашел очень простое двухстрочное решение, просто заменив 'http' и все косые черты следующим образом:

myFilePath = replace(myFilePath, "/", "\")
myFilePath = replace(myFilePath, "http:", "")

Возможно, это сработает не для всех, но для меня это сработало.

Если вы используете безопасный сайт (или хотите обслуживать оба), вы можете добавить следующую строку:

myFilePath = replace(myFilePath, "https:", "")
person James Garratt    schedule 02.05.2013
comment
На самом деле, приведенное выше кажется мне неполным, и его следует читать для https: (в дополнение к приведенному выше коду) myFilePath = Replace(myFilePath, Split(myFilePath, "\")(2), Split(myFilePath, "\")(2) & "@SSL") это преобразует https://my.SharePoint.com/ в конечном итоге в \\my.SharePoint.com@SSL\ (после всех замен). - person Ralph; 20.03.2019

ИМХО, самый крутой способ - через WebDAV (без сетевой папки, так как это часто недопустимо). Это можно сделать с помощью объектов данных ActiveX, как описано в этом отличная статья отличная статья (код можно использовать прямо в Excel, недавно использовал эту концепцию).

Надеюсь это поможет!

http://blog.itwarlocks.com/2009/04/28/accessing-webdav-in-microsoft-word-visual-basic/

исходная ссылка мертва, но по крайней мере текстовое содержимое все еще доступно на archive.org: http://web.archive.org/web/20091008034423/http://blog.itwarlocks.com/2009/04/28/accessing-webdav-in-microsoft-word-visual-basic

person BigD    schedule 28.10.2009
comment
По состоянию на 07.02.2013 ссылка на эту статью кажется мертвой. Кто-нибудь знает, где еще есть эта статья? - person armstrhb; 07.02.2013
comment
@armstrhb: есть копия на www.archive.org, но, похоже, доступен только текст, а не графика. - person MostlyHarmless; 05.06.2015

Я потратил некоторое время на решение этой самой проблемы - я пытался проверить, существует ли файл, прежде чем открывать его.

В конце концов, я придумал решение с использованием XML и SOAP - используйте метод EnumerateFolder и вытащите XML-ответ с содержимым папки.

Я писал об этом в блоге здесь.

person Steven C. Britton    schedule 10.02.2013

Сопоставление диска с sharepoint (также https)

Получение содержимого точки доступа сработало для меня через подключенный диск, повторяя его как объект файловой системы; Уловка заключается в том, как настроить сопоставление: из sharepoint, откройте как проводникЗатем скопируйте путь (строка с http *) (см. ниже)

адрес в проводнике

Используйте этот путь в Map drive из проводника или команды (например, net use N: https:://thepathyoujustcopied). Примечание: https работает нормально с windows7 / 8, но не с XP.

Это может сработать для вас, но я предпочитаю другой подход, поскольку буквы дисков разные на каждом компьютере. Уловка здесь заключается в том, чтобы начать с sharepoint (а не со сценария VBA, который обращается к sharepoint как к веб-серверу).

Настройте подключение для передачи данных к Excel Sheet

  • в sharepoint перейдите к представлению, которое вы хотите отслеживать
  • представление экспорта в Excel (в 2010 году: инструменты библиотеки; libarry | экспорт в Excel) экспорт в Excel
  • при просмотре этого Excel вы найдете настроенный источник данных (вкладка: данные, соединения, свойства, определение)

вкладка подключения

Вы можете либо включить этот запрос в vba, либо сохранить ссылку на базу данных в своей электронной таблице, выполняя итерацию по таблице с помощью VBA. Обратите внимание: на изображении выше не показано фактическое соединение с базой данных (текст команды), в котором рассказывается, как получить доступ к my sharepoint.

person Adriaan    schedule 16.01.2012
comment
Ссылка, указанная выше, по состоянию на 10.09.2013 г. не работает. Есть шанс, что есть обновленная версия? - person Shrout1; 10.09.2013
comment
Связанный документ не был моим. Я добавил недостающую информацию в статью. - person Adriaan; 19.09.2013

Сопоставление папки WebDAV - мой предпочтительный метод создания легкодоступного долгосрочного подключения к SharePoint. Однако вы обнаружите - даже при правильном сопоставлении - что файл будет возвращать URL-адрес при выборе (особенно через Application.FileDialog) из-за изменений в Windows 10 1803.

Чтобы обойти это, вы можете сопоставить диск с помощью DriveMapper (или его эквивалента), а затем объединить полученный Application.FileDialog.SelectedItems с функцией преобразования URL-адреса в UNC:

Public Function SharePointURLtoUNC( _
  sURL As String) _
As String
  Dim bIsSSL As Boolean

  bIsSSL = InStr(1, sURL, "https:") > 0
  sURL = Replace(Replace(sURL, "/", "\"), "%20", " ")
  sURL = Replace(Replace(sURL, "https:", vbNullString), "http:", vbNullString)
  
  sURL= Replace(sURL, Split(sURL, "\")(2), Split(sURL, "\")(2) & "@SSL\DavWWWRoot")
  If Not bIsSSL Then sURL = Replace(sURL, "@SSL\", vbNullString) 
  SharePointURLtoUNC = sURL
End Function
person mpdrsn    schedule 14.09.2020

Попробуйте сопоставить библиотеку sharepoint с буквой диска в Windows. Затем выберите диск и путь в вашем коде.

person Community    schedule 31.08.2009