Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
写真の撮影日を和暦で表示したい
投稿日時: 19/10/12 11:00:19
投稿者: FHH

写真の撮影日をExcelに抽出する事は出来ているのですが,
和暦表示でつまづいています.
 
//////////////////////////////////////////////////////////////////////////////////
  Set objShell = CreateObject("Shell.Application")
 
  vntFiles = Application.GetOpenFilename( _
        FileFilter:="画像ファイル (*.jpg; *.gif),*.jpg;*.gif", _
        Title:="アクティブシートに挿入する画像を全て選択してください", _
        MultiSelect:=True)
 
 
    For i = 1 To UBound(vntFiles)
 
        Flg1 = InStr(Dir(vntFiles(i)), "_")
         
        'ファイル名に「_」が含まれている場合に以下のコードを実行する
        If Flg1 <> 0 Then
              
            '撮影日を入力
            Flg2 = InStrRev(vntFiles(i), "\")
             
            Set objFolder = objShell.Namespace(Left(vntFiles(i), Flg2 - 1))
            Cells(i + 1 + Nrow, 7) = Left(objFolder.GetDetailsOf(objFolder.ParseName(Dir(vntFiles(i))), 12), 13)
            Cells(i + 1 + Nrow, 7).NumberFormatLocal = "gggee""年""mm""月""dd""日"""
             
            Set objFolder = Nothing
        End If
 
    Next i
 
    Set objShell = Nothing
 
//////////////////////////////////////////////////////////////////////////////////
 
 
Excelに抽出された写真の撮影日は「‎2019/‎10/‎10 ‏‎10:24」であり,
Excelにもそのまま表示されています.
 
 
以前,FSOを使って「作成日」を取得した場合は和暦表示されました.
 
//////////////////////////////////////////////////////////////////////////////////
'撮影日を入力
        Cells(i + 1 + Nrow, 7).NumberFormatLocal = "ggge""年""m""月""d""日"""
        Cells(i + 1 + Nrow, 7) = Fso.GetFile(vntFiles(i)).DateCreated
//////////////////////////////////////////////////////////////////////////////////
 
FSOで抽出した作成日は,「2019/10/11 19:53:57」でした.
 
 
FileSystemObjectとShell.Applicationで抽出される「作成日」と「撮影日」で
何か違いがあるのでしょうか.

回答
投稿日時: 19/10/12 11:43:27
投稿者: simple

私の手元のファイルでも2つの項目は違う数字になっていますね。
撮影日は文字通りそれを撮影した時刻なんでしょう。
作成日は、そのファイルを違う機器にコピーしたときなどに設定される日時じゃないですかね。
正確なことは、ネットで検索してみてください。
 
で、タイトルになっている和暦の話は、直接は関係なかったんですかね。

投稿日時: 19/10/12 11:56:49
投稿者: FHH

simple様,ご返信頂きありがとうございます.
 
>、タイトルになっている和暦の話は、直接は関係なかったんですかね。
 
稚拙な文章のためご迷惑をおかけして申し訳ありません.
 
タイトルどおり和暦表示したいのですが,何が問題なのか分からないのです.
 
抽出した「作成日」と「撮影日」でデータの形式に違いがあるのか?
 
 
Shell.Applicationで抽出した「撮影日」のデータが,
 
 .NumberFormatLocal = "gggee""年""mm""月""dd""日"""
 
では和暦表示されない形式なのかすら分からないのです.

回答
投稿日時: 19/10/12 12:25:44
投稿者: 半平太

> Cells(i + 1 + Nrow, 7) = Left(objFolder.GetDetailsOf(objFolder.ParseName(Dir(vntFiles(i))), 12), 13)
  
右辺の返り値に余計な文字が含まれています。これ → ChrW(8206)
  
としてそれを排除したらどうですか?
 ↓
Cells(i + 1 + Nrow, 7) = Replace(Left(objFolder.GetDetailsOf(objFolder.ParseName(Dir(vntFiles(i))), 12), 13), ChrW(8206), "")

投稿日時: 19/10/12 13:04:27
投稿者: FHH

半平太様,後返信頂きありがとうございます.
 
>右辺の返り値に余計な文字が含まれています。これ → ChrW(8206)
 
こんなものが含まれているのですね・・・orz
 
ご提示いただいた「Replace」を用いて特殊文字を削除する方法で
和暦表示を行う事ができました.
 
後学ために教えて頂けないでしょうか.
抽出された「撮影日」からどのようにして特殊文字が含まれていることを
調べることができるのでしょうか.

回答
投稿日時: 19/10/12 13:13:51
投稿者: 半平太

こんなの調べました。
 ↓
 temp = Left(objFolder.GetDetailsOf(objFolder.ParseName(Dir(vntFiles(i))), 12), 13)
 For nn = 1 To Len(temp)
     Debug.Print "#" & Mid(temp, nn, 1) & "#", AscW(Mid(temp, nn, 1))
 Next

投稿日時: 19/10/12 13:36:13
投稿者: FHH

半平太様,ご返信頂きありがとうございます.
 
イミディエイトウィンドウに一文字ずつ文字と文字コードを出力して
和暦表示に不要な文字を探し出すのですね.
 
ありがとうございます.もの凄く参考になりました.