1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 455|回复: 11

[分享] 批量修改照片的原始拍摄时间

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-8 16:44 | 显示全部楼层 |阅读模式
Sub Main()
    '惊喜发现,DeepSeek帮忙修改代码成功!2025年3月8日
    Dim strFile As String, strNewDate As String
    Set wk = Worksheets("批量更正")
    strPath = ThisWorkbook.Path
    arr = wk.Range("C4:F6")
    For i = 1 To 3
      'strFile = "FILE0634.JPG"
      'strNewDate = "2024/2/3  14:36"
      strFile = arr(i, 1) & "." & arr(i, 2)
      strNewDate = arr(i, 4)
      Call ModiPhotoDate(strPath, strFile, strNewDate)
    Next
End Sub
Function ModiPhotoDate(strPath As Variant, strFile As String, strNewDate As String)
    '... [其他声明保持不变] ......DeepSeek修改
    'strPath:文件所在文件夹名,必须是Variant类型
    'strFile:文件名(不包括路径)
    'strNewDate:要显示的日期时间,yyyy-mm-dd hh:nn格式,时间不写的话用原照片时间

    Dim objShell As Object
    Dim objFolder As Object
    Dim objFolderItem As Object
    Dim strOldDate As String
    Dim arrOldDate() As Byte
    Dim arrNewDate() As Byte
    Dim arrByte() As Byte
    Dim strNewFile As String
    Dim i As Long
    Dim j As Long

    '照片复件文件名
    strNewFile = Left(strFile, InStrRev(strFile, ".") - 1) & "复件." & Mid(strFile, InStrRev(strFile, ".") + 1)
    '********************
    '获取照片的拍摄日期时间
    Set objShell = CreateObject("Shell.application")
    Set objFolder = objShell.Namespace(strPath)
    Set objFolderItem = objFolder.ParseName(strFile)
    strOldDate = objFolder.getdetailsof(objFolderItem, 12)
    '********************
    '... [清理对象保持不变] ...DeepSeek修改提示
    Set objFolderItem = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    '********************
    ' 新增:解析原始日期字符串为日期对象  ...DeepSeek新增
    Dim arrDateTime() As String
    Dim oldDatePart() As String, oldTimePart() As String
    Dim oldDateTime As Date

    ' 分离日期和时间部分(假设格式为"yyyy/mm/dd hh:mm")
    arrDateTime = Split(strOldDate, " ")
    If UBound(arrDateTime) >= 0 Then
        oldDatePart = Split(arrDateTime(0), "/")
        If UBound(arrDateTime) >= 1 Then
            oldTimePart = Split(arrDateTime(1), ":")
        Else
            ReDim oldTimePart(0 To 1)
            oldTimePart(0) = "00"
            oldTimePart(1) = "00"
        End If
    End If
    oldYear = Mid(oldDatePart(0), 2, 4)
    oldMonth = Mid(oldDatePart(1), 2, 2)
    oldDay = Mid(oldDatePart(2), 2, 2)
    oldHour = Mid(oldTimePart(0), 3, 2)
    oldMinute = oldTimePart(1)

    ' 构建日期对象
    oldDateTime = DateSerial(oldYear, oldMonth, oldDay) + _
                  TimeSerial(oldHour, oldMinute, 0)

    ' 合并新日期和时间
    If Len(strNewDate) <= 11 Then
        strNewDate = Trim(strNewDate) & Format(oldDateTime, " hh:nn")
    End If

    ' 确保新日期格式正确
    Dim newDateTime As Date
    newDateTime = CDate(strNewDate)

    ' 更新字节转换格式(保持原格式)
    arrOldDate = StrConv(Format(oldDateTime, "yyyy:mm:dd hh:nn"), vbFromUnicode)
    arrNewDate = StrConv(Format(newDateTime, "yyyy:mm:dd hh:nn"), vbFromUnicode)
    '********************
    '... [剩余代码保持不变] ... ..DeepSeek修改提示
     '读入照片的二进制数据
    With CreateObject("Adodb.Stream")
        .Open
        .Type = 1      'adTypeBinary
        .LoadFromFile strPath & "\" & strFile
        arrByte = .read
        .Close
    End With

    '修改日期时间
    For i = 0 To UBound(arrByte)
        If arrByte(i) = arrOldDate(0) Then
            For j = 1 To UBound(arrOldDate)
                If arrByte(i + j) <> arrOldDate(j) Then Exit For
            Next
            If j > UBound(arrOldDate) Then
                For j = 0 To UBound(arrOldDate)
                    arrByte(i + j) = arrNewDate(j)
                Next
            End If
        End If
    Next

    '二进制数据写入文件,创建日期和修改日期等是当前日期
    With CreateObject("Adodb.Stream")
        .Type = 1  'adTypeBinary
        .Open
        .Write arrByte
        .SaveToFile strPath & "\" & strNewFile, 2 'adSaveCreateOverWrite
        .Close
    End With
End Function

批量修改图片原始拍摄时间vba编程.zip

1.74 MB, 下载次数: 20

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-8 19:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-9 00:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-3-9 10:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
perfect131 发表于 2025-3-8 19:22
看来 你没看懂这代码啊
如果文件的 修改时间 创建时间 访问时间 拍摄时间 反正是时间一样的话
你这个代码 ...

谢谢指点,现用着再说吧,慢慢学

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-3-9 11:28 | 显示全部楼层
taller 发表于 2025-3-9 00:52
十几年前写的小工具 -- 文件时间修改工具

https://club.excelhome.net/thread-232338-1-1.html?_dsign=b ...

非常实用,收藏了,水平有限,基础较差,估计学不会,但可简单改装。

TA的精华主题

TA的得分主题

发表于 2025-3-9 12:03 | 显示全部楼层
perfect131 发表于 2025-3-8 19:22
看来 你没看懂这代码啊
如果文件的 修改时间 创建时间 访问时间 拍摄时间 反正是时间一样的话
你这个代码 ...

但事实俱在,楼主附件的VBA代码,实实在在地修改了照片的拍摄时间啊。
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-9 13:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-14 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
表面上修改了拍摄时间,去右键属性里面看确实改过了
但是用代码获取照片的拍摄时间,仍然是以前的拍摄时间
所以这个代码没有多在实际用处

我也试了论坛里其他人分享的代码,和这个一样,只改肉眼看到的时间,用代码提取拍摄时间就露馅了

TA的精华主题

TA的得分主题

发表于 2025-3-14 11:52 | 显示全部楼层
ggmmlol 发表于 2025-3-9 12:03
但事实俱在,楼主附件的VBA代码,实实在在地修改了照片的拍摄时间啊。

表面上修改了,只能骗肉眼
用代码提取照片的拍摄时间 还是以前的那个
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-14 13:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-4-16 10:35 , Processed in 0.029033 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表