web-dev-qa-db-ja.com

Excel VBAで共有フォルダーのコンテンツを取得する

通常、このコードを使用して、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

[〜#〜] edit [〜#〜](shahkalpeshによる良いコメントの後):

Windowsエクスプローラーでアドレスを入力すると、共有ポイントにアクセスできます。共有ポイントへのアクセスには認証が必要ですが、Windowsログインに依存しているため、透過的です。

20
afewcc

サーバーの権限が必要なときにSharePoint上のファイルを操作することがわかった唯一の方法は、WebDAVフォルダーをドライブ文字にマップすることです。実装の例を次に示します。

VBAで次のActiveXライブラリへの参照を追加します。

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

HTTPではなくUNCパスを使用します。このコードは機能します:

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パスを取得するには、ドキュメントライブラリのフォルダーに移動し、[アクション]メニューをドロップダウンして、[エクスプローラーで開く]を選択します。そこに表示されるパスをコピーして使用します。

12
Chris Latta

に加えて:

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

スペースも置き換えます:

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

私見で最もクールな方法は、WebDAVを使用することです(これは多くの場合許可されないため、ネットワークフォルダーなしで)。これは、 excellent article excellent article(コードはExcelで直接使用でき、最近コンセプトを使用しました)に記載されているように、ActiveXデータオブジェクトを介して実現できます。

お役に立てれば!

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

2
BigD

私は少しこの問題をいじり、非常に単純な2行の解決策を見つけました。「http」とこのようなすべてのスラッシュを単純に置き換えます。

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

それは誰にとってもうまくいくとは限りませんが、私にとってはうまくいきました

セキュリティで保護されたサイトを使用している場合(または両方に対応したい場合)、次の行を追加できます。

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

私はこの問題に少し時間を費やしました-ファイルを開く前に存在することを確認しようとしていました。

最終的に、XMLとSOAP-EnumerateFolderメソッドを使用して、フォルダーのコンテンツを含むXML応答をプルするソリューションを使用しました。

私はそれについてブログに書いた こちら

1

ドライブポイントを共有ポイント(httpsも)にマッピング

共有されたドライブをファイルシステムオブジェクトとして反復することにより、共有ポイントのコンテンツを取得することができました。トリックは、マッピングを設定する方法です。 from sharepoint, open as Explorer 次に、パスをコピーします(http *を含む行)(以下を参照)

address in Explorer

エクスプローラーまたはコマンドからマップドライブでこのパスを使用します(つまり、Net Use N: https:://thepathyoujustcopied)注:httpsは、Windows 7/8では問題なく機能しますが、XPでは機能しません。

それはあなたのために働くかもしれませんが、ドライブ文字が各PCで異なるので、私は異なるアプローチを好みます。ここでのコツは、sharepointから開始することです(webサーバーとしてsharepointにアクセスするVBAスクリプトからではありません)。

Excelシートへのデータ接続を設定する

  • sharepointで、監視するビューを参照します
  • ビューをExcelにエクスポート(2010年:ライブラリツール、libarry | Excelにエクスポート) export to Excel
  • このExcelを表示すると、データソースが設定されています(タブ:データ、接続、プロパティ、定義)

connection tab

このクエリをvbaに含めるか、speadsheetでデータベースリンクを維持して、VBAによってテーブルを反復処理できます。注意:上記の画像は実際のデータベース接続(コマンドテキスト)を示していないため、my共有ポイントにアクセスする方法がわかります。

0
Adriaan