VBAを使用してSharePointからExcelファイルを開こうとしています。探しているファイルはマクロを実行するたびに異なる可能性があるため、SharePointフォルダーを表示して必要なファイルを選択できるようにします。
ネットワークドライブ上のファイルを検索する場合、以下のコードは正常に機能しますが、それをSharePointアドレスに置き換えると、「ランタイムエラー76:パスが見つかりません」と表示されます。
Sub Update_monthly_summary()
Dim SummaryWB As Workbook
Dim SummaryFileName As Variant
ChDir "http://sharepoint/my/file/path"
SummaryFileName = Application.GetOpenFilename("Excel-files,*.xls", _
1, "Select monthly summary file", , False)
If SummaryFileName = False Then Exit Sub
Set SummaryWB = Workbooks.Open(SummaryFileName)
End Sub
このアドレスをWindowsエクスプローラーに貼り付けると、SharePointフォルダーへのアクセスに問題がないため、パスが正しいことがわかります。
VBAが気に入らないのはなぜですか?
SharePointサイトからファイルを選択するには、次のコードを試してください。
Dim SummaryWB As Workbook
Dim vrtSelectedItem As Variant
With Application.FileDialog(msoFileDialogOpen)
.InitialFileName = "https://sharepoint.com/team/folder" & "\"
.AllowMultiSelect = False
.Show
For Each vrtSelectedItem In .SelectedItems
Set SummaryWB = Workbooks.Open(vrtSelectedItem)
Next
End With
If SummaryWB Is Nothing then Exit Sub
正しく覚えていれば、Microsoft Scripting Runtime
参照を有効にする必要があります。また、あなたのサイトはバックスラッシュを使用するかもしれません、私のものはスラッシュを使用します。
作成した次の関数を使用して、URLをWebDAVアドレスに変換します。この関数は、通常のシステムパスと無傷のUNCパスも返します。
この関数を呼び出すには、VBAプロジェクトのモジュールに追加し、ファイルダイアログコマンドの直後で、ファイルダイアログで選択したパスを使用する前にMyNewPathString = Parse_Resource(myFileDialogStringVariable)
を入力します。次に、ターゲットファイルの場所を使用するときに「MyNewPathString」を参照します。
Public Function Parse_Resource(URL As String)
'Uncomment the below line to test locally without calling the function & remove argument above
'Dim URL As String
Dim SplitURL() As String
Dim i As Integer
Dim WebDAVURI As String
'Check for a double forward slash in the resource path. This will indicate a URL
If Not InStr(1, URL, "//", vbBinaryCompare) = 0 Then
'Split the URL into an array so it can be analyzed & reused
SplitURL = Split(URL, "/", , vbBinaryCompare)
'URL has been found so prep the WebDAVURI string
WebDAVURI = "\\"
'Check if the URL is secure
If SplitURL(0) = "https:" Then
'The code iterates through the array excluding unneeded components of the URL
For i = 0 To UBound(SplitURL)
If Not SplitURL(i) = "" Then
Select Case i
Case 0
'Do nothing because we do not need the HTTPS element
Case 1
'Do nothing because this array slot is empty
Case 2
'This should be the root URL of the site. Add @ssl to the WebDAVURI
WebDAVURI = WebDAVURI & SplitURL(i) & "@ssl"
Case Else
'Append URI components and build string
WebDAVURI = WebDAVURI & "\" & SplitURL(i)
End Select
End If
Next i
Else
'URL is not secure
For i = 0 To UBound(SplitURL)
'The code iterates through the array excluding unneeded components of the URL
If Not SplitURL(i) = "" Then
Select Case i
Case 0
'Do nothing because we do not need the HTTPS element
Case 1
'Do nothing because this array slot is empty
Case 2
'This should be the root URL of the site. Does not require an additional slash
WebDAVURI = WebDAVURI & SplitURL(i)
Case Else
'Append URI components and build string
WebDAVURI = WebDAVURI & "\" & SplitURL(i)
End Select
End If
Next i
End If
'Set the Parse_Resource value to WebDAVURI
Parse_Resource = WebDAVURI
Else
'There was no double forward slash so return system path as is
Parse_Resource = URL
End If
End Function
この関数は、ファイルパスがURLであり、安全か(HTTPS)安全でないか(HTTP)をチェックします。 URLの場合、SharePointのターゲットファイルに直接リンクできるように、適切なWebDAV文字列を作成します。
特に、SharePointファームと同じドメインに座っていない場合は、ファイルを開くたびにユーザーに資格情報の入力が求められます。
注: httpサイトでこれをテストしていませんが、動作することを確信しています。
スクリプトからhttp://sharepoint/my/file
をパスとして使用するのではなく、\\sharepoint\my\file
を使用することで動作するはずです。 C#で作成された私のプログラムで動作します。
初期コードにタイプミスがあることに注意してください
MyNewPathString = ParseResource(myFileDialogStringVariable)
に置き換える必要があります
MyNewPathString = Parse_Resource(myFileDialogStringVariable)
アンダースコアが欠落していました。
私のアプローチを使用して、SharePointフォルダーをネットワークドライブとしてマップできます。その後、これまでと同じように進めることができます。
Excel VBAアップ-/複数のSharePointフォルダーからダウンロード
次に、Dir
またはファイルシステムオブジェクトを使用してファイルを参照することもできます。