• ベストアンサー

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

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.9

興味があったのでいくつかの環境で調べてみました。 Win10 Excel2002 32bit 再現せず Win10 Excel2013 64bit 再現せず Win7 Excel2016 32bit 再現! という結果でした。 Excelの32ビット版の特定のバージョン(少なくとも2013-2016を含む)におけるバグなのではないかと思います。他の隠し属性付きフォルダでは発生しませんでしたので、フォルダ自体にも何か原因があるのかもしれません。しかし、VBSとExcel VBAで差が出ることはかなりおかしいので、VBA自体にもバグがあるのだと思います。 どうしてもVBAで値をとりたいのなら、少し面倒ですが、VBAからVBSを呼び出す形にすれば確実かと思います。

masnoske
質問者

お礼

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

その他の回答 (8)

回答No.8

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

  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.7

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

masnoske
質問者

お礼

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

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

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

masnoske
質問者

お礼

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

noname#232800
noname#232800
回答No.5

確かに、私は隠し属性はOFFでした。 試しにLinuxでは、どうなるか・・・再起動してドライブが無いという事に気づきました。 カレントなら、異なるOSでも取れるし、互換性ができます。ProgramDataを取ってはいけないのですね。

  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.4

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

masnoske
質問者

お礼

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

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.3

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

masnoske
質問者

お礼

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

masnoske
質問者

補足

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

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.2

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

masnoske
質問者

お礼

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

noname#232800
noname#232800
回答No.1

LibreOffice Calc で「18」が返ってきました。 Windows7 SP2 + LibreOffice5.4

masnoske
質問者

お礼

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