ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VB API 批量修改文件和文件夹的创建时间、最后修改时间、最后访问时间

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-10-5 07:40 | 显示全部楼层 |阅读模式

  1. Option Explicit
  2. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
  3.         (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
  4.          ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
  5.          ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
  6.          ByVal hTemplateFile As Long) As Long
  7.          
  8. Private Declare Function SetFileTime Lib "kernel32" (ByVal hFile As Long, _
  9.         lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, _
  10.         lpLastWriteTime As FILETIME) As Long
  11. Private Declare Function SystemTimeToFileTime Lib "kernel32" _
  12.         (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
  13. '----------------------------------------------------------------------
  14. Private Declare Function FileTimeToSystemTime Lib "kernel32" _
  15.     (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
  16. Private Declare Function FileTimeToLocalFileTime Lib "kernel32" _
  17.     (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
  18. '----------------------------------------------------------------------
  19. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  20. Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
  21. Private Type SYSTEMTIME
  22.         wYear As Integer
  23.         wMonth As Integer
  24.         wDayOfWeek As Integer
  25.         wDay As Integer
  26.         wHour As Integer
  27.         wMinute As Integer
  28.         wSecond As Integer
  29.         wMilliseconds As Integer
  30. End Type
  31. Private Type TIME_ZONE_INFORMATION
  32.    Bias As Long
  33.    StandardName(0 To ((32 * 2) - 1)) As Byte  'unicode
  34.    StandardDate As SYSTEMTIME
  35.    StandardBias As Long
  36.    DaylightName(0 To ((32 * 2) - 1)) As Byte  'unicode
  37.    DaylightDate As SYSTEMTIME
  38.    DaylightBias As Long
  39. End Type

  40. Private Type FILETIME
  41.         dwLowDateTime As Long
  42.         dwHighDateTime As Long
  43. End Type
  44. Private Type SECURITY_ATTRIBUTES
  45.         nLength As Long
  46.         lpSecurityDescriptor As Long
  47.         bInheritHandle As Long
  48. End Type
  49. Private Const GENERIC_READ = &H80000000
  50. Private Const GENERIC_WRITE = &H40000000
  51. Private Const FILE_SHARE_READ = &H1
  52. Private Const FILE_SHARE_WRITE = &H2
  53. Private Const OPEN_EXISTING = 3
  54. Private Const FILE_FLAG_BACKUP_SEMANTICS = &H2000000
  55. Private Const INVALID_HANDLE_VALUE = -1
  56. Public wjgs As Long, wjzgs As Long '文件个数,文件总数
  57. Public wjjgs As Long, wjjzgs As Long '文件夹个数,文件夹总数
  58. Public maxLevel As Long, curMaxLevel As Long '限制搜索包含的子文件夹最大层数,当前已经搜索达到的最大层数
  59. Public Flg As Boolean '不限定搜索子文件夹的层数时,标记Flg为真
  60. Private Function TimeZoneVal() As Integer
  61.     Dim lpTimeZoneInformation As TIME_ZONE_INFORMATION
  62. '    Dim tmp As String
  63. '    Dim pos As Integer
  64.    
  65.     GetTimeZoneInformation lpTimeZoneInformation
  66. '    tmp = lpTimeZoneInformation.StandardName
  67. '    pos = InStr(tmp, Chr$(0))
  68. '    MsgBox Left$(tmp, Len(tmp) - pos)
  69.     TimeZoneVal = lpTimeZoneInformation.Bias / 60
  70. End Function
  71. Private Function SetFlTime(DirName As String, NewCreationTime As SYSTEMTIME, _
  72.         NewLastAccessTime As SYSTEMTIME, NewLastWriteTime As SYSTEMTIME) As Boolean '修改文件(夹)的创建时间、访问时间、最后修改时间
  73.     Dim hDir As Long
  74.     Dim lpCreationTime As FILETIME
  75.     Dim lpLastAccessTime As FILETIME
  76.     Dim lpLastWriteTime As FILETIME
  77.     Dim retval As Boolean
  78.     Dim sAttribute As SECURITY_ATTRIBUTES
  79.    
  80.     hDir = CreateFile(DirName, GENERIC_WRITE, FILE_SHARE_READ, sAttribute, _
  81.            OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) '获得文件句柄
  82.     If hDir = INVALID_HANDLE_VALUE Then SetFlTime = False: Exit Function
  83.     SystemTimeToFileTime NewCreationTime, lpCreationTime '转换系统时间为文件时间
  84.     SystemTimeToFileTime NewLastWriteTime, lpLastWriteTime
  85.     SystemTimeToFileTime NewLastAccessTime, lpLastAccessTime
  86.     '---------
  87.     retval = SetFileTime(hDir, lpCreationTime, lpLastAccessTime, lpLastWriteTime)
  88.         '本句为核心代码:使用“系统文件句柄”和给定的3项文件时间做参数,对文件(夹)进行“时间属性”的修改设置
  89.    
  90.     CloseHandle (hDir)
  91.     SetFlTime = retval
  92. End Function
  93. Sub CommandButton1_Click()
  94.     Dim stm As String, flNm As String, fltChr As String
  95.     Dim i As Long
  96.     Dim dlgAnswer As Object, objSrc As Object
  97.     Dim fldName As String, flNames As String, flName As String
  98.     Dim tm1 As String, tm2 As String, tm3 As String
  99.     Dim blltnStr As String
  100.     Dim fltYesNo As Boolean, regExFltBool As Boolean, flYesNo As Boolean
  101.     Dim foldersYesNo As Boolean, filesYesNo As Boolean
  102.     Dim subfoldersYesNo  As Boolean
  103.     Dim tm As String
  104.     Dim st1 As Date, st2 As Date, st3 As Date
  105.     Dim maxLevel As Long
  106.    
  107.     '--------浏览并指定文件夹路径--------
  108.     Set objSrc = CreateObject("Shell.Application")
  109.     Set dlgAnswer = objSrc.BrowseForFolder(0, "请选择文件目录:", 0, "")
  110.     If dlgAnswer Is Nothing Then Exit Sub
  111.     fldName = dlgAnswer.self.Path
  112.     Set objSrc = Nothing
  113.     Set dlgAnswer = Nothing
  114.    
  115.     '-------获得3个时间参数------------
  116.     tm = InputBox("请输入有效的日期时间", "提示:输入文件创建时间", Now): If tm <> "" Then st1 = CDate(tm)
  117.     tm = InputBox("请输入有效的日期时间", "提示:输入文件最后访问时间", Now): If tm <> "" Then st2 = CDate(tm)
  118.     tm = InputBox("请输入有效的日期时间", "提示:输入文件最后修改时间", Now): If tm <> "" Then st3 = CDate(tm)
  119.    
  120.     '-------获得文件(夹)名称筛选条件特征字符参数-
  121.     fltYesNo = (MsgBox("是否需要对文件(夹)按名称筛选?", vbYesNo, "文件&文件夹名称筛选提示") = vbYes)
  122.     If fltYesNo Then
  123.         regExFltBool = MsgBox("是否以正则表达式进行筛选?", vbOKCancel, "筛选模式") = vbOK
  124.         fltChr = Application.InputBox("请输入文件(夹)名称筛选条件,例如:" _
  125.             & Chr(10) & "全部文件,*.*" & Chr(10) _
  126.             & "多种选择时请用英文冒号"":""分隔", _
  127.             "输入文件名称筛选条件", Type:=2)
  128.         If fltChr = "" Then fltChr = "*"
  129.     End If
  130.    
  131.     '-------是否处理文件夹-------
  132.     foldersYesNo = (MsgBox("是否需要对文件夹进行处理?", vbYesNo, "请确认:是否包含文件夹?") = vbYes)
  133.    
  134.    
  135.     '-------是否处理文件-------
  136.     filesYesNo = (MsgBox("是否需要对文件进行处理?", vbYesNo, "请确认:是否包含文件?") = vbYes)
  137.    
  138.    
  139.     '-------是否对子文件夹进行搜索处理-------
  140.     subfoldersYesNo = (MsgBox("是否包含子文件夹?", vbYesNo, "请确认:是否包含所有子文件夹") = vbYes)
  141.    
  142.     '-------限定多层子文件夹的搜索深度-------
  143.     maxLevel = Application.InputBox("限定最多搜索至第n层子文件夹,默认不限制(n=0),n=:", "限定多层子文件夹的搜索深度", 0, Type:=1)
  144.     Flg = maxLevel < 1
  145.    
  146.     '-----计算其它几项参数--------------
  147.     curMaxLevel = UBound(Split(fldName, "")) + 1: maxLevel = maxLevel + curMaxLevel: wjjzgs = 0: wjzgs = 0
  148.    
  149.     '-----代入参数运行--------------
  150.     digui fldName, st1, st2, st3, fltYesNo, fltChr, regExFltBool, foldersYesNo, filesYesNo, subfoldersYesNo, maxLevel, wjjzgs, wjzgs
  151.    
  152.     '-----报告执行结果--------------
  153.     blltnStr = IIf(subfoldersYesNo, "共", "未") & "搜索子文件夹" & IIf(subfoldersYesNo, curMaxLevel - 1 - UBound(Split(fldName, "")) & "层", "")
  154.     MsgBox "报告:一、" & blltnStr & ";二、总共处理了:文件夹" & wjjzgs & "个,文件" & wjzgs & "个!"
  155. End Sub
  156. Function digui(fldName As String, crtTime As Date, lstAccTime As Date, lstWrtTime As Date, fltYesNo As Boolean, fltChr As String, _
  157.                 regExFltBool, foldersYesNo As Boolean, filesYesNo As Boolean, subfoldersYesNo As Boolean, maxLevel As Long, _
  158.                  wjjgs As Long, wjgs As Long)
  159.                  '参数共包含:文件夹名称,创建时间,访问时间,修改时间,是否按名称筛选,筛选用特征字串,_
  160.                  '是否用正则表达式作为筛选模式,是否处理文件夹,是否处理文件,是否搜索子文件夹,限定搜索子文件夹的最大层数,_
  161.                  '已经处理的文件夹个数,已经处理的文件个数
  162.     Dim fs, f, f1, s, sf, sfld, mfld
  163.     Dim flName As String, sfn As String
  164.     Dim lpcrtTime As SYSTEMTIME, lplstAccTime As SYSTEMTIME, lplstWrtTime As SYSTEMTIME
  165.     Dim i As Long, j As Long
  166.     Dim retva As Boolean
  167.    
  168.    
  169. '---使用自定义函数,计算出相应的时间--------------------------
  170.     lpcrtTime = 函数(crtTime)
  171.     lplstAccTime = 函数(lstAccTime)
  172.     lplstWrtTime = 函数(lstWrtTime)
  173.    
  174.     Set fs = CreateObject("Scripting.FileSystemObject")
  175.     Set f = fs.GetFolder(fldName)
  176. With Application
  177.     .DisplayStatusBar = True
  178.     If foldersYesNo Then '处理文件夹自身,先筛选再执行
  179.         curMaxLevel = Application.Max(UBound(Split(fldName, "")), curMaxLevel)
  180.         If fltYesNo Then
  181.             If fldName Like fltChr Then
  182.                 'MsgBox fldName
  183.                 retva = SetFlTime(fldName, lpcrtTime, lplstAccTime, lplstWrtTime)
  184.                 If retva Then wjjgs = wjjgs + 1
  185.                 If (wjjgs Mod 5) = 0 Then .StatusBar = "已经处理:文件夹" & wjjgs & "个,文件" & wjgs & "个"
  186.             End If
  187.         Else:
  188.             'MsgBox fldName
  189.             SetFlTime fldName, lpcrtTime, lplstAccTime, lplstWrtTime
  190.             retva = SetFlTime(fldName, lpcrtTime, lplstAccTime, lplstWrtTime)
  191.             If retva Then wjjgs = wjjgs + 1
  192.         End If
  193.     End If
  194.    
  195.     If filesYesNo Then '处理文件
  196.         For Each f1 In f.Files
  197.             flName = f1.Path
  198.             If fltYesNo Then
  199.                 If fltBool(flName, fltChr) Then
  200.                     'MsgBox flName
  201.                     retva = SetFlTime(flName, lpcrtTime, lplstAccTime, lplstWrtTime)
  202.                     If retva Then wjgs = wjgs + 1
  203.                     If (wjgs Mod 5) = 0 Then .StatusBar = "已经处理:文件夹" & wjjgs & "个,文件" & wjgs & "个"
  204.                 End If
  205.             Else:
  206.                 'MsgBox flName
  207.                     retva = SetFlTime(flName, lpcrtTime, lplstAccTime, lplstWrtTime)
  208.                     If retva Then wjgs = wjgs + 1
  209.             If (wjgs Mod 5) = 0 Then .StatusBar = "已经处理:文件夹" & wjjgs & "个,文件" & wjgs & "个"
  210.             End If
  211.         Next
  212.     End If
  213.     If subfoldersYesNo Then '搜索子文件夹
  214.         Set sfld = f.SubFolders
  215.         If sfld.Count > 0 Then
  216.             If Flg Or UBound(Split(f.Path, "")) + 1 < maxLevel Then
  217.                 For Each sf In sfld
  218.                     sfn = sf.Path
  219.                     digui sfn, crtTime, lstAccTime, lstWrtTime, fltYesNo, fltChr, regExFltBool, foldersYesNo, filesYesNo, _
  220.                         subfoldersYesNo, maxLevel, wjjzgs, wjzgs
  221.                 Next
  222.             End If
  223.         End If
  224.     End If
  225.     .StatusBar = False
  226. End With
  227. End Function
  228. Private Function 函数(lpTime As Date) As SYSTEMTIME '自定义函数,转换文件时间到当地系统时间
  229. '    If IsNumeric(lpTime) Then
  230.         With 函数
  231.             .wYear = Year(lpTime)
  232.             .wMonth = Month(lpTime)
  233.             .wDay = Day(lpTime)
  234.             .wDayOfWeek = Weekday(lpTime)
  235.             .wHour = Hour(lpTime) + TimeZoneVal()
  236.                 'TimeZoneVal()为格林尼冶时间与当前系统时区时间的差值,_
  237.                 '例如当前选择北京时间,则为“东八区”,即TimeZoneVal()=- 8
  238.             .wMinute = Minute(lpTime)
  239.             .wSecond = Second(lpTime)
  240.         End With
  241. '    End If
  242. End Function
  243. Private Function fltBool(fldName As String, fltChr As String, Optional RegExpUsed As Boolean = False) As Boolean
  244. Dim fltChrs, subfltChr
  245. Dim regEx, Match, Matches                      ' 建立变量。
  246. If RegExpUsed Then
  247.     '用正则表达式进行匹配筛选
  248.     fltChr = Replace(fltChr, "*", ".*")
  249.     Set regEx = CreateObject("vbScript.regExp")   ' 建立正则表达式。
  250.     regEx.Pattern = fltChr 'patrn                  ' 设置模式。
  251.     regEx.IgnoreCase = True                        ' 设置是否区分字符大小写。
  252.     regEx.Global = True                            ' 设置全局可用性。当执行Test方法时,RegExp.Global属性对结果没有影响。
  253. '    regEx.MultiLine = False                        '多行匹配模式,默认为不开启,因为其作用有限、且开启这个特性可能会导致某些问题
  254.     fltBool = regEx.Test(fldName)              ' 执行匹配检测。
  255. Else
  256.     '用like方法进行匹配筛选
  257.     fltChrs = Split(fltChr, ":")
  258.     If IsArray(fltChrs) Then
  259.         For Each subfltChr In fltChrs
  260.             If fldName Like ("*" & subfltChr & "*") Then
  261.                 fltBool = True: Exit Function
  262.             End If
  263.         Next
  264.     Else
  265.          fltBool = fldName Like fltChr
  266.     End If
  267. End If
  268. End Function

复制代码

批量修改文件夹的创建、修改、访问时间.rar

26.57 KB, 下载次数: 519

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-5 14:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-10-5 14:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-1-26 09:44 | 显示全部楼层
谢谢!非常不错,跟贴学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-25 16:59 | 显示全部楼层
fanjy版主做的一个定位单元格在屏幕上的坐标的例子,用到了不少API。其中有SendMessage消息处理函数的用法,可供参考:
http://club.excelhome.net/forum. ... TEyfDMyOTc1Ng%3D%3D

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-14 05:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一个批量转换工作薄中的公式为数值、批量清除工作薄中宏代码的模块:
清除公式和宏.rar (1.3 KB, 下载次数: 51)

TA的精华主题

TA的得分主题

发表于 2017-12-26 13:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
具体操作步骤请详细讲解一下呢

TA的精华主题

TA的得分主题

发表于 2017-12-26 13:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
具体步骤请详细讲解一下,谢谢

TA的精华主题

TA的得分主题

发表于 2019-4-10 00:46 | 显示全部楼层
你好,发现在输入时间为2和0等其他小的小时的时候,程序似乎没有反应。为什么呢?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-29 02:49 , Processed in 0.039266 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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