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)は、メッセージボックスを表示して、現在アクティブなブックのフォルダパスとフルパスを取得して表示します。
  • getFolderPathFromBookgetFullPathFromBook 関数の呼び出し: 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)を追加してフルパスを作成します。これにより、ブックの完全なファイルパスが得られます。

全体の流れ

  1. test サブプロシージャが実行されると、現在アクティブなブックのフォルダパスとフルパスが取得され、メッセージボックスで表示されます。
  2. getFolderPathFromBook 関数が、ブックの保存パスがローカルかクラウド(OneDrive)かを判定し、それに基づいてフォルダパスを返します。
  3. getFullPathFromBook 関数は、フォルダパスにブック名を追加してフルパスを返します。

このコードは、特にOneDrive上に保存されているファイルに対応するため、ローカルとクラウドの両方で適切に動作するように設計されています。

参考資料

この記事は、以下を参考にています。感謝いたします。

https://www.cellnets.co.jp/dev_column/9005

【VBA入門】OneDrive上のフォルダ指定で取得PATHがhttpに変わってしまう対策

Follow me!