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


PCのマイドキュメン内に格納してある「フォルダ」を選択したのに、取得PATHがなんかへん

SharePointとかHttpとか、これじゃ前に進めない・・・・。

みなさん、こんにちは。セルネッツ竹本です。

今回は、「フォルダの取得PATHが、Http・・・」記述に変わってしまう事象をテーマに、解説をしたいと思います。

◆いったい何が起きているのか。この間は問題なかったのに・・・。

OneDrive」は、オンラインストレージとして、Microsoft社が提供してくれる「クラウドサービス」です。

しかし、何も考えず、ただ無料だからという理由で、インストールSetUpしてしまうと、Cドライブ全体データがWeb上のクラウド領域にアップロードされてしまうので、注意が必要です。

実は、どのフォルダをクラウド領域にアップロードしたいかは、ちゃんと尋ねてきているのです。

これによる影響として、VBAからは、ローカル環境ではなく、WEBクラウド環境の格納PATHが返されます。

こうなってしまうと、フォルダは確かにローカルに見えていても、VBAは処理できず実行時エラーが発生してしまいます。


実際には、マイドキュメントにあるように見えても、クラウド上の領域と連動が成功している場合は、通常の「PATH取得Module」では正しく取得できないため、驚かれる方も多いのでは。

たとえば、こんなふうに・・・。

‘★★★★★★★★★★★★★★★★★★★★★★★★★
‘ [実際のPATH]
‘ C:\Users\cn101\cellnets\00.Share2308
‘   ↓こうなってしまう
‘ https://・・・・ドキュメント/なんちゃら
‘★★★★★★★★★★★★★★★★★★★★★★★★★

◆OneDrive上にあってもローカル環境PATHを取得するにはどうするか

これを回避するには、一時的に、「OneDrive」同期を終了、停止する方法もありますが、VBAプログラム側で、その判定を行ったうえで、ローカルのPATH取得をするには、以下で対応できます。


↓(A)Call する側の記述

’関数をCallして、結果をもらいます!
P_実BP = OneDrive_Url_Path変換(ThisWorkbook.Path)



↓(B)Callされる側のModule

‘※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Public Function OneDrive_Url_Path変換(S_Url As String) As String
‘*** Ver 3.4 OneDrive上で起動した場合、Thisworkbook.PathがURLとなる件の対応(2020/07/16)
‘※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Const Cns_OneDrive法人パターン As String = “my.sharepoint.com
‘法人向けOneDriveのURLか否かを判定するためのLike右辺値

Static S_path区切り As String
Static S_OneDrive法人Path As String
Static S_OneDrive個人Path As String

Dim S_パス位置 As Long

'引数がURLでない場合、引数はローカルパスと判断してそのまま返す。
If Not (S_Url Like "https://*") Then

    OneDrive_Url_Path変換 = S_Url
    Exit Function

End If

If (S_path区切り = "") Then
    S_path区切り = Application.PathSeparator

    '法人向けOneDrive(OneDrive for Business)のパス
    S_OneDrive法人Path = Environ("OneDriveCommercial")
    If (S_OneDrive法人Path = "") Then
        S_OneDrive法人Path = Environ("OneDrive")
    End If

    '個人向けOneDriveのパス
    S_OneDrive個人Path = Environ("OneDriveConsumer")
    If (S_OneDrive個人Path = "") Then
        S_OneDrive個人Path = Environ("OneDrive")
    End If

End If

'法人向けOneDrive:S_Url="https://会社名-my.sharepoint.com/personal/ユーザー名_domain_com/Documentsファイルパス")
If (S_Url Like Cns_OneDrive法人パターン) Then

    S_パス位置 = InStr(1, S_Url, "/Documents") + 10                         '10 = Len("/Documents")
    OneDrive_Url_Path変換 = S_OneDrive法人Path & Replace(Mid(S_Url, S_パス位置), "/", S_path区切り)

'個人向けOneDrive:S_Url="https://d.docs.live.net/CID番号/ファイルパス"
Else

    '********************************************************************************
    '         1         2         3         4         5         6         7         8
    '12345678901234567890123456789012345678901234567890123456789012345678901234567890
    'https://d.docs.live.net/f53c0b88b096e170/デスクトップ/Excel_Ichiran_Ver3.4
    '********************************************************************************

    S_パス位置 = InStr(9, S_Url, "/")                                       '9 = Len("https://") + 1
    S_パス位置 = InStr(S_パス位置 + 1, S_Url, "/")
    OneDrive_Url_Path変換 = S_OneDrive個人Path & Replace(Mid(S_Url, S_パス位置), "/", S_path区切り)

End If

End Function


戻り値は、変数名「P_実BP」に格納されます。(意味は、Public型の実行BookPathを略しただけです・・・)

法人契約と個人とで分かれるところも、なんだか面倒です。

P_実BP = OneDrive_Url_Path変換(ThisWorkbook.Path)


今回のテーマは、「クラウド上でもローカルのPATHを取得する方法」について、解説を行いました。

本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。


全国対応!お気軽にお問い合わせください