Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
fsoでAppDataフォルダ配下にアクセスできない?
投稿日時: 18/08/06 19:28:35
投稿者: なと

VBAで書いているものの実際にはOS側の問題のような気がしますが、VBA上での対策が知りたいので一応ここで質問させてください。
 
自作アドインの設定値を保存するために、
C:\Users\ユーザー名\AppData\Roaming\
にソフト名のフォルダを作りその中にiniやらxmlを保存しています。
 
今までは問題なくこれで利用していたのですが、ここ最近のPCで次のように動かない状態が発生して頭を抱えています。
 
問題なく利用していたPCはWindows 7 / 8.1 / 10 1703で
今回問題の発生したPCはWindows 10 1709です。
それぞれPC1台しか確認出来ていませんので、本当にOSのバージョン依存かは不明です。
 
fso.CreateFolder("C:\Users\ユーザー名\AppData\Roaming\ソフト名")
とするとエラー無く作成でき、2回目は既に作成されているエラーが出ます。
 
しかし実際にエクスプローラでこのフォルダを開くと存在しません。
Shell "explorer " & パス
 
Everythingを使用して一体どこに保存されているのか調べた結果
C:\Users\ユーザー名\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\
に作成されていることを特定しました。
 
さらに調べてみるとVBA上で(fsoで)AppData以下のフォルダにアクセスしたとき自動的に上記パスに処理が反映されていることが分かりました。
 
またxmlを読み書きするのにDOMを使用していますが、こちらは転送されない為、初期設定ファイルの自動構築などの工程でエラーが出てしまいます。
 
何か対処法は無いでしょうか・・・。
設定をレジストリに保存するように変えるしかないのでしょうか。。。
 
以上、よろしくお願いいたします。

回答
投稿日時: 18/08/07 10:20:33
投稿者: Suzu

確認ができない環境ではありますが
 
Windows 10 1709
"C:\Users\ユーザー名\AppData\Roaming\ソフト名"
実体のないフォルダという事でしょうか。
 
それも、実体があるけど、他に
C:\Users\ユーザー名\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\
があるのかな?
 
 

引用:
さらに調べてみるとVBA上で(fsoで)AppData以下のフォルダにアクセスしたとき自動的に上記パスに処理が反映されていることが分かりました。

であれば、FSOでなければ??
 
FSOで GetFile にて、目的ファイルをGetした時の FileObject のパスはどうなっているのでしょう。
C:\Users\ユーザー名\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\
になっているなら、その値を取得し、DOM に渡せば良いでしょうし、
 
あるいは、初めから FSO を使わないで フォルダを作る、ファイルを作る を行うとか。。

投稿日時: 18/08/07 18:40:41
投稿者: なと

Suzuさま
 
回答ありがとうございます。
 

引用:
"C:\Users\ユーザー名\AppData\Roaming\ソフト名"
実体のないフォルダという事でしょうか。
それも、実体があるけど、他に
C:\Users\ユーザー名\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\

"C:\Users\ユーザー名\AppData\Roaming\"はちゃんと存在します。
普通にフォルダで開いたり、Shell "Explorer パス"とすれば開くことも出来ます。
仰る通り、別途そちらのフォルダが存在しています。
 
引用:
FSOで GetFile にて、目的ファイルをGetした時の FileObject のパスはどうなっているのでしょう。

fsoで取得したパスはVBA上で
fso.GetFolder(*).Path
fso.GetFile(**).Path
などとする分には
"C:\Users\ユーザー名\AppData\Roaming\ソフト名"
なのです。
従ってVBA上では
"C:\Users\ユーザー名\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\"に転送されてることを、fsoでは検知できそうにありません。
 
あとVBAのステートメントであるmkdirなどはすぐには確認出来ないため追って報告します。
 
引用:
あるいは、初めから FSO を使わないで フォルダを作る、ファイルを作る を行うとか。。

最悪コレですね。そこら中でfsoは使っているので、全部書き換えるとなると中々に厄介ですが・・・。

投稿日時: 18/08/10 10:06:34
投稿者: なと

お待たせしました。検証結果です。
1.fso.CreateFolder、mkdirいずれの場合も謎のパスに読み書きすることが確認されました。
2.先日XmlDocでは転送されないと書きましたが、改めて見直したら気の所為でした。
3.OpenステートメントなどVBA標準の機能はいずれも転送されています。
4.問題のPCは再起動されたりしていますが、当時のディレクトリ名から変化していませんでした。
固定かも知れませんが、PCによって違うのかも知れません。
 
ということで、謎のパスのまま設定を保存して運用させることは可能だと思われます。
AppData直下にアクセスするのは諦めるにしても問題が残ります。
 
例えば外部プログラムにパスを渡す時で

    Shell "explorer " & Chr(34) & fso.GetFolder(sPath).Path & Chr(34), vbNormalFocus

のようにしても実フォルダが取得出来ないためエラー(マイドキュメントが開かれます)
なんとかして取得することは出来ないものでしょうか。
 
問題を確認しているPCは
OSはWindows 10 1709
ExcelバージョンはOffice Personal 2016の16.0.9126.2116(32bit)
です。
 
以下はテスト用に書いたコードです。
Public Const APP_NAME = "CreateFolderTest"

'ユーザーの%appdata%フォルダ
Public Function GetAppDataFolder() As String
    Dim WSH As Object
    Set WSH = CreateObject("WScript.Shell")
    GetAppDataFolder = WSH.SpecialFolders("AppData") & "\"
    Set WSH = Nothing
End Function

Sub テストコード()

    Dim fso As New FileSystemObject
    Dim sPath As String
    sPath = GetAppDataFolder() & APP_NAME & ""
    
    On Error Resume Next
    fso.DeleteFolder sPath
    RmDir sPath    'RmDirも同じ結果
    On Error GoTo 0
    
    fso.CreateFolder sPath
    'MkDir sPath    'MkDirも同じ結果
    
    '※一部(例:Win10 1709)では存在しないためマイドキュメントが開かれる
    Shell "explorer " & Chr(34) & sPath & Chr(34), vbNormalFocus
    
    'しかしVBA上ではfsoを通しても同一のパスが返される
    Debug.Print "sPath = fso.GetFolder(sPath).Path : " & _
                (sPath = fso.GetFolder(sPath).Path)
     
End Sub

投稿日時: 18/08/10 15:56:58
投稿者: なと

MMYS様ありがとうございます。
 
参考URL拝見させていただきました。
 
私には内容が難しすぎて理解できないのですが、
まず当該PCはActive Directoryドメイン環境下ではありません。
またバージョンは1709で止めており、アップデートは全て適用しています。
新入社員のPCで導入4ヶ月なので、リダイレクト先を変更するような設定はされていません。
 
全然情報が見つからないところを見るとレアケースなのでしょうか・・。
 
他に情報をお持ちの方がいましたらよろしくお願いいたします。

トピックに返信