Excelブックのフォルダパスやフルパスを取得。法人向けと個人向けのOneDriveの両方に対応。
サンプルのマクロは以下です。
Private Sub test()
MsgBox getFolderPathFromBook(ActiveWorkbook) _
& vbCrLf & getFullPathFromBook(ActiveWorkbook)
End Sub
'*******************************
'* ブックからフォルダパスを取得。ファイル名除く。One Drive対応。
'* 戻り値:ブックのフォルダパス
'* wb:開いているWorkbookを指定
Function getFolderPathFromBook(ByVal wb As Workbook) As String
Dim url As String, localPath As String
Dim oneDrivePath As String, cloudPattern As String
' ブックのPathを取得
url = wb.path
' クラウド上でなければ終了
If Not url Like "https*" Then
getFolderPathFromBook = url
Exit Function
End If
' 法人向けOneDriveのURLか否かを判定するためのLike右辺値
Const Cns_OneDrive法人パターン As String = "*my.sharepoint.com*"
' 法人向けOneDrive:S_Url="https://会社名-my.sharepoint.com/personal/ユーザー名_domain_com/Documentsファイルパス")
If (url Like Cns_OneDrive法人パターン) Then
'OneDrive用フォルダーのパスを取得
'法人用
oneDrivePath = Environ("OneDriveCommercial")
If oneDrivePath = "" Then oneDrivePath = Environ("OneDrive")
'パターン文字列指定 ' 「/Documents」を追加
cloudPattern = "https://.+my.sharepoint.com/personal/[^/$]+/Documents" '法人用
' .+ は正規表現で、次のような意味を持ちます:
' .:改行を除く任意の1文字を表します。
' +:直前のパターンが1回以上繰り返されることを表します。
' つまり、この正規表現は「改行を除く任意の文字が1文字以上連続する部分」にマッチします。
' [^/$] は正規表現で、次のような意味を持ちます:
' ^...: 角括弧の中にある文字以外の任意の1文字を表します。
' [^/$]:スラッシュ / またはドル記号 $ 以外の任意の1文字を表します。
' +:直前のパターンが1回以上繰り返されることを表します。
' つまり、この正規表現は「スラッシュ / またはドル記号 $ 以外の文字が1文字以上連続する部分」にマッチします。
Else
'OneDrive用フォルダーのパスを取得
'個人用
oneDrivePath = Environ("OneDrive")
If oneDrivePath = "" Then oneDrivePath = Environ("OneDriveConsumer")
'パターン文字列指定
cloudPattern = "https://d.docs.live.net/[^/$]+" '個人用
End If
'パターン文字列の範囲をOneDrive用フォルダーのパスに置換
With CreateObject("VBScript.RegExp")
.Pattern = cloudPattern
.IgnoreCase = True
' url="https://会社名-my.sharepoint.com/personal/ユーザー名_domain_com/Documents" + "/ファルダ名"
.Global = False
localPath = .Replace(url, oneDrivePath)
' urlのPattern部分(https~/Documents)を、oneDrivePathに置換
End With
'残る「/」をセパレーターに変換
localPath = Replace(localPath, "/", Application.PathSeparator)
' 出力
getFolderPathFromBook = localPath
End Function
'*******************************
'* ブックからフルパスを取得。ファイル名含む。One Drive対応。
'* 戻り値:ブックのフルパス
'* wb:開いているWorkbookを指定
Function getFullPathFromBook(ByVal wb As Workbook) As String
getFullPathFromBook = getFolderPathFromBook(wb) & "\" & wb.Name
End Function
このVBAコードは、現在開いているExcelブックのフォルダパス(ファイル名を除く)やフルパス(ファイル名を含む)を取得するためのものです。特に、OneDrive上に保存されたファイルにも対応しており、法人向けと個人向けのOneDriveの両方に対応しています。以下、コードの各部分について詳しい解説を行います。
Sub test
Private Sub test()
MsgBox getFolderPathFromBook(ActiveWorkbook) _
& vbCrLf & getFullPathFromBook(ActiveWorkbook)
End Sub
- 機能概要: このサブプロシージャ(
test
)は、メッセージボックスを表示して、現在アクティブなブックのフォルダパスとフルパスを取得して表示します。 getFolderPathFromBook
とgetFullPathFromBook
関数の呼び出し:getFolderPathFromBook
関数はブックのフォルダパスを返し、getFullPathFromBook
関数はファイル名を含むフルパスを返します。それらを連結し、メッセージボックスに表示します。
Function getFolderPathFromBook
Function getFolderPathFromBook(ByVal wb As Workbook) As String
- 引数:
wb
は処理対象のWorkbook
オブジェクトを渡します。この関数はブックのパスを処理し、フォルダパスを返します。 url = wb.path
:wb.path
はブックの保存されているフォルダパスを取得します。このパスがクラウドストレージかローカルかで処理が変わります。- クラウドチェック:
If Not url Like "https*"
によって、ブックがクラウド上にあるかどうかを判定しています。https*
が含まれていない場合、ローカルファイルとして処理されます。
OneDrive法人向けの場合
Const Cns_OneDrive法人パターン As String = "*my.sharepoint.com*"
- OneDrive法人向けのURL判定: 法人向けOneDriveの場合、URLに
my.sharepoint.com
が含まれるため、このパターンを用いて判定しています。もし法人向けの場合、環境変数OneDriveCommercial
またはOneDrive
を使ってOneDriveのローカルパスを取得します。
正規表現による置換
cloudPattern = "https://.+my.sharepoint.com/personal/[^/$]+/Documents"
- 正規表現パターン:
https://.+my.sharepoint.com/personal/[^/$]+/Documents
はURLの先頭部分(OneDriveのドキュメントフォルダまで)を抽出するための正規表現です。この部分をOneDriveのローカルフォルダパスに置換します。
個人用OneDriveの場合
cloudPattern = "https://d.docs.live.net/[^/$]+"
- 個人向けOneDrive対応: 個人向けのOneDriveの場合、
d.docs.live.net
を用いて同様にURLを判定し、環境変数OneDrive
またはOneDriveConsumer
でローカルパスを取得します。
パス置換処理
With CreateObject("VBScript.RegExp")
.Pattern = cloudPattern
.IgnoreCase = True
.Global = False
localPath = .Replace(url, oneDrivePath)
End With
- 正規表現による置換処理:
VBScript.RegExp
オブジェクトを使用して、クラウド上のURLパス部分をローカルのOneDriveパスに置き換えます。 Replace
: クラウドパスの該当部分をoneDrivePath
に置換し、ローカルでのパスを生成します。
Function getFullPathFromBook
Function getFullPathFromBook(ByVal wb As Workbook) As String
getFullPathFromBook = getFolderPathFromBook(wb) & "\" & wb.Name
End Function
- 機能概要:
getFolderPathFromBook
関数で取得したフォルダパスに、ブック名(wb.Name
)を追加してフルパスを作成します。これにより、ブックの完全なファイルパスが得られます。
全体の流れ
test
サブプロシージャが実行されると、現在アクティブなブックのフォルダパスとフルパスが取得され、メッセージボックスで表示されます。getFolderPathFromBook
関数が、ブックの保存パスがローカルかクラウド(OneDrive)かを判定し、それに基づいてフォルダパスを返します。getFullPathFromBook
関数は、フォルダパスにブック名を追加してフルパスを返します。
このコードは、特にOneDrive上に保存されているファイルに対応するため、ローカルとクラウドの両方で適切に動作するように設計されています。
参考資料
この記事は、以下を参考にています。感謝いたします。
https://www.cellnets.co.jp/dev_column/9005
【VBA入門】OneDrive上のフォルダ指定で取得PATHがhttpに変わってしまう対策