VBAでサイトからダウンロードしたExifReaderクラスをつかってJPEGファイルの
撮影日時を取得しようとしています。
ある画像ファイル(JPEG)を読み込もうとすると、オーバーフローエラーが発生します。
Dim objExif As New ExifReader
objExif.Load "画像ファイルパス" ←この時
ちゃんと画像ファイルを読み込んで、撮影日時を取得できるものもあります。
画像ファイルのプロパティを確認しても違いがわからないです。
ダウンロードしたクラスによるかともおもうのですが、原因および対処方法がございましたら
教えていただきたいです。(何らかの方法で画像ファイルを変更するとか?)
よろしくお願いします。
Excel2010
Windows7
No.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 のコードなどのやり取りには不向きですね。。。
その通りでした!!いくつか写真画像を圧縮した際日時情報等を消していたためでした。
本当にお世話になりました。
ダウンロードしたクラスよりも、nicotinismさんが提供してくれたコードのほうが扱いやすく
よく理解することができました。
いただいたコードも参考にさせていただきます。
ありがとうございました。
No.2
- 回答日時:
せっかく参考リンクを提示していただいたのに
ちょっと見ただけで手つかずです。すみません。
900余行はちょっと・・・・
その12ファイル目をエクスプローラでプロパティを見た時に
撮影日時は確認できますか?
#1の関数をどうやって呼び出して(使って)いますか?
使用しているプロシージャのコードを見せてもらえませんか?
最初に戻りますが、Exif情報を直接読み取る方法は
門外漢のため回答できそうにありません。ごめんなさい。
『秒』の取得もしたいですよねー。
先達のご登場を願うばかりです。。。
No.1
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- iPhone(アイフォーン) iphoneで撮影した写真、動画を連番のファイル名で保存したい。 1 2022/04/28 02:12
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- デジタルカメラ Googleフォトで画像を自動補正すると何故サイズが小さくなるのでしょうか? 4 2022/09/19 13:05
- デジタルカメラ 画像ファイルのサイズを理解する方法についてお教えください。 3 2022/09/18 12:54
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- デスクトップパソコン 大量のファイルの中から壊れたファイルを検出して削除したい(特にExcel) 1 2023/08/11 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaでPDFファイルに変換するに...
-
【Excel VBA】取り込んだファイ...
-
GetOpenFileName()について
-
VBAで、JPG写真の撮影日時を読...
-
0バイトのテキストファイル
-
サイトマップにサブドメインを...
-
HTMLまたはJavaScriptでフ...
-
VB6でTIFF図のプロパティを...
-
ファイル作成日時と更新日時を...
-
BASP21のファイルアップロード...
-
VB6.0のメモリリークについて
-
<input type="file" で初期値...
-
文字コードについて(どのファ...
-
リソースファイルを認識してく...
-
CSVファイルの時刻の形式について
-
テキストファイルの一部分を抽...
-
COBOL FILLER
-
テキストファイル内容の、16進...
-
accessでクエリをExcelにエクス...
-
VB.NET操作で Excelにビットマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
【VBA】複数CSVの特定範囲を1つ...
-
2GB以上のファイルを扱う方法
-
C++によるファイル送受信プログ...
-
VB6.0のメモリリークについて
-
vbaの構文の修正相談(xmlファ...
-
サイトマップにサブドメインを...
-
BASP21のファイルアップロード...
-
ディレクトリのサイズの取得
-
msgget()で指定するkey値について
-
ファイル更新日取得
-
main関数のコマンドライン引数...
-
<input type="file" で初期値...
-
C++.NET 2003 「空のドキュメ...
-
RPGでメッセージファイル利用
-
Indy FTP サーバー上のファイル...
おすすめ情報
クラスは下記サイトのものをダウンロードしました。
http://sourceforge.jp/projects/sfnet_exifclass/r …
回答いただきありがとうございました。
教えていただいたコードで試してみたところ、撮影日時は取得できたのですが、なぜかループで取得中12ファイル目でsTime が取得できませんでした。いくつかのフォルダ内の複数画像で試したのですが、やはりなぜか12ファイル名でsTimeが空で返ってきます。何か解決に目星はございますでしょうか。
ご丁寧にありがとうございました。
下記コードでよびだしています。秒の取得は問いません。日付のみで大丈夫です。
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) が日時の取得なく、空白で返ってきます。