web-dev-qa-db-fra.com

Obtenez le contenu d'un dossier sharepoint avec Excel VBA

Habituellement, j'utilise ce morceau de code pour récupérer le contenu d'un dossier dans VBA. Mais cela ne fonctionne pas dans le cas d'un sharepoint. Comment puis-je faire ?

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

MODIFIER (après un bon commentaire de shahkalpesh):

Je peux accéder au point de partage si j'entre l'adresse dans l'Explorateur Windows. L'accès au point de partage nécessite une authentification, mais il est transparent, car il repose sur la connexion Windows.

20
afewcc

Le seul moyen que j'ai trouvé pour travailler avec des fichiers sur SharePoint tout en ayant des droits de serveur est de mapper le dossier WebDAV sur une lettre de lecteur. Voici un exemple d'implémentation.

Ajoutez des références aux bibliothèques ActiveX suivantes dans VBA:

  • Modèle d'objet hôte de script Windows (wshom.ocx) - pour WshNetwork
  • Microsoft Scripting Runtime (scrrun.dll) - pour FileSystemObject

Créez un nouveau module de classe, appelez-le DriveMapper et ajoutez le code suivant:

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

Ensuite, vous pouvez l'implémenter dans votre code:

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
14
Chris Hayes

Utilisez le chemin UNC plutôt que HTTP. Ce code fonctionne:

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

Pour obtenir le chemin UNC à utiliser, allez dans le dossier de la bibliothèque de documents, déroulez le menu Actions et choisissez Ouvrir dans l'Explorateur Windows. Copiez le chemin que vous y voyez et utilisez-le.

12
Chris Latta

En plus de:

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

remplacer également l'espace:

myFilePath = replace(myFilePath, " ", "%20")
10
Eileen

À mon humble avis, le moyen le plus cool est de passer par WebDAV (sans dossier réseau, car cela n'est souvent pas autorisé). Cela peut être accompli via des objets de données ActiveX comme indiqué dans cet excellent article excellent article (le code peut être utilisé directement dans Excel, utilisé récemment le concept).

J'espère que cela t'aides!

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

le lien d'origine est mort, mais au moins le contenu textuel est toujours disponible sur archive.org: http://web.archive.org/web/20091008034423/http://blog.itwarlocks.com/2009/ 04/28/accès-webdav-dans-Microsoft-Word-visual-basic

2
BigD

Je me suis un peu amusé avec ce problème et j'ai trouvé une solution très simple à 2 lignes, remplaçant simplement le 'http' et toutes les barres obliques comme ceci:

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

Cela pourrait ne pas fonctionner pour tout le monde, mais cela a fonctionné pour moi

Si vous utilisez un site sécurisé (ou souhaitez répondre aux deux), vous pouvez ajouter la ligne suivante:

myFilePath = replace(myFilePath, "https:", "")
2
James Garratt

J'ai passé un peu de temps sur ce problème - j'essayais de vérifier qu'un fichier existait avant de l'ouvrir.

Finalement, j'ai trouvé une solution utilisant XML et SOAP - utilisez la méthode EnumerateFolder et récupérez une réponse XML avec le contenu du dossier.

J'ai blogué à ce sujet ici .

1
Steven C. Britton

Drive mappage vers sharepoint (également https)

Obtenir le contenu du point de partage a fonctionné pour moi via le lecteur mappé en l'itérant comme un objet de système de fichiers; l'astuce consiste à configurer le mappage: from sharepoint, open as Explorer Copiez ensuite le chemin (ligne avec http *) (voir ci-dessous)

address in Explorer

Utilisez ce chemin dans le lecteur de carte à partir de l'explorateur ou de la commande (c'est-à-dire Net Use N: https:://thepathyoujustcopied) Remarque: https fonctionne correctement avec windows7/8, pas avec XP.

Cela peut fonctionner pour vous, mais je préfère une approche différente car les lettres de lecteur sont différentes sur chaque PC. L'astuce consiste à démarrer à partir de sharepoint (et non à partir d'un script VBA accédant à sharepoint en tant que serveur Web).

Configurer une connexion de données à la feuille Excel

  • dans sharepoint, accédez à la vue que vous souhaitez surveiller
  • exporter la vue vers Excel (en 2010: outils de bibliothèque; bibliothèque | exporter vers Excel) export to Excel
  • lors de la visualisation de cet Excel, vous trouverez une configuration de source de données (onglet: données, connexions, propriétés, définition)

connection tab

Vous pouvez soit inclure cette requête dans vba, soit conserver le lien de base de données dans votre feuille de calcul, en itérant sur la table par VBA. Veuillez noter: l'image ci-dessus ne montre pas la connexion à la base de données réelle (texte de la commande), ce qui vous dirait comment accéder à mon point de partage.

0
Adriaan