0

Excel VBA を使用して、SharePoint ドキュメント ライブラリ内のすべてのドキュメントのすべてのアイテム タイトルを配列に直接読み込む必要があります。FileSystemObject をうまく使用できないようです。また、マクロが配布されて広く使用されるため、ドキュメント ライブラリをドライブ文字にマップしたくありません。

  • SharePoint サイトには https アドレスがあります
  • scrrun.dll の参照に関するこのスレッドを見ましたが、ローカル ドメインの信頼設定を変更できないため、機能しません。
  • このスレッドは有望に見えましたが、やはり FileSystemObject を使用しているようで、ハングアップする可能性があります。
  • SharePoint stackexchange サイトのこのスレッドは、ファイルのリストをワークシート オブジェクトとして読み取るのに適していますが、配列に直接プッシュするように調整する方法がわかりません。
  • エラー 76「Bad Path」を受け取る傾向がありますが、ローカル (C:) ファイルで簡単に実行できます。
  • このスレッドに回答したように、WebDAV アドレスを使用してみましたが、「Bad Path」エラーも発生します。

ローカル セキュリティ ポリシーに違反せず、Excel ワークシートに依存せずに、SharePoint ドキュメント ライブラリのコンテンツを配列に直接読み込む方法が必要です。

4

1 に答える 1

0

わかりました、自己回答します。私は自分のソリューションに 100% 満足しているわけではありませんが、私の制約内では十分です。ハイレベルポイントは以下です。

  • VBA を使用して、「Net Use」コマンドを含む BAT ファイルを作成します。
  • ドキュメント ライブラリの WebDAV アドレスを参照し、使用可能なドライブ文字を見つける
    • 私のユーザーがすでに 26 個のドライブをマップしているとは思えません...)
  • ドキュメント ライブラリがマップされると、FileSystemObject コマンドを使用して反復でき、アイテム タイトルを 2 次元配列にロードできます。
  • 3 サブフォルダーのリストを許可するようにコードを変更する必要があります
    • サブ内のファイル数の場所をListMyFiles変更するか、別の次元を配列に追加する必要があります。

コードは次のとおりです。この回答に統合されたすべての Stack ソリューションの功績を称えます。

 Private Sub List_Files()
    Const MY_FILENAME = "C:\BAT.BAT"
    Const MY_FILENAME2 = "C:\DELETE.BAT"

    Dim i As Integer
    Dim FileNumber As Integer
    Dim FileNumber2 As Integer
    Dim retVal As Variant
    Dim DriveLetter As String
    Dim TitleArray()

    FileNumber = FreeFile
     'create batch file

    For i = Asc("Z") To Asc("A") Step -1
    DriveLetter = Chr(i)
    If Not oFSO.DriveExists(DriveLetter) Then
        Open MY_FILENAME For Output As #FileNumber
        'Use CHR(34) to add escape quotes to the command prompt line
    Print #FileNumber, "net use " & DriveLetter & ": " & Chr(34) & "\\sharepoint.site.com@SSL\DavWWWRoot\cybertron\HR\test\the_lab\Shared Documents" & Chr(34) & " > H:\Log.txt"
        Close #FileNumber
      Exit For
    End If
  Next i

     'run batch file
    retVal = Shell(MY_FILENAME, vbNormalFocus)

     ' NOTE THE BATCH FILE WILL RUN, BUT THE CODE WILL CONTINUE TO RUN.
     'This area can be used to evaluate return values from the bat file
    If retVal = 0 Then
         MsgBox "An  Error Occured"
        Close #FileNumber
        End
    End If

'This calls a function that will return the array of item titles and other metadata
    ListMyFiles DriveLetter & ":\", False, TitleArray()

    'Create code here to work with the data contained in TitleArray()

    'Now remove the network drive and delete the bat files
    FileNumber2 = FreeFile

    Open MY_FILENAME2 For Output As #FileNumber2
    Print #FileNumber2, "net use " & DriveLetter & ": /delete > H:\Log2.txt"
    Close #FileNumber2

     retVal = Shell(MY_FILENAME2, vbNormalFocus)
     'Delete batch file
    Kill MY_FILENAME
    Kill MY_FILENAME2

End Sub

ディレクトリを読み込んでファイル情報の配列を返す関数は次のとおりです。

Sub ListMyFiles(mySourcePath As String, IncludeSubFolders As Boolean, TitleArray())
    Dim MyObject As Object
    Dim mySource As Object
    Dim myFile As File
    Dim mySubFolder As folder
    Dim FileCount As Integer
    Dim CurrentFile As Integer
    'Dim TitleArray()
    Dim PropertyCount As Integer
    CurrentFile = 0
    Set MyObject = New Scripting.FileSystemObject
    Set mySource = MyObject.GetFolder(mySourcePath)

    FileCount = mySource.Files.Count
    ReDim TitleArray(0 To FileCount - 1, 4)

    'On Error Resume Next
    For Each myFile In mySource.Files
        PropertyCount = 1
        TitleArray(CurrentFile, PropertyCount) = myFile.Path
        PropertyCount = PropertyCount + 1
        TitleArray(CurrentFile, PropertyCount) = myFile.Name
        PropertyCount = PropertyCount + 1
        TitleArray(CurrentFile, PropertyCount) = myFile.Size
        PropertyCount = PropertyCount + 1
        TitleArray(CurrentFile, PropertyCount) = myFile.DateLastModified
        CurrentFile = CurrentFile + 1
    Next

    'The current status of this code does not support subfolders.
    'An additional dimension or a different counting method would have to be used
    If IncludeSubFolders = True Then
        For Each mySubFolder In mySource.SubFolders
            Call ListMyFiles(mySubFolder.Path, True, TitleArray())
        Next
    End If
End Sub

空のネットワーク ドライブを見つけるための回答をくれた Chris Hayes に感謝します。ozgrid の Kenneth Hobson に、ディレクトリ内のファイルの一覧表示に関する詳細な回答をありがとう。コードの残りの部分は古く、2010 年に最後に触れたフォルダーから掘り起こしました。

于 2013-09-10T19:23:54.840 に答える