解決済み

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

  • すぐに回答を!
  • 質問No.9425130
  • 閲覧数282
  • ありがとう数16
  • 気になる数1
  • 回答数9
  • コメント数0

お礼率 46% (47/102)

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

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

  • 回答No.9

ベストアンサー率 37% (581/1567)

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

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

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

お礼率 46% (47/102)

とりあえず仕事で使うPC(Win7)では問題なく動作しました。
テスト的にVBAからVBSを呼び出してみたところ、問題なく動作しました。まぁ、当たり前と言えば当たり前ですが(笑)
投稿日時 - 2018-02-18 16:22:37
たいせつな将来のこと。あえて、知らない人に聞いてみよう。

その他の回答 (全8件)

  • 回答No.8

ベストアンサー率 62% (407/654)

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

ベストアンサー率 42% (1468/3425)

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

お礼率 46% (47/102)

VBAにGetAttr関数があるんですね。勉強になりました。肝腎の結果ですが、残念ながら16が返ってきました。
コマンドプロンプトの方は、HとI が返って来ました。どうもVBAの動作が怪しいように思います。
投稿日時 - 2018-02-06 13:57:01
  • 回答No.6

ベストアンサー率 43% (3399/7801)

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

お礼率 46% (47/102)

エクスプローラーから隠し属性をON/OFFして実行しましたが結果は変わらずでした。
試しに VBAから Attributes = 16 をセットするとVBAもVBSも返値は16で、エクスプローラーの属性も隠し属性OFFです。
次に VBAから Attributes = 18 をセットするとVBAの返値は16、VBSは18です。エクスプローラーの属性は隠し属性ONです。
投稿日時 - 2018-02-05 08:17:22
  • 回答No.5

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

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

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

ベストアンサー率 42% (1468/3425)

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

お礼率 46% (47/102)

mPath = "C:\ProgramData" としても同じです。
アップデートの更新に何度か失敗して更新できていないパッチがあったようなので、最新に更新してみましたがダメです。
投稿日時 - 2018-02-03 20:56:18
  • 回答No.3

ベストアンサー率 43% (3399/7801)

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

お礼率 46% (47/102)

試しに別の隠しフォルダ "C:\Program Files\WindowsApps\" で確認したところ、VBAでもVBSでも18が返って来ました。
どうやら "C:\ProgramData\" が変なようです。
エクスプローラーでプロパティを確認しましたが、隠しフォルダにチェックが入っています。
投稿日時 - 2018-02-03 21:10:25
お礼コメント
masnoske

お礼率 46% (47/102)

隠し属性は解除されていません。
エクスプローラーで隠しファイルの表示をONにしてもOFFにしても結果は同じです。ちなみに隠しファイルの表示をONにすると、C:\ProgramData\ は
半透明に表示されますので、隠し属性は解除されていないと思います。
投稿日時 - 2018-02-03 20:53:47
  • 回答No.2

ベストアンサー率 43% (3399/7801)

コンピューター カテゴリマスター
私の環境(Win10、Excel 2013 64bit)では提示のコードでMsgBoxへ18と表示されます。
お礼コメント
masnoske

お礼率 46% (47/102)

Excelが32ビットか64ビットの違いでしょうか?
再起動して確認しましたが、やっぱりExcelでは16が返って来ます。
投稿日時 - 2018-02-03 15:54:52
  • 回答No.1

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

Windows7 SP2 + LibreOffice5.4
お礼コメント
masnoske

お礼率 46% (47/102)

環境が違うと問題ないのですね。
投稿日時 - 2018-02-03 15:55:28
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ