2009-08-28 370 views
17

Normalmente utilizo este fragmento de código para recuperar el contenido de una carpeta en VBA. Pero esto no funciona en el caso de un punto compartido. Como lo puedo hacer ?Obtenga el contenido de una carpeta sharepoint con Excel VBA

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 

EDITAR (después de un buen comentario de shahkalpesh):

que puede acceder al punto compartido si entro en la dirección en el Explorador de Windows. El acceso al punto compartido necesita una autenticación, pero es transparente, ya que depende del inicio de sesión de Windows.

+0

¿Es capaz de navegar a la carpeta de SharePoint usando el Explorador de Windows? – shahkalpesh

+0

¡Sí! Parece una carpeta de red normal. – tachfine

Respuesta

8

Utilice la ruta UNC en lugar de HTTP. Este código funciona:

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 

para obtener la ruta UNC para utilizar, vaya a la carpeta en la biblioteca de documentos, desplegar el menú Acciones y seleccione Abrir en el Explorador de Windows. Copie la ruta que ve allí y use eso.

+0

Consulte [this] (http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba) para habilitar FileSystemObject. – enderland

-2

Intente asignar la biblioteca sharepoint a una letra de unidad en Windows. Luego seleccione la unidad y la ruta en su código.

2

En mi humilde opinión, la mejor manera es ir a través de WebDAV (sin la carpeta de red, ya que a menudo no está permitido). Esto se puede lograr a través de ActiveX Data Objects como se describe en este artículo excelente excellent article (el código se puede usar directamente en Excel, utilizó el concepto recientemente).

Espero que esto ayude!

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

el enlace original ha muerto, pero al menos el contenido textual es todavía disponible en archive.org: http://web.archive.org/web/20091008034423/http://blog.itwarlocks.com/2009/04/28/accessing-webdav-in-microsoft-word-visual-basic

+2

A partir del 02/07/2013, este enlace de artículo parece estar muerto. ¿Alguien sabe si este artículo todavía está por aquí? – armstrhb

+1

@armstrhb: hay una copia en www.archive.org, pero parece que solo está disponible el texto, no los gráficos. – MostlyHarmless

11

La única forma que he encontrado para trabajar con archivos en SharePoint mientras se a los derechos del servidor es asignar la carpeta WebDAV a una letra de unidad. Aquí hay un ejemplo para la implementación.

Añadir referencias a las siguientes bibliotecas ActiveX en VBA:

  • Windows Script Modelo anfitrión de objetos (wshom.ocx) - para WshNetwork
  • Microsoft Scripting Runtime (scrrun.dll) - para FileSystemObject

Crear un nuevo módulo de clase, llámelo DriveMapper y agregue el siguiente código:

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 

A continuación, puede poner en práctica en su código: mapeo

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 
+0

puede ser complicado para mapear unidad de red; Encontré [how-to-map-sharepoint] (http://stemrc.aihec.org/SharePoint%20Tips%20and%20Tricks/Creating%20a%20Windows%20Drive%20Mapping%20for%20a%20SharePoint%20Document%20Library. pdf) útil para resolver esto. – Adriaan

+0

Este código parece muy prometedor, pero 'Subtest()' arroja un error de compilación "tipo definido por el usuario no definido" para la línea 'Dim dm como New DriveMapper'. Tal vez me falta una referencia de DLL? He agregado Microsoft Scripting Runtime y también Windows Script Host Object Model. Usando Excel 2010. – Shrout1

+0

disculpa por responder tan tarde @ shrout1, ¿tal vez hiciste un módulo en lugar de una clase? –

0

Drive para SharePoint (también https)

contenidos de SharePoint Cómo trabajaron para mí a través de la unidad asignada la iteración como un objeto del sistema de ficheros ; truco es cómo configurar el mapeo: from sharepoint, open as explorer luego copiar ruta (una por http *) (véase más adelante)

address in explorer

Usar este camino en la unidad de mapa desde el explorador o el comando (es decir net use N: https:://thepathyoujustcopied) Nota : https funciona bien con Windows7/8, no con XP.

Eso puede funcionar para usted, pero prefiero un enfoque diferente ya que las letras de unidad son diferentes en cada equipo. El truco aquí es comenzar desde sharepoint (y no desde un script de VBA accediendo a sharepoint como un servidor web).

Establecer una conexión de datos a la hoja de Excel

  • en SharePoint, vaya a la vista que desea supervisar
  • vista de la exportación a Excel (en 2010: las herramientas de la biblioteca; libarry | exportación a Excel) export to excel
  • durante la visualización de Gra, encontrará una fuente de datos establecido (ficha: datos, conexiones, propiedades, definición)

connection tab

Puede incluir esta consulta en vba, o mantener el enlace de la base de datos en su hoja de cálculo, iterando sobre la tabla por VBA. Tenga en cuenta: la imagen de arriba no muestra la conexión real de la base de datos (texto del comando), que le indicará cómo acceder al my sharepoint.

+0

El enlace al que se hace referencia arriba parece estar muerto desde el 9/10/2013. ¿Hay alguna posibilidad de que haya una versión actualizada? – Shrout1

+0

El documento vinculado no era mío. He agregado la información faltante en el artículo. – Adriaan

1

Pasé algún tiempo en este mismo problema - Estaba tratando de verificar que existía un archivo antes de abrirlo.

Eventualmente, se me ocurrió una solución usando XML y SOAP - use el método EnumerateFolder y obtenga una respuesta XML con los contenidos de la carpeta.

He escrito sobre él here.

0

ensucié alrededor con este problema para un poco, y se encontró una solución muy simple, de 2 líneas, simplemente reemplazando el 'http' y todas las barras diagonales de esta manera:

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

Puede que no funcione para todo el mundo, pero funcionó para mí

Si está utilizando un sitio seguro (o desea para atender a ambos) puede que desee añadir la siguiente línea:

myFilePath = replace(myFilePath, "https:", "") 
8

Además:

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

sustituir también el espacio:

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