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実務の効率化において、ご参考お役立てになれば幸いです。