こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

vbaでフォルダ属性がうまく取れません

vbaでフォルダ属性が隠しフォルダかどうかを調べるコードを書いています。
C:\ProgramData\ は隠しフォルダなのに、なぜか16が返って来ます。
試しにvbs(wsh)だと18が返って来ます。
環境は Win10 + Excel2013(32ビット) です。
vbaで返値18を求めるにはどうすれば良いのでしょうか。

Sub test()
Dim mPath
Dim fso, f
mPath = "C:\ProgramData\"
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(mPath)
MsgBox f.Attributes
End Sub

投稿日時 - 2018-02-03 14:01:11

QNo.9425130

すぐに回答ほしいです

質問者が選んだベストアンサー

興味があったのでいくつかの環境で調べてみました。
Win10 Excel2002 32bit 再現せず
Win10 Excel2013 64bit 再現せず
Win7 Excel2016 32bit 再現!
という結果でした。

Excelの32ビット版の特定のバージョン(少なくとも2013-2016を含む)におけるバグなのではないかと思います。他の隠し属性付きフォルダでは発生しませんでしたので、フォルダ自体にも何か原因があるのかもしれません。しかし、VBSとExcel VBAで差が出ることはかなりおかしいので、VBA自体にもバグがあるのだと思います。

どうしてもVBAで値をとりたいのなら、少し面倒ですが、VBAからVBSを呼び出す形にすれば確実かと思います。

投稿日時 - 2018-02-17 12:54:10

お礼

とりあえず仕事で使うPC(Win7)では問題なく動作しました。
テスト的にVBAからVBSを呼び出してみたところ、問題なく動作しました。まぁ、当たり前と言えば当たり前ですが(笑)

投稿日時 - 2018-02-18 16:22:37

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.8

UACによってC:\ProgramDataが仮想化されて、ユーザープロファイル内にあるリダイレクト先のフォルダの属性を取得している可能性があるのではないでしょうか?

投稿日時 - 2018-02-13 10:33:04

ANo.7

不可解な状況であることは理解できます。
現時点で原因は解りません。
オブジェクトを使わずにGetattr()を使うとどうなりますか。
Sub test()
Dim mPath
mPath = "C:\ProgramData\"
MsgBox Getattr(mPath)
End Sub
---
上記でも16が返るのであれば
添付画像のようにコマンドプロンプトで
attrib c:\programdata
を実行して
H が表示されていれば隠しフォルダです。( 18 が返る)
H が表示されていなければ隠しフォルダではありません。( 16 が返る)

投稿日時 - 2018-02-04 10:15:36

お礼

VBAにGetAttr関数があるんですね。勉強になりました。肝腎の結果ですが、残念ながら16が返ってきました。
コマンドプロンプトの方は、HとI が返って来ました。どうもVBAの動作が怪しいように思います。

投稿日時 - 2018-02-06 13:57:01

ANo.6

>エクスプローラーでプロパティを確認しましたが、隠しフォルダにチェックが入っています。
VBAで隠しフォルダーの属性を付与してみてはいかがですか?
また、他のPCで同じVBAコードを実行してみるのも比較として参考になるでしょう。
何れにしてもOS(Windows 10)のファイル管理機能に不具合が生じているかも知れません。
VBAのコードが原因ではないと思います。

投稿日時 - 2018-02-03 23:28:50

お礼

エクスプローラーから隠し属性をON/OFFして実行しましたが結果は変わらずでした。
試しに VBAから Attributes = 16 をセットするとVBAもVBSも返値は16で、エクスプローラーの属性も隠し属性OFFです。
次に VBAから Attributes = 18 をセットするとVBAの返値は16、VBSは18です。エクスプローラーの属性は隠し属性ONです。

投稿日時 - 2018-02-05 08:17:22

確かに、私は隠し属性はOFFでした。

試しにLinuxでは、どうなるか・・・再起動してドライブが無いという事に気づきました。

カレントなら、異なるOSでも取れるし、互換性ができます。ProgramDataを取ってはいけないのですね。

投稿日時 - 2018-02-03 17:43:28

ANo.4

フォルダ属性=16 ,隠し属性=2 ですので16+2=18でなければいけません。
16ということはフォルダ属性しか取得していないことになります。
mPath = "C:\ProgramData" ではどうなりますか

投稿日時 - 2018-02-03 17:16:15

お礼

mPath = "C:\ProgramData" としても同じです。
アップデートの更新に何度か失敗して更新できていないパッチがあったようなので、最新に更新してみましたがダメです。

投稿日時 - 2018-02-03 20:56:18

ANo.3

>Excelが32ビットか64ビットの違いでしょうか?
違うと思います。
エクスプローラーで目的のフォルダーを確認してみると良いでしょう。
隠し属性が解除されているかも知れません。
通常フォルダーの返り値が16で隠し属性の2を加算した18になるはずです。
VBAはプログラム言語なのでOSや利用するアプリケーションによって異なる結果を返すはずはありません。

投稿日時 - 2018-02-03 17:11:05

補足

試しに別の隠しフォルダ "C:\Program Files\WindowsApps\" で確認したところ、VBAでもVBSでも18が返って来ました。
どうやら "C:\ProgramData\" が変なようです。
エクスプローラーでプロパティを確認しましたが、隠しフォルダにチェックが入っています。

投稿日時 - 2018-02-03 21:10:25

お礼

隠し属性は解除されていません。
エクスプローラーで隠しファイルの表示をONにしてもOFFにしても結果は同じです。ちなみに隠しファイルの表示をONにすると、C:\ProgramData\ は
半透明に表示されますので、隠し属性は解除されていないと思います。

投稿日時 - 2018-02-03 20:53:47

ANo.2

私の環境(Win10、Excel 2013 64bit)では提示のコードでMsgBoxへ18と表示されます。

投稿日時 - 2018-02-03 14:58:02

お礼

Excelが32ビットか64ビットの違いでしょうか?
再起動して確認しましたが、やっぱりExcelでは16が返って来ます。

投稿日時 - 2018-02-03 15:54:52

LibreOffice Calc で「18」が返ってきました。

Windows7 SP2 + LibreOffice5.4

投稿日時 - 2018-02-03 14:14:34

お礼

環境が違うと問題ないのですね。

投稿日時 - 2018-02-03 15:55:28

あなたにオススメの質問