アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAでサイトからダウンロードしたExifReaderクラスをつかってJPEGファイルの
撮影日時を取得しようとしています。
ある画像ファイル(JPEG)を読み込もうとすると、オーバーフローエラーが発生します。
Dim objExif As New ExifReader
objExif.Load "画像ファイルパス" ←この時

ちゃんと画像ファイルを読み込んで、撮影日時を取得できるものもあります。
画像ファイルのプロパティを確認しても違いがわからないです。
ダウンロードしたクラスによるかともおもうのですが、原因および対処方法がございましたら
教えていただきたいです。(何らかの方法で画像ファイルを変更するとか?)
よろしくお願いします。
Excel2010
Windows7

質問者からの補足コメント

  • クラスは下記サイトのものをダウンロードしました。
    http://sourceforge.jp/projects/sfnet_exifclass/r …

      補足日時:2015/03/15 06:47
  • 回答いただきありがとうございました。
    教えていただいたコードで試してみたところ、撮影日時は取得できたのですが、なぜかループで取得中12ファイル目でsTime が取得できませんでした。いくつかのフォルダ内の複数画像で試したのですが、やはりなぜか12ファイル名でsTimeが空で返ってきます。何か解決に目星はございますでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/03/16 09:44
  • ご丁寧にありがとうございました。
    下記コードでよびだしています。秒の取得は問いません。日付のみで大丈夫です。
    strDate(l) = FileInfo(strFiles(l))
    strDate(l) = Replace(strDate(l), " ", "/")
    strSplit = Split(strDate(l), "/")
    iY = CInt(strSplit(0))
    iM = CInt(strSplit(1))
    iD = CInt(strSplit(2))
    strDate(l) = iY & "年" & iM & "月" & iD & "日"

    12ファイル目でstrDate(l) が日時の取得なく、空白で返ってきます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/03/17 09:42

A 回答 (3件)

繰り返しになりますが


>その12ファイル目をエクスプローラでプロパティを見た時に
>撮影日時は確認できますか?
詳細タブの撮影日時が空白の場合はどうしようもありません。
取得に失敗した場合を考えてのサンプルです。

Sub てすと()
Dim i As Long
Dim strFiles() As String
Dim strDate() As String
Dim tmpFile As String
Dim trgDir As String
trgDir = "e:\tmp\" 'ファイルの在り処
tmpFile = Dir(trgDir & "*.jpg", vbNormal)

Do Until tmpFile = ""

ReDim Preserve strFiles(i)
ReDim Preserve strDate(i)
strFiles(i) = trgDir & tmpFile
strDate(i) = Left(FileInfo(trgDir & tmpFile), 10)
If strDate(i) <> "" Then '撮影日時が取得できなかった場合
strDate(i) = Format(CDate(strDate(i)), "yyyy\年m\月d\日")
Else
strDate(i) = "不明"
End If
i = i + 1
tmpFile = Dir
Loop

For i = LBound(strFiles) To UBound(strFiles) '確認用
Debug.Print i, strFiles(i), strDate(i)
Next
End Sub


Function FileInfo(ByVal trgFile As String) As String
Dim oSH As Object
Dim oFS As Object
Dim oFLD As Object
Dim oF As Object
Dim i As Long
Dim sTime As String
Dim NsTime As String

Set oSH = CreateObject("Shell.Application")
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oF = oFS.getfile(trgFile)
Set oFLD = oSH.Namespace(oF.ParentFolder.Path)

'12 は撮影日時指定のマジックナンバー、WindowsXP だと25、他は未検証
sTime = oFLD.GetDetailsOf(oFLD.ParseName(oF.Name), 12)

For i = 1 To Len(sTime) 'ごみ取りのためのループ
If Mid(sTime, i, 1) Like "[0-9,/ :]" Then
NsTime = NsTime & Mid(sTime, i, 1)
End If
Next

FileInfo = NsTime
'MsgBox "撮影日時=" & NsTime 'コメントアウトしました
Set oFLD = Nothing: Set oF = Nothing: Set oFS = Nothing: Set oSH = Nothing
End Function

※ここのサイトは補足・お礼の文字数が400文字に制限されているので
VBA のコードなどのやり取りには不向きですね。。。
    • good
    • 0
この回答へのお礼

その通りでした!!いくつか写真画像を圧縮した際日時情報等を消していたためでした。
本当にお世話になりました。
ダウンロードしたクラスよりも、nicotinismさんが提供してくれたコードのほうが扱いやすく
よく理解することができました。
いただいたコードも参考にさせていただきます。
ありがとうございました。

お礼日時:2015/03/17 13:10

せっかく参考リンクを提示していただいたのに


ちょっと見ただけで手つかずです。すみません。
900余行はちょっと・・・・

その12ファイル目をエクスプローラでプロパティを見た時に
撮影日時は確認できますか?
#1の関数をどうやって呼び出して(使って)いますか?
使用しているプロシージャのコードを見せてもらえませんか?

最初に戻りますが、Exif情報を直接読み取る方法は
門外漢のため回答できそうにありません。ごめんなさい。
『秒』の取得もしたいですよねー。
先達のご登場を願うばかりです。。。
この回答への補足あり
    • good
    • 0

Exif VBA でGoogleと多くの方が解説されていますね。


「ダウンロードしたExifReaderクラス」のコードが分かれば何とか・・・。
私の場合、正面突破は面倒そうなのでGetDetailsOfで取得しています。
ただし、Explorerでプロパティを表示した時と同様に『秒』は切り捨てられます。

Function FileInfo(ByVal trgFile As String) As String
Dim oSH As Object
Dim oFS As Object
Dim oFLD As Object
Dim oF As Object
Dim i As Long
Dim sTime As String
Dim NsTime As String

Set oSH = CreateObject("Shell.Application")
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oF = oFS.getfile(trgFile)
Set oFLD = oSH.Namespace(oF.ParentFolder.Path)

'12 は撮影日時指定のマジックナンバー、WindowsXP だと25、他は未検証
sTime = oFLD.GetDetailsOf(oFLD.ParseName(oF.Name), 12)

For i = 1 To Len(sTime) 'ごみ取りのためのループ
If Mid(sTime, i, 1) Like "[0-9,/ :]" Then
NsTime = NsTime & Mid(sTime, i, 1)
End If
Next
FileInfo = NsTime
MsgBox "撮影日時=" & NsTime
Set oFLD = Nothing: Set oF = Nothing: Set oFS = Nothing: Set oSH = Nothing
End Function

https://oshiete.goo.ne.jp/qa/8717110.html
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!