トップ回答者
VBA Nikon.NEFの撮影日時の取得で!!

質問
-
運用環境:Windows10(64bit),Excel2016(64bit)
テストデータ:例えば「D:\Test9」フォルダに、Nikon一眼レフ(D300,D810)で撮影した「.NEF」や「.JPG」ファイルが投稿されているとします。
現象:PC起動後に次の「FileListUP」を実行したら「Nikon.NEF」ファイルの撮影日時が正しく表示されません!?。
Excelを終了しないで他のフォルダの「FileListUP」を試しても「Nikon.NEF」は撮影日時が正しく表示されません。
但し、Excelを再起動して「FileListUP」を試みれば撮影日時は正しく表示されます。
尚、PCシャットダウン→PC起動した場合、前述した現象が度々発生(再現)します。
要約:「Nikon.NEF」の撮影日時が正しく表示されない現象は、PC起動後の初回のエクセル起動で発生しています。
補足:Windows10(32bit),Excel2010(32bit)の環境では当該現象は起きていません。
回避方法をご教授いただければ幸いです。Sub FileListUP() Const vPath As Variant = "D:\Test9\" Dim Fso As Object Dim F1 As Object Dim vName As Variant Dim WT As Date Dim sDir As String Dim R As Long Dim Sap As Object Set Fso = CreateObject("Scripting.FileSystemObject") Set Sap = CreateObject("Shell.Application") Cells.Clear '初期化 MsgBox "ファイルの検索を開始します。", 64 Range("C1").Value = "フォルダ" Range("D1").Value = "ファイル" Range("E1").Value = "作成日時" Range("F1").Value = "更新日時" Range("G1").Value = "アクセス日時" Range("H1").Value = "撮影日時" Columns("E:H").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss" Columns("E:H").HorizontalAlignment = xlLeft R = 2 For Each vName In Sap.Namespace(vPath).Items WT = vName.ExtendedProperty("WhenTaken") '撮影日時の取得(WorldTime) sDir = Dir(vName.Path, 7) If sDir <> "." And sDir <> ".." Then If (GetAttr(vName.Path) And vbDirectory) <> vbDirectory Then Set F1 = Fso.GetFile(vName.Path) 'フルパス("D:\Test9\DSC001.NEF"etc) Cells(R, 3) = vPath 'フォルダ Cells(R, 4) = vName 'ファイル 'Cells(R, 4) = F1.Name 'ファイル Cells(R, 5) = F1.DateCreated '作成日時 Cells(R, 6) = F1.DateLastModified '最終更新日時 Cells(R, 7) = F1.DateLastAccessed 'アクセス日時 If WT <> 0 Then Cells(R, 8) = WT + TimeValue("9:00:00") '撮影日時(LocalTime) End If R = R + 1 End If End If Next Set F1 = Nothing Set Sap = Nothing Set Fso = Nothing Columns("A:Z").ColumnWidth = 1 Cells.EntireColumn.AutoFit Range("A1").Select MsgBox "◎◎◎処理完了◎◎◎", 64 End Sub
- 編集済み 立花楓Microsoft employee, Moderator 2018年3月6日 0:18 情報共有のため復元させていただきました。
- 編集済み sakuraxx 2018年4月3日 12:01
回答
-
まずExcel / VBAは CreateObject("Shell.Application") によりShell(≒エクスプローラ)を呼び出し、中継しているだけですので無関係です。
次にShellは Nas.ExtendedProperty("WhenTaken") により???から拡張プロパティWhenTakenを取得、中継しているだけですので無関係です。
少し脱線しますが、PSGetPropertyDescriptionByNameで説明がありますがWhenTakenは互換名でありWindows Vista以降の正式名称はSystem.Photo.DateTakenです。脆弱性やバグを指摘するのであれば、まず互換名を使用していることを認識し、また正式名称を知っている必要があります。さて本題ですが ??? はどこからでしょうか。これはファイルの関連付けと同時に登録されるProperty Handlerとなります。具体的にはRegistering and Distributing Property Handlersの手順をたどることで特定できます。
レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.nef の デフォルト値、手元のPCでは {3DBEE9A1-C471-4B95-BBCA-F39310064458} となっていました。そこから HKEY_CLASSES_ROOT\CLSID\{3DBEE9A1-C471-4B95-BBCA-F39310064458}\InprocServer32 のデフォルト値、手元のPCでは C:\Windows\System32\WindowsCodecsRaw.dll でした。
残念ながら質問文には.NEFにどのプログラムが関連付けられているか、より正確には上記レジストリ状況がどのようになっているか記載がありません。ともあれここで登録されているDLLが初回のみ何らか失敗するということなのでしょう。もし私と同じくWindowsCodecsRaw.dllが登録されていたのであれば、Windowsの問題の可能性が高いです。
もちろんWindowsCodecsRaw.dllの修正を求めることもできますが、NEF Codecやその他のライブラリを用いて別のDLLに差し替えることもできます。
- 回答としてマーク sakuraxx 2018年3月5日 3:45
- 編集済み 立花楓Microsoft employee, Moderator 2018年3月6日 0:19 一部内容を修正させていただきました。
- 回答としてマークされていない sakuraxx 2018年3月11日 8:38
- 回答の候補に設定 お馬鹿 2018年3月12日 1:19
- 回答としてマーク sakuraxx 2018年3月12日 1:34
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
vbaからvbsを起動するか、vbaで、shell.applicationでなく、explorer objectを使えばよい。
念のため、
+16H 時間がずれるということですか?whentakenは -9H+16H = +7H つまり、-7Hのタイムゾーンと勘違いしてる?(アメリカ・カナダ)山岳部標準時 - MST
コマンドプロンプトで
set TZ=JST-9
で確認。
excel.exe
- 編集済み ウィンドウズスクリプトプログラマ 2018年4月20日 13:55
- 回答としてマーク sakuraxx 2018年7月8日 8:40
-
ery srowさんコードの提示ありがとうございました。
ウィンドウズスクリプトプログラマさんアドバイス感謝します。
謎のieの「new:{clsid}モニカ」は未知の領域ですが、Shell(Explorer)で使用する場合の意味合いは何となく解かった様な気がします。
Sample検索ieをまるごとコピーペにて試行させて頂きました。…成功:Excel初回の起動2回目以降の起動においても撮影日時は正常に表示されました。…BerryGood
掲題(質問)の件、お陰様で求めていた回答が得られました。
提示頂いたコードを基に私なりに整え直したコードを下記に提示いたします。
改良点などが有ればご教授よろしくお願いいたします。
Option Explicit Sub Sample検索ie2() ' Dim vPath As Variant: vPath = "C:\var\Test9\" Dim vPath As Variant: vPath = "D:\Test9\" Dim Fso As Object Dim F1 As Object Dim R As Long Dim ie As Object Dim ieFolder As Object Dim ieFolderItem As Variant Dim dateTime As Variant Worksheets("Sheet1").Select Cells.Clear '初期化 MsgBox "ファイルの検索を開始します。", 64 Range("C1").Value = "フォルダ" Range("D1").Value = "ファイル" Range("E1").Value = "作成日時" Range("F1").Value = "更新日時" Range("G1").Value = "アクセス日時" Range("H1").Value = "撮影日時" Range("I1").Value = "エクスプローラー" Cells.Font.Name = "MS ゴシック" Columns("E:I").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss" Columns("E:I").HorizontalAlignment = xlLeft Set Fso = CreateObject("Scripting.FileSystemObject") Set ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") ie.Navigate vPath Do While ie.Busy = True Or ie.readyState <> 4 Application.Wait [NOW()+"0:00:00.1"] Loop R = 2 Set ieFolder = ie.Document.Folder For Each ieFolderItem In ieFolder.Items() If Not ieFolderItem.IsFolder Then Set F1 = Fso.GetFile(ieFolderItem.Path) 'フルパス Cells(R, 3) = vPath 'フォルダ Cells(R, 4) = F1.Name 'ファイル Cells(R, 5) = F1.DateCreated '作成日時 Cells(R, 6) = F1.DateLastModified '最終更新日時 Cells(R, 7) = F1.DateLastAccessed 'アクセス日時 If Not F1 Is Nothing Then dateTime = ieFolderItem.ExtendedProperty("WhenTaken") If Not IsEmpty(dateTime) Then Cells(R, 9) = dateTime + TimeValue("9:00:00") '撮影日時(LocalTime) End If End If Set F1 = Nothing R = R + 1 End If Next ie.Quit Set Fso = Nothing Set ieFolder = Nothing Set ie = Nothing Set F1 = Nothing Columns("A:Z").ColumnWidth = 1 Cells.EntireColumn.AutoFit Range("A1").Select MsgBox "◎◎◎処理完了◎◎◎", 64 End Sub
すべての返信
-
Windows10-Excel2016の環境下で、初回のExcel起動時に、Nikon一眼レフ(D300,D810)で撮影した「.NEF」の撮影日時が正しく取得できない現象が今だに解決しません…!!
補足:Windows10にUpdateする前のWindiws8.1とかWindows7-Excel2010の環境下では当該不具合は起きていませんでした。
WT = vName.ExtendedProperty("WhenTaken")
撮影日時の取得(WorldTime)一旦Excelを終了して当該Excelファイルを開き直すと撮影日時が正しく取得できる現象…これはExcelの脆弱性(バグ)と思うのですが、Microsoftは既知の現象として把握しているのでしょうか?、脆弱性対応はされるのでしょうか?- 編集済み sakuraxx 2018年4月18日 9:30
-
個人としては費用がかさみ「有償サポート問い合わせ」は致しかねます。
そうであれば、Microsoft の回答(現状認識の確認を含む)は得られないということを理解しておいてください。
また、Microsoft はすべての不具合の修正を保証していません。
困っている人が少ない不具合は「修正しない」と判断することがあり得ます。
(困っている人が多かろうが、プレミアサポートを使おうが、セキュリティ脆弱性ではない不具合が修正されるまでに数ヶ月かかるのも割と聞く事例ですが…。)即ち、初回から正しく撮影日時が取得できることが「あるべき姿」ではないでしょうか(本来守るべきものを守れていない)。
その論理で言えば、すべての不具合を脆弱性と呼べてしまいます。
ソフトウェアの世界で「脆弱性」で守るべき対象は「セキュリティ」に限定されていると言って過言ではありません。
たとえば、総務省が公開する言葉の説明でも言い切っています。http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/risk/11.html
→Excel初回起動での撮影日時が正しく取得できない(差異+16h)。Excel再起動で正しい撮影日時が取得できます。
その再現条件を聞いている限り、個人的には同じアプローチを取り得る限り、回避策が存在しない可能性が高いのでは?と思います。
(Windows 起動時に Excel を空起動して、終了してから使い始めるというのも立派な「回避策」ですけれども…)よって、試していません。どちらかと言えば、別の方法(Shell.Application を使わない、Excel ではなく別の開発環境で Excel 生成するなど)を探すでしょうね…。
あるいは、Office (32bit) に変えてみて問題が起きないかどうか試すとか。
- 編集済み AzuleanMVP 2018年3月3日 9:30
-
とりあえず、最初の1回目だけ発生したような印象でしたが、次以降の再起動でも再現しなくなったので、申し訳ないですが、私としては関心がなくなっています。
(Win10 1709 (x64) + Office 2016 1708 (32bit))- 編集済み AzuleanMVP 2018年3月3日 12:17
-
質問:別の方法(Shell.Applicationを使わない)とは?…
今まで色々試みては見たのですが「yyyy/mm/dd hh:mm:ss」を取得するに至っていません。そういったライブラリを探すとか、そういったサンプルを探すとか。
自力でやる手もなくはないですが、Tiff IFD とか Exif IFD を理解しないとだめですね。
たとえば、NikonD300.NEF であれば…- 先頭 2 バイトの MM でビッグエンディアンだと判定できる
- 0x0004-0x0007 で 0th IFD のオフセットがわかる
- そのオフセット位置を TIFF ヘッダーを基準とした位置とみなして、シークしてから読み込む
- 2 バイト読み込み、0x001B なので 0th IFD のタグ数は 27 個
- ID 2 バイト、型 2 バイト、要素数 4 バイト、データ or オフセット 4 バイトを1組のタグとして順次読み込む
- Exif IFD Pointer 0x8769 を見つけて、オフセットを知る(このファイルの場合 0x0258)
- そのオフセット位置を TIFF ヘッダーを基準とした位置とみなして、シークしてから読み込む
- 2 バイト読み込み、0x0020 なので 32 個タグがある。
- ここでも ID ~ データ or オフセットの 2+2+4+4=12 バイト単位で読み込んでいく
- 撮影日時を表す 0x9003 を見つけ、そのオフセットと要素数を知る(このファイルの場合 0x03F0 と 0x00000014)
- そのオフセット位置を TIFF ヘッダーを基準とした位置とみなして、シークしてから読み込む
- 0x00000014 なので 20 バイト読み込む
- "2017:04:05 07:39:17" という文字列が得られるので日付・時刻と解釈する
私は基本 C#、手を出して C++ までなので、VB でロジックを書くことは手間がかかりすぎることもあり、コードの提供はできません。
なお、現象を安定的に再現させることは重要じゃないので、試していません。
- 編集済み AzuleanMVP 2018年3月3日 13:28
-
まずExcel / VBAは CreateObject("Shell.Application") によりShell(≒エクスプローラ)を呼び出し、中継しているだけですので無関係です。
次にShellは Nas.ExtendedProperty("WhenTaken") により???から拡張プロパティWhenTakenを取得、中継しているだけですので無関係です。
少し脱線しますが、PSGetPropertyDescriptionByNameで説明がありますがWhenTakenは互換名でありWindows Vista以降の正式名称はSystem.Photo.DateTakenです。脆弱性やバグを指摘するのであれば、まず互換名を使用していることを認識し、また正式名称を知っている必要があります。さて本題ですが ??? はどこからでしょうか。これはファイルの関連付けと同時に登録されるProperty Handlerとなります。具体的にはRegistering and Distributing Property Handlersの手順をたどることで特定できます。
レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.nef の デフォルト値、手元のPCでは {3DBEE9A1-C471-4B95-BBCA-F39310064458} となっていました。そこから HKEY_CLASSES_ROOT\CLSID\{3DBEE9A1-C471-4B95-BBCA-F39310064458}\InprocServer32 のデフォルト値、手元のPCでは C:\Windows\System32\WindowsCodecsRaw.dll でした。
残念ながら質問文には.NEFにどのプログラムが関連付けられているか、より正確には上記レジストリ状況がどのようになっているか記載がありません。ともあれここで登録されているDLLが初回のみ何らか失敗するということなのでしょう。もし私と同じくWindowsCodecsRaw.dllが登録されていたのであれば、Windowsの問題の可能性が高いです。
もちろんWindowsCodecsRaw.dllの修正を求めることもできますが、NEF Codecやその他のライブラリを用いて別のDLLに差し替えることもできます。
- 回答としてマーク sakuraxx 2018年3月5日 3:45
- 編集済み 立花楓Microsoft employee, Moderator 2018年3月6日 0:19 一部内容を修正させていただきました。
- 回答としてマークされていない sakuraxx 2018年3月11日 8:38
- 回答の候補に設定 お馬鹿 2018年3月12日 1:19
- 回答としてマーク sakuraxx 2018年3月12日 1:34
-
理解した範囲で確認と試行をしてみました…問題は解決しませんでした。
佐祐理さんが示唆していた、解決するとしたらという話は、WindowsCodecsRaw.dll の代わりに同じ仕事をする DLL を入手・インストールしてみたらという話ですので、それにチャレンジしていないのなら、現状から変わりません。
- 編集済み AzuleanMVP 2018年3月4日 21:23
- 編集済み 立花楓Microsoft employee, Moderator 2018年3月6日 0:30 オペレーター確認
-
私が投稿する前、1年近くにわたるご自身の行動を振り返るべきです。加えて実質的にスレッドを削除するような行為も。
私に限らず全ての回答者は見ず知らずのsakuraxxさんの質問に無償で答える義理は全くありません。ではなぜ無償の回答者がいるのか、それは質問者さん個人ではなく同様の問題を抱えるであろう他の開発者(検索で訪れるであろう将来の閲覧者)のため、Q&Aを蓄積するというフォーラムの趣旨に賛同したからでしかありません。
もし、sakuraxxさんの個人的な問題の解決だけを求めるのであれば、ここに限らず公開フォーラムの場で尋ねるのではなく、回答してくれる教師役を雇うことをお勧めします。 -
こんなん↓見つけたんですけど、頓珍漢な返信だったらごめんなさい。
------------------------------------------------
NEF Codec
http://downloadcenter.nikonimglib.com/ja/download/sw/22.html3. Windows Vista、Windows 7及びWindows 8.1の64bitOSの対応について
Windows Vista、Windows 7及びWindows 8.1の64bit版において、エクスプローラー、
Windows フォトギャラリーまたはWindows フォトビューアーで
NEFファイルのサムネイルが正しく表示されないことがあります。
その場合は下記の手順でディスククリーンアップを実行してください。1) [コンピュータ] のシステムドライブを右クリックし、[プロパティ]を選ぶ。
2) [全般]タブの[ディスク クリーンアップ]を選ぶ。
3) [ディスク クリーンアップ]タブの[削除するファイル]にある[縮小表示]にチェックを入れ、他の項目のチェックを外す。
4) [OK]を選んで、ディスククリーンアップを実行する。[これらのファイルを完全に削除しますか?] と表示されたら [ファイルの削除] を選ぶ。
※詳しい手順は こちら をご覧ください。
------------------------------------------------ -
○○さん情報ありがとうございます。
私の運用環境はWindows10にてご紹介のコーディックは該当しないと思います。
Azuleanさんの指摘をヒントに調べ事をして理解したのですが、
佐祐理さんが言われている「NEF Codec」が適当に思えます。暫定的には解決するものと思います。
恒久的には「C:\Windows\System32\WindowsCodecsRaw.dll」が一日も早く改訂される事を望みます。
掲題の件の主原因はExcelではなくWindows10の「WindowsCodecsRaw.dll」が現状においては各社のカメラコーディックに対応していない(レガシー)と言う事になるのでしょうね。
sakuraxx
- 編集済み sakuraxx 2018年3月7日 7:35
-
Codec の置き換えを提案しているわけではありません。
先の返信で示した「ディスククリーンアップ」をしてみたら。。。。ということです。
NEF ファイルは Nikon デジカメ独自の Raw フォーマットだから、WindowsCodecsRaw.dll に実装されている NEF Codec は Nikon から情報提供を受けているはずです。
もしかしたら WindowsCodecsRaw.dll 内の NEF Codec 部分は、Nikon からソース コード提供してもらっている可能性もあるのでは?
だとしたら NEF Codec Ver.1.25.0 と同じ問題が、WindowsCodecsRaw.dll にも内在する可能性もあると思ったので、「ディスククリーンアップ」部分の説明だけをコピペしたのです。
まぁ Nikon の最新 NEF Codec を使うのであればやる意味はないのかもしれませんが、仮に「ディスククリーンアップ」で WindowsCodecsRaw.dll の問題が改善するのであれば、この問題は NEF Codec Ver.1.25.0 と同じ原因かも。。。。という切り分けができると思ったので。 -
○○さんご教授ありがとうございます。
掲題の件は約1年前から解決していなかった案件でした。
その間ディスククリーンアップは不定期ではありますが3ヶ月に一度くらい実施しています(システムイメージバックアップ前に)。
依ってこれが原因とイメージできなかったのでついコーディックが問題解決の手段かも知れないと直感しました。
折角の機会なので、今日「NEF Codec」を下調べした上でインストールして見ました。
http://downloadcenter.nikonimglib.com/ja/download/sw/97.html
Windows 10 Home / Windows 10 Pro / Windows 10 Enterprise 32bit/64bit版 - Ver.1.31.0
≪試行結果≫
掲題のマクロ「Sub FileListUP」を実行した結果、撮影日時が正しく取得できました…問題解決。
試行に使用したファイルは、RAW→JPG変換した次の3セットです。NikonもCannonもOKでした…!?
NikonD300.jpg
NikonD300.NEF
NikonD810.jpg
NikonD810.NEF
CanonEos5DSR.JPG
CanonEos5DSR.CR2追記:お名前書きづらかったので○○さんと表現しました…ご容赦くださいませ。
sakuraxx
- 編集済み sakuraxx 2018年3月7日 15:01
-
最新の Nikon NEF Codec 適用で問題が解決したということは、佐祐理さんが回答されている内容が、この問題の原因と解決方法に関する正に本質を示している、ということだと思います。
以下余談ですけど。。。。
Codec に限らず、デバイス ドライバやデバイスをサポートするユーティリティなど様々なソフトウェアで、マイクロソフトとデバイス メーカーの2系統から、同一目的の異なるソフトウェア モジュールが提供されていることが多々あります。
そーいった場合どっちを使ったら (インストールしたら) いいのか迷うことがありますが、マイクロソフト社製は汎用目的でメーカー製は機能重視。。。。というのが一般的な認識では?
そのデバイス (あるいは製品) の特性を 100% 引き出したいならメーカー製が推奨され、フツーに使えればそれで十分ならマイクロソフト社製のもの。。。。というすみ分けだと思っています。
今回のケースも、それと同様のことでは?
なんで Nikon 製 NEF Codec の利用を躊躇していたのか、私にはその理由がわかりませんけど、完璧なソフトウェアなんて存在しえないと思っているので、目的に合わせて適宜使い分けることも重要ではないかと。
もっともメーカー製が必ず機能的に優れている保証はありませんし、大昔に Sony が CD に Rootkit を仕込んで問題になったように、裏で何やってるのかわかりませんけど。
(まぁそんなことを言ったら、マイクロソフトがこっそりバックドアを仕込んでいる可能性も否定できませんし。wwww) -
私は別に、「汎用的な運用が肝要」と言ってる訳ではないのですが。。。。
要は、目的に合わせて適宜使い分ける柔軟性が重要なのでは。。。ということです。
"Nikon NEF Codec" をインストールすることで、汎用性が失われるとは思っていませんし。
使いたきゃインストールすればいいし、使ってみて「いらねー」と思ったらアンインストールすればいいし、ただそれだけ。
ただし、世の中には裏で何やっているのかわからない、挙動不審なソフトウェアが多数存在するので、そーいう変なものはインストールしないように、注意する必要はあると思います。
なので私は PC に何かソフトウェアをインストールする際には、まず仮想マシン上にインストールしてみて、DLL Injection、Code Injection、API Hook 等の有無を確認してから、自分の PC にインストールするかどうかを判断してます。
(もっともそれだけで十分かというと、全然そんなわけありませんけど、変なものをインストールしてしまうリスクは、若干低減できてる。。。。と思っています。)なお本スレッドでの質問内容に関してもっとも適切な「回答」は、佐祐理さんからの返信だと私は考えます。
少なくとも私からの返信は、「回答」には全く該当しません。
自分で書いといてなんですけど、はっきり言いて「ごみ」のレベルです。
なので私の返信にマークした「回答」は、早急に外してください。
(自分の「ごみ返信」が「回答」としてマークされるなんて、恥をさらしているようで嫌です。。。。できることなら削除したい気分ですけど、それも無責任なようで嫌なので。)
将来このスレッドを参照される方のためにも、佐祐理さんからの返信を「回答」としてマークされることを強くお勧めします。 -
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
そもそも、エクスプローラの詳細表示のための機能です。エクスプローラの詳細表示では正常なのですか?そこで正常なら修正は期待できないでしょう。異常ならフィードバックハブからフィードバックする。
そういえば、時間の掛かるプロパティは取れないという制約があったような。フォルダの総ファイルサイズなど。初回はタイムアウトしてるのかも。エクスプローラで表示してからexcelを実行したらどうなるか。
エクスプローラの詳細表示で正常なら、その方法を真似ればよい。extendedproperty()でなく、getdetailsof()ではどうなのか。とか。shell32.dllでなく、explorer.exeを使う方法もある。
- 編集済み ウィンドウズスクリプトプログラマ 2018年3月12日 8:55
-
今は"Nikon NEF Codec" をアンインストールしてWindows10デフォルトの状態です。
エクスプローラの詳細表示は正常です。
試行:getdetailsof()によるプロパティ情報を次のマクロで取得して見ました。Sub Sample_GetDetailsOf() Dim oShell As Object Dim oFolder As Object Dim sText As String Dim N As Long Dim vFolderName As Variant Dim vFileName As Variant vFolderName = "D:\Test1" vFileName = "NikonD300.NEF" Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.Namespace(vFolderName) For N = 0 To 34 sText = sText & N & " " & _ oFolder.GetDetailsOf(, N) & "=" & _ oFolder.GetDetailsOf(oFolder.ParseName(vFileName), N) & vbCrLf Next MsgBox sText End Sub
撮影日時がyyyy/mm/dd hh:mmまでしか取得できませんでした。秒の値までが必要なので getdetailsof()は適当でありません。
<<shell32.dllでなく、explorer.exeを使う方法もある。>>
非力にてexplorer.exeを使う方法は分からなかったので評価できませんでした。
- 編集済み sakuraxx 2018年3月12日 13:08
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
getdetailsofで取れるなら、その後でextendedpropertyで取り直すと取れるかも。
ファイル名をエクスプローラと同じ順序にソートする。: Windows Script Programming
shell.spplicationと微妙に動作が異なるので試してみないと分からない。
VBAにするには少し翻訳が必要。- 編集済み ウィンドウズスクリプトプログラマ 2018年3月12日 16:18
-
暫定的にこんなやり方でも、
(初回 表示されるまで時間が掛かってなんかおかしいけど)1. まず、NikonD300.NEFをコピーして C:\var\raw\0.NEF としておきます。
(この0.NEFの撮影日時は[2017-04-05 07:39:17]なので この時刻と
ExtendedProperty("WhenTaken")
で得られた時刻との差を見て時差を補正するというやり方です。)2. フォルダ位置を変えています。(DVDドライブなので)
wPath = "D:\Test9\" を wPath = "C:\var\test9" にSub FileListUP2()
Dim Fso As Object
Dim F1 As Object
Dim Nas As Variant
Dim Nt As Date
Dim wPath As Variant
Dim wDir As String
Dim R As Long
Dim flg0 As Boolean
Dim wExt As String
Dim tDiff As Date: tDiff = "0:00:00"
Dim objShell As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Application.ScreenUpdating = False
If Fso.FileExists("c:\var\raw\0.NEF") Then
Set wPath = objShell.Namespace("c:\var\raw")
For Each Nas In wPath.Items
If Nas = "0.NEF" Then
tDiff = Nas.ExtendedProperty("WhenTaken") - #4/5/2017 7:39:17 AM#
Debug.Print DateValue(tDiff) & ", " & TimeValue(tDiff)
flg0 = True
Exit For
End If
Next
Set wPath = Nothing
Else
MsgBox "c:\var\raw\0.NEF が存在しません"
End If
'Stop
Cells.Clear '初期化
MsgBox "ファイルの検索を開始します"
Range("C1").Value = "フォルダ"
Range("D1").Value = "ファイル"
Range("E1").Value = "作成日時"
Range("F1").Value = "更新日時"
Range("G1").Value = "アクセス日時"
Range("H1").Value = "撮影日時"
Cells.Font.Name = "MS ゴシック"
Columns("E:H").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss"
Columns("E:H").HorizontalAlignment = xlLeft
R = 2
wPath = "C:\var\Test9\"
For Each Nas In objShell.Namespace(wPath).Items
Nt = Nas.ExtendedProperty("WhenTaken") '撮影日時の取得(WorldTime)
wDir = Dir(Nas.Path, 7)
If wDir <> "." And wDir <> ".." Then
If (GetAttr(Nas.Path) And vbDirectory) <> vbDirectory Then
Set F1 = Fso.GetFile(Nas.Path) 'フルパス
Cells(R, 3) = wPath 'フォルダ
Cells(R, 4) = F1.Name 'ファイル
Cells(R, 5) = F1.DateCreated '作成日時
Cells(R, 6) = F1.DateLastModified '最終更新日時
Cells(R, 7) = F1.DateLastAccessed 'アクセス日時
If Nt <> 0 Then
wExt = Fso.GetExtensionName(Nas)
If flg0 And (wExt = "CR2" Or wExt = "NEF") Then
Cells(R, 8) = Nt - tDiff
Else
Cells(R, 8) = Nt + TimeValue("9:00:00") 'LocalTime
End If
End If
R = R + 1
End If
End If
Next
Columns("A:Z").ColumnWidth = 1
Cells.EntireColumn.AutoFit
Application.ScreenUpdating = True
Set F1 = Nothing
Set objShell = Nothing
Set Fso = Nothing
MsgBox "◎◎◎処理完了◎◎◎", 64
End Sub(動作はしますけど... )
-
ウィンドウズスクリプトプログラマさんが書かれたことで、sakuraxxさんが「撮影日時がyyyy/mm/dd hh:mmまでしか取得できませんでした。」と書かれていますが、やってみると「12 撮影日時=?2017-?04-?05 ??7:39」となって、時差の補正が必要ないようで使いやすいと思いました。
つまり秒のところだけ、ExtendedPropertyの値を使えばいいのではないかと
sakuraxxさん やってくださいませんか?(私もやってみますけど、組合わせる方法が分からない)
[追加]2018-03-14 Wed.09:32
(いま時間がなくて混乱した文章になっているかもしれません)
あ ダメでした。"12 撮影日時=?2017-?04-?05 ??23:39"となっていました。
マスター日付として使えません。すみませんでした。- 編集済み ery srow 2018年3月14日 0:33
-
あくまでも MS 製 Codec での解決を追求するのであれば、根本原因をもう少し調べてみては?
あくまでも推測ですけど。。。。
「PC起動後の初回のエクセル起動で発生」ということは、そのタイミングだけ Codec 関連 DLL のロードに失敗している可能性も考えられるのでは?
だとしたら、その DLL を明示的にロードさせるコードを追加してやれば、この問題を解決できるかも。。。。と思うのです。
つまり、Excel プロセス内にロードされている DLL に差異がないか確認してみては。。。。ということです。プロセス内にロードされている DLL モジュールは、"Process Explorer" あるいは "Process Monitor" か、どっちかを使えば確認できます。
(個人的には "Process Monitor" の方が好きですけど、どちらも Mark Russinovich 大先生作のツールで、本当に「かゆい所」にまで手の届いたすんごいアプリです。)
-------------------------------------------
Process Explorer v16.21
https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorerProcess Monitor
https://technet.microsoft.com/ja-jp/sysinternals/processmonitor.aspx
-------------------------------------------調べるプロセスにもよりますが、手元の Windows 10 x64 環境にインストールされている Excel 2016 で、Excel プロセスにロードされている DLL モジュールの数を調べたら、およそ 150 個程度のファイルがロードされていました。
以前にも他の方からの質問で同じような提案をしたことがあるのですが、その方は「そんなにたくさんのファイルをいちいち調べらるか!!」とお怒りモードで投げ出しちゃったみたいですけど。
まぁ、150 個程度のファイルのロードの有無を調べるだけなら、根性出せば1時間もあれば確認できると思いますので、個人的には調べる価値はあると思いますが、無理強いしている訳ではありませんのであしからず。 -
PC環境:Windows10(64bit),Excel2016(32bit)に、Process Monitorをダウンロードしてチャレンジして見ました。
フィルターは、Process Monitor Filterダイアログで、
[Process Name] is [EXCEL.EXE] then [Include] と設定し、[Add] をクリック。
そして当該Excelファイルを起動しました。
プロセスは「EXCEL.EXE」に絞り込めたものの数えきれない件数が表示されました…!?。
非力な私には差分を比較しきれませんでした…ギブアップ。sakuraxx
-
下記サイトを参考に、Excel 起動から問題現象が発生するまでのイベントをキャプチャを採取し、それを PML ファイルに保存されることをお勧めします。
初回起動時と2回目以降の起動時の2パターンをとりあえず採取しておけば、あとの調査はその2つの PML ファイルだけでできます。
-------------------------------------------
Process Monitor を使用してシステムイベントをキャプチャする
https://community.sophos.com/kb/ja-jp/119038
-------------------------------------------もっとも無理強いしている訳ではないので、ギブアップするならそれで構いませんが、「マクロソフトのバグだ!!」と主張するなら、それを裏付ける根拠が必要かと。
現在までの経緯を見る限り、この問題がマクロソフトのバグで発生していると言い切るだけの根拠はない。。。と私は考えています。 -
初回起動時と2回目以降の起動時の2パターンを「.PML」と「.CSV」の両方を採取しました。
下記は「Logfile_Events.CSV」の初回と次回の値をエクセル関数で比較した結果です(各々約21万行)。
最初の2,3,7,8,9,10行目に違いが視られ205行を過ぎると×が連発していて意味合いを解析する事は気が遠くなります。
初回と次回には差がある様に見えますが理解できないLogデータの連続でもあり…ギブアップです。
連番 Operation Path Result Detail
201 ○ ○ ○ ○
202 ○ ○ ○ ○
203 ○ ○ ○ ○
204 ○ ○ ○ ○
205 × × ○ ×
206 × × ○ ×
207 × × × ×
208 × × ○ □
209 × × × ×
210 × × ○ □
211 × × × ×初回と同じ→○
初回と違う→×
片方が空白→□sakuraxx
-
-
{00 32 30 31 37 3A 30 38 3A 30 33 20 32 31 3A 32 39 3A 30 35 00}
.2017:08:03 21:29:05.
という日付文字列を見つけるという簡単なやり方です。
ARW, CR2, NEF, RAF の場合は1000バイト以内に出てくるようですが、ORF, RW2 は8KB以上必要かも(ファイルサイズにより異なるかもしれません)。
写真フォルダを "C:\var\Test9"に変更しています。Sub FileListUP6()
Dim Fso As Object
'Dim Fso As New FileSystemObject 'if 事前バインディング
Dim Nas As Variant
Dim Nt As Date
Dim wPath As Variant
Dim wDir As Variant
Dim R As Long
Dim objShell As Object
Dim objFile As Object
Dim wExt As String
Dim inputfName As String
Dim inputFn As Long
Dim buff() As Byte
Dim i As Long, j As Integer
Dim dt As String
Cells.Clear '初期化
MsgBox "ファイルの検索を開始します"
Range("C1").Value = "フォルダ"
Range("D1").Value = "ファイル"
Range("E1").Value = "作成日時"
Range("F1").Value = "更新日時"
Range("G1").Value = "アクセス日時"
Range("H1").Value = "撮影日時"
Cells.Font.Name = "MS ゴシック"
Columns("E:H").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss"
Columns("E:H").HorizontalAlignment = xlLeftR = 2
wDir = "C:\var\Test9"
Set objShell = CreateObject("Shell.Application")
Set wPath = objShell.Namespace(wDir)
Set Fso = CreateObject("Scripting.FileSystemObject")For Each Nas In Fso.GetFolder(wDir).Files
Cells(R, 3) = wDir 'フォルダ
Cells(R, 4) = Nas.Name 'ファイル
Cells(R, 5) = Nas.DateCreated '作成日時
Cells(R, 6) = Nas.DateLastModified '最終更新日時
Cells(R, 7) = Nas.DateLastAccessed 'アクセス日時
Set objFile = wPath.Items.Item(Nas.Name)
wExt = UCase(Fso.GetExtensionName(Nas))
If wExt = "ARW" Or wExt = "CR2" Or wExt = "NEF" Or wExt = "RAF" Then
inputfName = Nas.Path
inputFn = FreeFile
Open inputfName For Binary As #inputFn
ReDim buff(1200)
Get #inputFn, , buff
Close #inputFn
For i = 6 To UBound(buff) - 16
If buff(i - 5) = 0 And buff(i) = 58 And buff(i + 3) = 58 And buff(i + 6) = 32 And buff(i + 9) = 58 And buff(i + 12) = 58 And buff(i + 15) = 0 Then
dt = ""
For j = 1 To 20
If j = 5 Or j = 8 Then
dt = dt & "/"
Else: dt = dt & Chr(buff(i - 5 + j))
End If
Next j
Debug.Print R & ": " & i & "B, " & dt
Exit For
End If
Next i
Cells(R, 8) = dt
ElseIf wExt = "ORF" Or wExt = "RW2" Then '省略. buff(10000)位必要
Nt = objFile.ExtendedProperty("WhenTaken")
If Nt <> 0 Then
Cells(R, 8) = Nt + TimeValue("9:00:00")
Range("H" & R).Font.Color = RGB(255, 0, 0)
End If
Else
Nt = objFile.ExtendedProperty("WhenTaken") '撮影日時
If Nt <> 0 Then
Cells(R, 8) = Nt + TimeValue("9:00:00")
End If
End If
Set objFile = Nothing
R = R + 1
Next NasColumns("A:Z").ColumnWidth = 1
Cells.EntireColumn.AutoFit
Application.ScreenUpdating = True
Set Fso = Nothing
Set wPath = Nothing
Set objShell = Nothing
MsgBox "◎◎◎処理完了◎◎◎", 64
End Sub事前バインディングにしたほうがよいと書いてあるものがあったので やってみましたが遅いままでした。(VBEの画面で、「ツール」-「参照設定」で ”Microsoft Scripting Runtime" にチェック。)
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
ファイル名をエクスプローラと同じ順序にソートする。: Windows Script Programming
まずはvbsでexplorer objectで取れるかどうか確かめたらどうか。 -
私からの説明が至らなかったようで、申し訳ありませんでした。
Process Monitor でのフィルタ条件は、解析する対象に依存して異なるので、「必ずこれが正しい手順」というものはありません。
なので以下に示す手順は、「あくまでも私だったら、こーやって調べる」という一例にすぎませんので、その点はあらかじめご了承ください。---------------------------------------------------
<本件における Process Monitor での解析手順>以下に示す手順は、あらかじめ初回起動時と2回目以降の起動時の2パターンの PML ファイルが採取されていることを前提としています。
[手順1]
2回目以降の起動時に採取した PML ファイルを Process Monitor 上から開き、下記フィルタを追加 ("Add" ボタンの押下) し適用 ("Apply" ボタンの押下) します。
【フィルタ条件】
"Process Name" "is" "EXCEL.EXE" then "Include"
"Operation" "is" "ReadFile" then "Include"[手順2]
Process Monitor ウィンドウに表示されている "ReadFile" イベントのうち、一番最後にリストされてもの (タイムスタンプが一番最後のもの) をダブルクリックし、その "ReadFile" イベントの "Event Properties" ダイアログを開きます。[手順3]
"Event Properties" ダイアログ" の "Process" タブをクリックします。[手順4]
"Process" タブ下段の "Modules:" リストボックスの "Module" カラムをクリックし、モジュール名でソートします。[手順5]
ソートした "Modules:" リストボックスに "WindowsCodecsRaw.dll" が存在していることを確認します。
ここで "WindowsCodecsRaw.dll" が見つからない場合は、上記 [手順2] に戻り、一つ前にリストされている "ReadFile" イベントに対して [手順5] までを繰り返し、"WindowsCodecsRaw.dll" がリストされてる "ReadFile" イベントを探します。[手順6]
"Process" タブ下段の "Modules:" リストボックスに、"WindowsCodecsRaw.dll" が存在する "ReadFile" イベントが見つかったら、"Process" タブ プロパティ シートの一番下にある "Copy All" ボタンをクリックします。[手順7]
別途 Excel.exe を起動させ、"空白のブック" テンプレートで新規シートを作成し、上記 [手順6] でクリップボードにコピーしたテキスト情報を "貼り付け" ます。[手順8]
上記 [手順1] に戻り、初回起動時に採取した PML ファイルに対して、[手順1] から [手順7] を実施ます。[手順9]
上記までの手順で採取された、初回起動時と2回目以降の起動時の新規シート情報に対して、"Modules:" 以降にリストされている全モジュール名を比較します。
このとき、特に下記事項に着目して比較します。【モジュール比較時の着目点】
☆ 2回目以降の起動時にのみ存在するモジュール名はあるか。
☆ 初回起動時と2回目以降の起動時双方で、"Microsoft Corporation" 以外の会社名のモジュール (3rd ベンダー製モジュール) の確認。
--------------------------------------------------- -
Process Monitor での解析結果
☆2回目以降の起動時にのみ存在したモジュール名。
kernel32.dll
C:\Windows\System32\kernel32.dll☆"Microsoft Corporation"以外の会社名のモジュール名。
初回起動時は、
Advanced Micro Devices, Inc.
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\aticfx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\atidxx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\atiuxpag.dll
Trend Micro Inc.
C:\Windows\SysWOW64\tmumh\20019\TmMon\2.6.0.2023\tmmon.dll
C:\Windows\SysWOW64\tmumh\20019\AddOn\7.30.0.1081\TmUmEvt.dll2回目以降の起動時は、…初回起動時と同じ
以上
sakuraxx
-
> ☆2回目以降の起動時にのみ存在したモジュール名。
> kernel32.dll
> C:\Windows\System32\kernel32.dllこれは絶対にあり得ません。
多分見間違えているんだと思います。
Excel.exe プロセスが動作するためには "kernel32.dll" は必須であり、このモジュールがロードされていなければ Excel.exe は起動できません。
また仮に起動後に "kernel32.dll" がアンロードされた場合は、Excel.exe プロセスはクラッシュします。
なので、初回起動時に "kernel32.dll" がロードされていないということは、絶対にありません。以前の返信でも説明しましたが、この調査をお願いした意図は、初回起動時と2回目以降の起動時で、Excel.exe プロセス内にロードされるモジュールに差異があるか、ということです。
初回起動時と2回目以降の起動時でロードされるモジュール「の数」に差異がある場合、下記フィルタ条件で検出できるかもしれません。
(Excel.exe プロセスでロードに失敗したモジュールがある場合に、それを抽出してくれるフィルタ設定です。)【フィルタ条件】
"Process Name" "is" "EXCEL.EXE" then "Include"
"Operation" "is" "Load Image" then "Include"
"Result" "is not" "SUCCESS" then "Include" -
-----------------------------------------------------
■試行1
初回起動時と2回目以降の起動時でロードされるモジュール「の数」に差異がある場合、
下記フィルタ条件で検出できるかもしれません。
(Excel.exe プロセスでロードに失敗したモジュールがある場合に、それを抽出してくれるフィルタ設定です。)
<フィルタ条件>
[Process Name] is [EXCEL.EXE] then [Include]
[Operation] is [Load Image] then [Include]
[Result] is not [SUCCESS] then [Include]
≪解析結果≫
ロードに失敗したモジュールは、在りませんでした。-----------------------------------------------------
■試行2
<フィルタ条件>
[Process Name] is [EXCEL.EXE] then [Include]
[Operation] is [ReadFile] then [Include]≪補足≫
予め用意する、初回起動時と2回目以降の起動時の PMLファイル採取を何度も用意し直し解析を試みたのですが、
[手順5]
ソートした"Modules:"リストボックスに"WindowsCodecsRaw.dll"が存在していることを確認します。
ここで"WindowsCodecsRaw.dll"が見つからない場合は、
上記 [手順2] に戻り、一つ前にリストされている"ReadFile"イベントに対して [手順5] までを繰り返し、
WindowsCodecsRaw.dllがリストされてる"ReadFile"イベントを探します。
・・・100以上回繰り返しても見つかりません…!?(初回起動時と2回目以降の起動時のもの)
念のため採取する直前に"WindowsCodecsRaw.dll"が存在していることを確認しておいたのですが上記で説明した通りです…原因不明。止むを得ず解析用データの採取方法として、
初回起動時と2回目起動時のPMLファイルを採取(保存)する直前に、
Process Monitor ウィンドウに表示されている"ReadFile"イベントのうち、
一番最後のもの (タイムスタンプが一番最後のもの) をダブルクリックし、
その"ReadFile"イベントの"Event Properties"ダイアログを開き、
"WindowsCodecsRaw.dll"が存在していることを確認し、「Copy All」をクリックし→テキストファイル(メモ帳)として採取(保存)したデータを基に解析しました…拙かったでしょうか?。≪解析結果≫
☆2回目以降の起動時にのみ存在したモジュール名。
C:\Windows\SysWOW64\bcp47langs.dll
C:\Windows\SysWOW64\edputil.dll☆"Microsoft Corporation"以外の会社名のモジュール名。
初回起動時は、
Advanced Micro Devices, Inc.
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\aticfx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\atidxx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0309377.inf_amd64_7ab08912e1e1da0a\atiuxpag.dll
Trend Micro Inc.
C:\Windows\SysWOW64\tmumh\20019\TmMon\2.6.0.2023\tmmon.dll
C:\Windows\SysWOW64\tmumh\20019\AddOn\7.30.0.1081\TmUmEvt.dll2回目以降の起動時は、…初回起動時と同じ
以上
sakuraxx
-
ちょっと全体像が見えないのですが、要するに初回起動時に採取した PML ファイルでは、"WindowsCodecsRaw.dll" が見つからないということでしょうか?
だとしたら、やっと原因らしきものが見えてきかな。。。。と。
試しに、初回起動時に採取した PML ファイルに対して、下記フィルタを適用してみてください。
-------------------------------------------
【フィルタ条件】
"Process Name" "is" "EXCEL.EXE" then "Include"
"Operation" "is" "Load Image" then "Include"
"Path" "contains" "WindowsCodecsRaw.dll" then "Include"
-------------------------------------------上記フィルタ条件で "WindowsCodecsRaw.dll" のロード イベントが表示されないのであれば、そもそも "WindowsCodecsRaw.dll" モジュールのロード要求自体が発生していないことになります。
つまりこの問題は "WindowsCodecsRaw.dll" モジュールのバグが原因なのではなく、"WindowsCodecsRaw.dll" モジュールのロード要求を阻害する「何かの」処理が原因ということです。
もしこの推測が正しければ、"WindowsCodecsRaw.dll" モジュールのロード要求を阻害している原因を取り除けばこの問題は解決できると思います。初回起動時に "WindowsCodecsRaw.dll" モジュールがロードされていないのであれば。。。。
Microsoft が提供している DLL モジュールのロードに失敗する大抵の原因は、3rd ベンダー製モジュールの干渉です。
ちょっと症状は異なりますが、以前にこのフォーラムで下記のようなケースがありました。
----------------------------------------
microsoft office ime 2010は動作を停止しました
https://social.msdn.microsoft.com/Forums/ja-JP/db6763a6-19b1-4500-8a95-1940dc46767e/microsoft-office-ime-2010?forum=imejp2010
----------------------------------------上記はとても長いスレッドなので読むのが嫌になると思いますので要約しますと、大体以下のような感じになります。
(ちなみに、このスレッドで「回答」としてマークされているものは、全然関係ありません。)
----------------------------------------
<上記スレッドの概要>[質問内容]
ノートパソコンを起動して、ログインした直後に1回だけ『microsoft office ime 2010は動作を停止しました』という、エラーメッセージが表示されます。
原因はなに?[原因]
Intel Graphics 関連モジュールの "igd10umd32.dll" が IME 関連プロセスである "IMECMNT.EXE" にアタッチされていて、こいつが悪さをしていた。[回避策]
"IMECMNT.EXE" プロセスに "igd10umd32.dll" モジュールを Injection する "igfxpers.exe" 止める。
----------------------------------------つまり、問題現象としては「Office IME 2010 がクラッシュする」というもので一見マイクロソフト側の問題のように見えますが、実は Intel Graphics 関連モジュールが原因でした。。。。というオチです。
もしかしたら今回の問題も、これと類似することが起きているのかも。というわけで、初回起動時に "WindowsCodecsRaw.dll" モジュールがロードされていないのであれば、下記事項の実施をお勧めします。
----------------------------------------
<試した方がいいこと>☆ ATI (Advanced Micro Devices, Inc.) 関連のプロセスの停止
"msconfig.exe" ツールを起動し、ATI 関連のサービスおよびスタートアッププログラムをすべて停止させる。
(設定後は再起動してください。)
"msconfig.exe" ツールでの設定方法に関しては、下記サイトが参考になると思います。
++++++++++++++++++++++++++++++++++++++
【 不要なサービスを無効にする ( システム構成ユーティリティ ) 】
http://speedup-xp.com/win7org/18.html【 不要なスタートアップを無効にする ( システム構成ユーティリティ ) 】
http://speedup-xp.com/win7org/17.html
++++++++++++++++++++++++++++++++++++++
☆ Trend Micro 社製セキュリティ対策ソフトの置き換え
上記 ATI 関連プロセスを止めても改善しない場合は、Trend Micro 社製セキュリティ対策ソフト (ウィルスバスター?) をアンインストールして、Windows Defender 等の別のセキュリティ対策ソフトに置き換えて、再度確認してみてください。
なお上記事項を試しても再発する場合は、"Process Monitor" で再度 PML ファイルを採取し、ATI および Trend Micro 関連のモジュールが "Excel.exe" プロセスにロードされていないことを確認してください。
(もし ATi や Trend Micro 関連のモジュールが存在するなら、きちんと設定できていない。。。ということです。)
----------------------------------------
- 編集済み お馬鹿 2018年3月29日 6:22
-
<試した方がいいこと> …へのチャレンジ
☆ Trend Micro 社製セキュリティ対策ソフトの置き換え
処置:このアプリの機能で[停止]に設定しました。☆ ATI (Advanced Micro Devices, Inc.) 関連のプロセスの停止
処置:"msconfig.exe"のサービスで、「Microsoft」のサービス以外を全て「無効」にしました。
処置:タスクマネージャーのスタートアップで、「Advanced Micro Devices, Inc.」関連を「無効」にしました。
そしてPCを再起動しました。≪確認≫
Trend Micro Inc.系は、"Process Monitor"にロードされなくなりましたが、
Advanced Micro Devices, Inc.関連のモジュールは存在していた…消えそうにありません。
多分、「AMD Settings」と「ADM Catalyst Install Manager」をアンインストールすれば、"Process Monitor"にロードされなくなる様な気はするのですが自身がありません。<フィルタ条件>
[Process Name] is [EXCEL.EXE] then [Include]
[Operation] is [ReadFile] then [Include]☆"Microsoft Corporation"以外の会社名のモジュール名。
初回起動と2回目起動での比較を何度も試みたのですが毎回同じではありません…!?
事例(1)
kernel32.dll
mskeyprotect.dll事例(2)
kernel32.dll
mscms.dll
mskeyprotect.dll
photometadatahandler.dll
windowscodecsext.dll
windowscodecsraw.dll☆試しに、初回起動時と2回目起動時に採取した数本のPML ファイルに対して、下記フィルタを適用してみました。
<フィルタ条件>
[Process Name] is [EXCEL.EXE] then [Include]
[Operation] is [Load Image] then [Include]
[Path] contains [WindowsCodecsRaw.dll] then [Include]≪結果≫
確かにPMLファイルには"WindowsCodecsRaw.dll"が含まれているのですが、
リストアップ(ヒット)されませんでした…!?
sakuraxx
- 編集済み sakuraxx 2018年4月3日 1:07
-
サービスやスタート アップでの起動を抑止する設定にしても「Advanced Micro Devices, Inc.関連のモジュールは存在していた」ということは、依然 Excel プロセスにちょっかいを出す AMD 関連の外部プロセスが存在しているということですが。。。
"Process Monitor" でログを採取する前に、ATi 関連のプロセスが起動してしていないことは確認しましたか?
確認してないのであれば、"Process Monitor" でログを採取する前に "Process Explorer" 等で起動中のプロセスを確認し、AMD 関連のプロセスが実行していた場合はそれを終了させてから試してみていただけますか?
("Process Explorer" の場合、メニューバーの <Process> → <Kill Process> で、現在ハイライトになっている選択中のプロセスを強制終了できます。)で。。。。
初回起動時と2回目以降の起動時で "kernel32.dll" のロードに差異があるということですが、それは絶対にあり得ないのです。
つまり、確認すべきイベントを間違えている。。。。
私の説明がへたくそなのでよくわからないんだと思いますが、私もどう説明すれば伝わるのかわからない。。。
そこで提案ですが。。。
上記で説明した AMD (と Trend Micro) 関連プロセスを停止した状態での検証を実施しそれでも問題が起きる場合は、下記条件で初回起動時および2回目以降の PML ファイルを採取し、それをどこかのオンライン ストレージ上にアップしていただけますか?
それが可能であれば、私の方でそのログファイルを確認します。
ちなみに以前にお伝えした手順と採取方法が違うのは、余計なログを残さないためです。
(例えば、"Process Monitor" キャプチャ中に裏で H なサイトにアクセスしているとそれもログに残されてしまうので、それらを除外するための設定です。)
-----------------------------------------------
<PML ファイルの保存方法>1. "Process Explorer" を起動し、今までと同じ手順で Excel 起動時の状態をキャプチャする。
2. Excel が起動し現象の有無を確認したらキャプチャを停止し、下記フィルタ条件を設定する。
++++++++++++++++++++++++++++++
【フィルタ条件】
"Process Name" "is" "EXCEL.EXE" then "Include"
++++++++++++++++++++++++++++++3. "Process Explorer" メニューバーの <File> → <Save...> をクリックしし、"Save To File" ダイアログで下記設定をし PML ファイルに保存する。
++++++++++++++++++++++++++++++
【"Save To File" ダイアログでの設定】Events to save: Events displayed using current filter
Also include profiling eventsFormat: Native Process Monitor Format (PML)
++++++++++++++++++++++++++++++
----------------------------------------------- -
■Process Monitor収集の手順
--------------------------------
ウイルスバスター →停止
msconfig「サービス」:Microsoft以外を →全て無効にする
タスクマネージャー「スタートアップ」:Advanced Micro Devices, Inc. →無効にする
PCシャットダウン
PC電源を完全に切る(コンセントを抜く:約20分以上)
--------------------------------
PC起動
Process Explorer起動…AMD関連の停止を試みる
・Radeon Settings.exe Radeon Settings: Host Application →killProcess …成功
・atiesrxx.exe AMD External Events Service Module →killProcess …失敗:アクセスが拒否されました
Process Explorer終了
※atiesrxx.exeを停止できなかったが、次の.PML収集の作業を試みる
--------------------------------
初回起動
Process Monitor起動 →<フィルタ条件> [Process Name] is [EXCEL.EXE] then [Include]
Excel起動→Macro実行→Process Monitor収集停止 →Logfile707-1.PML 保存
→Logfile707-1.txt (2018/04/13 17:46:03.9699202) 保存
撮影日時:正しくない
Excel終了
Process Monitor終了
--------------------------------
2回目起動
Process Monitor起動 →<フィルタ条件> [Process Name] is [EXCEL.EXE] then [Include]
Excel起動→Macro実行→Process Monitor収集停止 →Logfile707-2.PML 保存
→Logfile707-2.txt (2018/04/13 17:51:38.8673281) 保存
撮影日時:正常
Excel終了
Process Monitor終了
--------------------------------
3回目起動
Process Monitor起動 →<フィルタ条件> [Process Name] is [EXCEL.EXE] then [Include]
Excel起動→Macro実行→Process Monitor収集停止 →Logfile707-3.PML 保存
→Logfile707-3.txt (2018/04/13 17:55:44.4522164) 保存
撮影日時:正常
Excel終了
Process Monitor終了
--------------------------------
以上
sakuraxx
- 編集済み sakuraxx 2018年4月14日 3:52
-
アップしていただいた PML ファイルはコピーしましたので、安全のため OneDrive の URL は削除してください。
PML ログの確認にはちょっと時間がかかりそうなので、しばしお待ちください。
なにかわかりましたら、別途返信いたします。ちなみに。。。
AMD 関連のモジュールは相変わらずロードされているみたいですね。
この PC にインストールされている AMD Radeon のドライバは最新なのでしょうか?
下記サイトから Radeon の最新ドライバがダウンロード可能のようなので、確認してみてください。
-------------------------------------
Radeon、FirePro、APU、CPU、デスクトップ、ノートPC向けAMDドライバーおよびソフトウェアのダウンロード
https://support.amd.com/ja-jp/download
-------------------------------------AMD Radeon ドライバが最新状態でも問題が起きるのであれば。。。。
可能ならば、一旦 Radeon ドライバをアンインストールして、Windows Inbox の標準グラフィックス ドライバに変更して問題現象が起きるか確認してみてください。
使い勝手が悪くなると思いますが、あくまでも一時的なテスト目的なので。
なお、Windows Inbox の標準グラフィックス ドライバでテストする際は、Excel プロセスに AMD 関連モジュールがロードされていないことを、きちんと確認してください。
(AMD 関連モジュールがロードされてしまっていると、標準グラフィックス ドライバでテストする意味がなくなってしまうので。。。) -
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
現象:PC起動後に次の「FileListUP」を実行したら「Nikon.NEF」ファイルの撮影日時が正しく表示されません!?。
初回だけ撮影日時が取得できないのかと思ったら、タイムゾーン分ずれるということですか?それも初回だけ。
NEFファイルをダウンロードして、vbscriptでwhentakenを出すと-9Hになります。文字列で格納されてる撮影日時をローカル時間としてutcに変えて出してるようです。これが仕様なら、初回だけ、ということにはならないでしょう。excel vbaでだけ発生するなら、vbsで取り出せばよい。 -
<それは、エクスプローラのプロパティの撮影日時と異なる値なのですか?>
はい…異なります。詳細は下記の通りです。私のPC以外のPCでも同様の現象が発生しています(Windows10)。
Excel初回の起動時
CanonEos5DSR.CR2 2017/11/02 04:15:21
CanonEos5DSR.JPG 2017/11/01 12:15:21
NikonD300.NEF 2017/04/05 23:39:17
NikonD300.jpg 2017/04/05 07:39:17
NikonD810.NEF 2017/04/30 22:43:23
NikonD810.jpg 2017/04/30 06:43:23
2回目以降の起動時
CanonEos5DSR.CR2 2017/11/01 12:15:21
CanonEos5DSR.JPG 2017/11/01 12:15:21
NikonD300.NEF 2017/04/05 07:39:17
NikonD300.jpg 2017/04/05 07:39:17
NikonD810.NEF 2017/04/30 06:43:23
NikonD810.jpg 2017/04/30 06:43:23
当該画像ファイルをWebにアップしてあります…宜しければダウンロードしてご確認ください。
RAW写真の撮影日時が取得できない件 - OneDrive
https://onedrive.live.com/?authkey=%21AARFvGrNLbW4PKM&id=D0A96F3C83910E09%21194&cid=D0A96F3C83910E09
sakuraxx
- 編集済み sakuraxx 2018年4月14日 16:15
-
Radeonの最新ドライバをインストール(AMD Software Ver18.2.1)しました。
Process Monitorで収集されるAMD関連ファイルが一本増えました (ProcessExplorerで停止できない)
-----------------------------------
Advanced Micro Devices, Inc.
C:\Windows\SysWOW64\amdihk32.dll ←★増えたdll
C:\Windows\System32\DriverStore\FileRepository\c0323831.inf_amd64_1212be4b9fe2386c\aticfx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0323831.inf_amd64_1212be4b9fe2386c\atidxx32.dll
C:\Windows\System32\DriverStore\FileRepository\c0323831.inf_amd64_1212be4b9fe2386c\atiuxpag.dll
-----------------------------------
≪撮影日時≫
問題は解消されませんでした。
Radeon ドライバをアンインストールして、Windows Inbox の標準グラフィックス ドライバに変更してみる件…自身がありません(中止)。
参考:知人がPCを購入したので当該マクロの試行をさせて頂きましたが同様の現象が発生しました。
PC-NS700JAR-KS インテルUHD グラフィックス620(CPU内臓)- 編集済み sakuraxx 2018年4月14日 17:25
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
+16H 時間がずれるということですか?whentakenは -9H+16H = +7H つまり、-7Hのタイムゾーンと勘違いしてる?(アメリカ・カナダ)山岳部標準時 - MST
excel vbaだけの話?
whentaken.vbs
set fso=createobject("scripting.filesystemobject")
にnefファイルをドロップしても再現しません。
Set oShell = CreateObject("Shell.Application")
Set oFolder = oShell.Namespace(fso.getparentfoldername(wscript.arguments(0)))
msgbox oFolder.ParseName(fso.getfilename(wscript.arguments(0))).extendedproperty("whentaken")
そちらではどうか。 -
whentaken.vbsのコードは、Excel-VBE(マクロ)で実行できません(実行エラーが発生します)。
現象確認用の「Sample検索e.xlsm」が次のサイトに投稿してあります…ダウンロードにて試行して頂ければと思います。
https://onedrive.live.com/?authkey=%21AARFvGrNLbW4PKM&id=D0A96F3C83910E09%21194&cid=D0A96F3C83910E09sakuraxx
-
初回起動時と2回目起動時時以降を比較すると、以下の2つファイルに関してロード状態の差異が見られます。
--------------------------------
<ロード状態に差異のあるモジュール>
☆ BCP47Langs.dll
☆ ncrypt.dll
--------------------------------問題現象の症状から、"BCP47Langs.dll" の挙動の差異に起因している可能性が考えられます。
"BCP47Langs.dll" は、Locale および Language 関連処理に影響を与えると考えられますが、言語関連設定のレジストリ アクセスを調べると、下記レジストリ キーを読み込んだあたりから差異が見られます。
-----------------------------------
<差異が発生する直近のレジストリ キー>
HKLM\SOFTWARE\Microsoft\CTF\TIP\{0000897b-83df-4b96-be07-0fb58b01c4a4}\LanguageProfile\0x00000000\{0001bea3-ed56-483d-a2e2-aeae25577436}
-----------------------------------上記キー アクセス直後、初回起動時と2回目以降起動時では、参照しているキーが異なっています。
-----------------------------------
<キー アクセスの差異>☆ 初回起動時
HKCU\Software\Microsoft\Office\16.0\Excel\Options\LastUILang☆ 2回目以降起動時
HKCU\Software\Microsoft\Office\16.0\Common\Experiment\excel\Language
-----------------------------------以上のことから今回の問題現象は、レジストリに保持されている Office 言語関連の設定に差異が存在するために発生していると考えられます。
もっと細かくレジストリ アクセスをチェックしていけば、問題の引き金となるレジストリ キーを特定できるかもしれませんが、それよりかは自作されている VBA モジュールの方で、画像ファイルを読み込む前にロケールおよび言語関連設定を明示的に行う処理を追加すれば、本問題現象は解決できるような気がします。
追記
Office 言語設定での既定の言語が何になっているのか、確認したほうがいいかも。
[日本語] 以外の言語が既定として設定されているのであれば、[日本語] に設定して試してみるとか。- 編集済み お馬鹿 2018年4月16日 5:01 追記
-
お馬鹿さん大変お世話になっております。
非力な私には「VBA モジュールに、画像ファイルを読み込む前にロケールおよび言語関連設定を明示的に行う処理を追加する」コードは分かりませんが、
Office 言語設定の確認をしてみました。
・編集言語の選択 →「日本語」が規定でした。
・表示言語の選択 →「Microsoft Windowsと同じにする」で合ったため、「日本語」を規定にしました。
≪RAW(NEF,CR2)ファイルの撮影日時の確認≫
今までと現象は同じでした(Excel初回起動時は正しくなく、2回目起動時からは正常でした)。sakuraxx
-
VB とか VBA みたいな「超高級言語」は専門外なので、私には素人以下の知識しかないのですが。。。
(基本、C とアセンブリ以外は知らいない。)とりあえず下記を参考に、初回起動時と2回目以降起動時で、地域と言語の設定が同じかどうかを確認してみては?
(私が提示できるのは↓こんな程度。。。)
---------------------------------------------------
Application.International プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-international-property-excelApplication.LanguageSettings プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-languagesettings-property-excelLanguageSettingsオブジェクト
https://www.vba-ie.net/object/languagesettings.html「疑惑の判定」の主審と、「Excel VBAの国際対応」
https://ameblo.jp/kanjizaibosatsu/entry-10575896984.htmlすぐに役立つエクセルVBAマクロ集
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv212.html#4-4
13) 国地域に関する情報を取得する
---------------------------------------------------(色んな言語に長けている佐祐理さんなら、こんなのはサクッと回答できると思いますが、このスレッドで過去になんかあったようなので、お返事してもらえるかは知りません。)
-
Officeの言語設定についての情報を取得して見ました。
結果:戻り値は、全て「1041」でした(言語ID → msoLanguageIDJapanese 1041 日本語 )
Sub SampleLCID()
Dim oLangSet As Object
Set oLangSet = Application.LanguageSettings
MsgBox "このアプリケーションに登録されたロケール ID は次のとおりです。" & vbCrLf & _
"Excelインストールで選択した言語 - " & oLangSet.LanguageID(msoLanguageIDInstall) & vbCrLf & _
"ユーザー インターフェイスの言語 - " & oLangSet.LanguageID(msoLanguageIDUI) & vbCrLf & _
"ヘルプ言語 - " & oLangSet.LanguageID(msoLanguageIDHelp) & vbCrLf & _
"実行モード言語 - " & oLangSet.LanguageID(msoLanguageIDExeMode) & vbCrLf & _
"優先使用インターフェイス言語 - " & oLangSet.LanguageID(msoLanguageIDUIPrevious)
End Subsakuraxx
-
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
意味が分かりません。
<キー アクセスの差異>
つまり、excel vbaだけの話なのでは?☆ 初回起動時
HKCU\Software\Microsoft\Office\16.0\Excel\Options\LastUILang☆ 2回目以降起動時
HKCU\Software\Microsoft\Office\16.0\Common\Experiment\excel\Language
だったら、whentaken.vbsで取り出すようにすればよい。
-
whentaken.vbs の意味がやっと分かりました…VBScriptと言う事ですね。
実はVBAは多少解るのですが、VBScriptは全く解りません…初めてのチャレンジです。
何となく理解…次の「whentaken.vbs」を作成して「NikonD300.NEF」をドロップ…成功(WorldTime表示)
set fso=createobject("scripting.filesystemobject")
Set oShell = CreateObject("Shell.Application")
Set oFolder = oShell.Namespace(fso.getparentfoldername(wscript.arguments(0)))
msgbox oFolder.ParseName(fso.getfilename(wscript.arguments(0))).extendedproperty("whentaken")
追記:VBScriptで取得できることは分かったのですが、Excelで取得できなければ課題が解決した事になりません。…試行結果:VBScriptの値は「正しい」
ファイル 撮影日時(LocalTime) 撮影日時(WorldTime) …以下はVBAの取得データ
NikonD300.jpg 2017/04/05 07:39:17 2017/04/04 22:39:17 ←正しい撮影日時
NikonD300.NEF 2017/04/05 23:39:17 2017/04/05 14:39:17 ←JPGと同じなら正しいのですが- 編集済み sakuraxx 2018年4月20日 2:10
-
地域設定 (Application.International プロパティ) の方はどーでしたか?
Sub Sample001() '現在の国/地域のコードを戻します(国際電話番号)。 '戻り値 Debug.Print Application.International(xlCountrySetting) '→ 81 'MonthName関数(指定した月を示す文字列を戻します) Debug.Print MonthName(5) '→5月 Debug.Print MonthName(5, False) '→5月 Debug.Print MonthName(5, True) '→5 End Sub
sakuraxx
-
地域および言語設定は関係なかったみたいですね。
無駄なお手数をおかけしてしまって、申し訳ありませんでした。で、もう一度 PML ファイルを調べ直してみましたところ、Excel 起動直後の NEF ファイル アクセス時の状態に、差異が見られました。
具体的には、Excel 起動直後の NEF ファイル オープン処理時において、初回起動では2回目以降起動に対して、以下のモジュールがロードされていませんでした。
----------------------------------------------
<NEF ファイル オープン処理時のモジュール差異>
☆ mscms.dll
☆ PhotoMetadataHandler.dll
☆ WindowsCodecsExt.dll
☆ WindowsCodecsRaw.dll
----------------------------------------------上記モジュールは初回起動および2回目以降起動共に、Excel 起動時にメモリ上にロードされていますが、NEF ファイル オープン処理時において、2回目以降起動時ではロード状態にありますが、初回起動時ではアンロードされていました。
つまり Excel 初回起動時では、NEF ファイル アクセス時に一部の Codecs 関連 DLL が欠落しているために、この問題現象が発生している可能性が考えられます。以上のことから今回の問題は、VBA 側で上記モジュールを明示的にロード状態にしておけば、もしかしたら改善できるかもしれません。
先の返信でも書いたように VBA に関しては、私は「ど素人以下の」知識しか持ちわせていませんが、ググった限りでは VBA でも DLL の明示的なロードは可能なようです。
とりあえず下記サイト等の情報を参考に、上記モジュール群を VBA 側で明示的にロード状態にさせることにより現象に変化がみられるか検証されてみては?
(対象 DLL をロードしそのモジュール ハンドルを解放しなければ、アンロードされることはないはずです。)
----------------------------------------------
Excel VBAの困った挙動 - DLLを利用する場合のまとめ - その3
https://ameblo.jp/blueskyame/entry-10237345291.html
---------------------------------------------- -
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
vbaからvbsを起動するか、vbaで、shell.applicationでなく、explorer objectを使えばよい。
念のため、
+16H 時間がずれるということですか?whentakenは -9H+16H = +7H つまり、-7Hのタイムゾーンと勘違いしてる?(アメリカ・カナダ)山岳部標準時 - MST
コマンドプロンプトで
set TZ=JST-9
で確認。
excel.exe
- 編集済み ウィンドウズスクリプトプログラマ 2018年4月20日 13:55
- 回答としてマーク sakuraxx 2018年7月8日 8:40
-
ウィンドウズスクリプトプログラマさん こんにちは。
「あ ダメでした。"12 撮影日時=?2017-?04-?05 ??23:39"となっていました。」
これは誤情報です。(コードを書いておけば一目瞭然だったのですが、"shell.application"の中でGetDetailsOfを使って採取していました。)すみませんでした。「vbaで、shell.applicationでなく、explorer objectを使えばよい。」
初回起動、2回目起動とも同一の時刻でした(使えます)。「ファイル名をエクスプローラと同じ順序にソートする。」
http://scripting.cocolog-nifty.com/blog/2007/12/post_3680.html
のコードを少し改造して 最初の質問文にある Sub FileListUP() に入れました。
("I列"の表示に使っています。)
(動作確認は まだ1回しかしていませんけど、、) -
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
shell.applicationはin process serverなのでexcelプロセス内で動く。explorerはout process serverなのでexcelの影響を受けない。そもそもプロパティハンドラはエクスプローラ用に作られているので、NEFのプロパティハンドラとexcelの相性が悪い、テストされてないということでしょう。
- 編集済み ウィンドウズスクリプトプログラマ 2018年4月24日 2:20
-
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018
Excel VBAでミリ秒の時間を待つ。: Windows Script Programming
wscript.sleep 100
を
Application.Wait [NOW()+"0:00:00.1"]
に変える。 -
はい お願いします。
ie(internet explorer)とか sleepとか そのまま入れただけでテストが不十分です。
("Declare PtrSafe ..."は"Option Explicit"の直下に。)
[注意!]フォルダを"C:\var\Test9\"に変更しています。
Option Explicit'' Excel 2016 64bit での宣言
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)''「ファイル名をエクスプローラと同じ順序にソートする。」
''http://scripting.cocolog-nifty.com/blog/2007/12/post_3680.html
Sub Sample検索ie()
Dim vPath As Variant: vPath = "C:\var\Test9\" '要変更
Dim Fso As Object
Dim F1 As Object
Dim vName As Variant
Dim WT As Date
Dim sDir As String
Dim R As Long
Dim Sap As Object
Dim fNum As Long '追加
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Sap = CreateObject("Shell.Application")
Worksheets("Sheet1").Select
Cells.Clear '初期化
MsgBox "ファイルの検索を開始します。", 64
Range("C1").Value = "フォルダ"
Range("D1").Value = "ファイル"
Range("E1").Value = "作成日時"
Range("F1").Value = "更新日時"
Range("G1").Value = "アクセス日時"
Range("H1").Value = "撮影日時"
Range("I1").Value = "エクスプローラー" '追加
Cells.Font.Name = "MS ゴシック"
Columns("E:I").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss" '変更
Columns("E:I").HorizontalAlignment = xlLeft '変更
R = 2
For Each vName In Sap.Namespace(vPath).Items
WT = vName.ExtendedProperty("WhenTaken") '撮影日時の取得(WorldTime)
sDir = Dir(vName.Path, 7)
If sDir <> "." And sDir <> ".." Then
If (GetAttr(vName.Path) And vbDirectory) <> vbDirectory Then
Set F1 = Fso.GetFile(vName.Path) 'フルパス
Cells(R, 3) = vPath 'フォルダ
Cells(R, 4) = vName 'ファイル
Cells(R, 5) = F1.DateCreated '作成日時
Cells(R, 6) = F1.DateLastModified '最終更新日時
Cells(R, 7) = F1.DateLastAccessed 'アクセス日時
If WT <> 0 Then
Cells(R, 8) = WT + TimeValue("9:00:00") '撮影日時(LocalTime)
End If
R = R + 1
End If
End If
Next
fNum = R
If (fNum > 2) Then
Dim ie As Object '追加
Dim ieFolder As Object
Dim ieFolderItem As Object
Dim fName As Variant
Dim c As Range
Dim dateTime As Variant
Set ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") '追加
ie.Navigate vPath
R = 0
Do While ie.Busy Or ie.ReadyState <> 4
Sleep 200
Debug.Print R
R = R + 1
Loop
Set ieFolder = ie.Document.Folder
For Each ieFolderItem In ieFolder.Items()
If ieFolderItem.Type <> "ファイル フォルダー" Then
fName = Fso.GetFileName(ieFolderItem.Path)
Set c = Range(Cells(2, 4), Cells(fNum, 4)).Find(fName)
If Not c Is Nothing Then
dateTime = ieFolderItem.ExtendedProperty("WhenTaken")
If Not IsEmpty(dateTime) Then
Cells(c.Row, 9) = dateTime + TimeValue("9:00:00")
End If
Set c = Nothing
End If
End If
Next
ie.Quit
Set ieFolder = Nothing
Set ie = Nothing
End If
Set F1 = Nothing
Set Sap = Nothing
Set Fso = Nothing
Columns("A:Z").ColumnWidth = 1
Cells.EntireColumn.AutoFit
Range("A1").Select
MsgBox "◎◎◎処理完了◎◎◎", 64
End Sub
[追加]2018-04-24 Tue. 19:49
(いろんなフォルダでの テストをしていません。)
(長くなっているのは "For each"での順番が"Shell.Application"とieとで少し違っているせいです。)
謎のieについては、
http://scripting.cocolog-nifty.com/blog/2008/05/ie7_shell_ie_786d.html
思い出したことがあります。
「If ieFolderItem.Type <> "ファイル フォルダー" Then」
参考にしたページでは"ファイル フォルダ"になっていました。
Windowsのバージョンによって違うかもしれません。
(フォルダかどうかのチェックは別の書き方があったような、、)- 編集済み ery srow 2018年4月24日 10:49
-
ery srowさんコードの提示ありがとうございました。
ウィンドウズスクリプトプログラマさんアドバイス感謝します。
謎のieの「new:{clsid}モニカ」は未知の領域ですが、Shell(Explorer)で使用する場合の意味合いは何となく解かった様な気がします。
Sample検索ieをまるごとコピーペにて試行させて頂きました。…成功:Excel初回の起動2回目以降の起動においても撮影日時は正常に表示されました。…BerryGood
掲題(質問)の件、お陰様で求めていた回答が得られました。
提示頂いたコードを基に私なりに整え直したコードを下記に提示いたします。
改良点などが有ればご教授よろしくお願いいたします。
Option Explicit Sub Sample検索ie2() ' Dim vPath As Variant: vPath = "C:\var\Test9\" Dim vPath As Variant: vPath = "D:\Test9\" Dim Fso As Object Dim F1 As Object Dim R As Long Dim ie As Object Dim ieFolder As Object Dim ieFolderItem As Variant Dim dateTime As Variant Worksheets("Sheet1").Select Cells.Clear '初期化 MsgBox "ファイルの検索を開始します。", 64 Range("C1").Value = "フォルダ" Range("D1").Value = "ファイル" Range("E1").Value = "作成日時" Range("F1").Value = "更新日時" Range("G1").Value = "アクセス日時" Range("H1").Value = "撮影日時" Range("I1").Value = "エクスプローラー" Cells.Font.Name = "MS ゴシック" Columns("E:I").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss" Columns("E:I").HorizontalAlignment = xlLeft Set Fso = CreateObject("Scripting.FileSystemObject") Set ie = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") ie.Navigate vPath Do While ie.Busy = True Or ie.readyState <> 4 Application.Wait [NOW()+"0:00:00.1"] Loop R = 2 Set ieFolder = ie.Document.Folder For Each ieFolderItem In ieFolder.Items() If Not ieFolderItem.IsFolder Then Set F1 = Fso.GetFile(ieFolderItem.Path) 'フルパス Cells(R, 3) = vPath 'フォルダ Cells(R, 4) = F1.Name 'ファイル Cells(R, 5) = F1.DateCreated '作成日時 Cells(R, 6) = F1.DateLastModified '最終更新日時 Cells(R, 7) = F1.DateLastAccessed 'アクセス日時 If Not F1 Is Nothing Then dateTime = ieFolderItem.ExtendedProperty("WhenTaken") If Not IsEmpty(dateTime) Then Cells(R, 9) = dateTime + TimeValue("9:00:00") '撮影日時(LocalTime) End If End If Set F1 = Nothing R = R + 1 End If Next ie.Quit Set Fso = Nothing Set ieFolder = Nothing Set ie = Nothing Set F1 = Nothing Columns("A:Z").ColumnWidth = 1 Cells.EntireColumn.AutoFit Range("A1").Select MsgBox "◎◎◎処理完了◎◎◎", 64 End Sub