OneDriveに保存されている状態でできなかったのは何故でしょうか?
についての回答です。
「ローカルウィンドウ」などで、ThisWorkbook.Path
のパスを確認すればわかるのですが、
OneDrive上のファイルの場合https://d.docs.live.net/~
で始まるパス(WEB上のURL)となってしまいます。
https://~
のパスはDir関数にはフォルダと認識されないため「ファイル名または番号が不正です。」のエラーが発生します。
対処としては、OneDriveに保存されている状態でもC:\~
のようなローカルのパスを取得できるのがベストですが、調査不足で取得方法は不明です。
他の対処としては以下が考えられます。
参考
OneDriveの仕様が変わったのでしょうか? - マイクロソフト コミュニティ
特定の文字列から始まったらEnviron("OneDrive")
でパスの先頭を置き換える
vba
1 'かなり適当&決め打ちの処理。
2 Dim fso As Object 'As Scripting.FileSystemObject
3 Set fso = VBA . Interaction . CreateObject ( "Scripting.FileSystemObject" )
4
5 Dim p As String
6 p = ThisWorkbook . Path
7
8
9 If VBA . Strings . InStr ( 1 , p , "https://d.docs.live.net/" , vbBinaryCompare ) = 1 Then
10 'OneDriveのパスなら~
11 Dim s ( ) As String
12 s = VBA . Strings . Split ( p , "/" , Limit : = 5 , Compare : = vbBinaryCompare )
13
14 p = fso . GetAbsolutePathName ( fso . BuildPath ( VBA . Interaction . Environ $ ( "OneDrive" ) , s ( UBound ( s ) ) ) )
15 End If
16
17 MsgBox p
(ファイル名の列挙が目的であれば)Shell.Application
を使用する
vba
1 Sub message2 ( )
2 'https://teratail.com/questions/250814 (Dir関数を用いてフォルダ内のブック名を表示するプログラムで発生するエラー)
3
4 'Shell32.~となっている型宣言は、「参照設定」から「Microsoft Shell Controls And Automation」を参照すると使用可能。
5
6 'ファイル列挙に必要なオブジェクトをインスタンス。
7 Dim appShell As Object 'As Shell32.Shell
8 Set appShell = VBA . Interaction . CreateObject ( "Shell.Application" )
9
10 '探索するフォルダーを指定。
11 Dim rootDir As Object 'As Shell32.Folder3
12 Set rootDir = appShell . Namespace ( ThisWorkbook . Path )
13
14 'rootDirの中のファイル・フォルダーの集合。
15 Dim dirItems As Object 'As Shell32.FolderItems3
16 Set dirItems = rootDir . Items ( )
17
18
19 'dirItems.Filterの1個目の引数に指定する定数。
20 'https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/ne-shobjidl_core-_shcontf
21 Const SHCONTF_FOLDERS = &H20 & 'フォルダのみを探す場合。
22 Const SHCONTF_NONFOLDERS = &H40 & 'ファイルのみを探す場合。
23
24 '「*.xlsx」のファイルのみにフィルター。
25 dirItems . Filter SHCONTF_NONFOLDERS , "*.xlsx"
26
27 Dim ブック名 As String
28
29 Dim itm As Object 'As Shell32.FolderItem
30 For Each itm In dirItems
31 ブック名 = itm . Name
32 MsgBox ブック名
33 Next itm
34
35 End Sub
36