ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码实现根据规则的文件名更新文件列表及链接、批注等内容?

如何利用vba代码实现根据规则的文件名更新文件列表及链接、批注等内容?

作者:绿色风 分类: 时间:2022-08-17 浏览:159
楼主
kevinchengcw
Q: 如何利用vba代码实现根据规则的文件名更新文件列表及链接、批注等内容?
A: 本例中文件名命名规则为:字段1.字段2.版本.pdf,基于如此规则的命名,在重建列表时即可轻易的实现对应字段分割及版本号检查工作。
示例代码如下:
  1. Sub test()
  2. Dim FN$, Arr, N%, Dic, Rng As Range, Str$, Str2$, hasComment As Boolean
  3. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目
  4. With Sheet1 '对操作页进行操作
  5.     If .Cells(.Rows.Count, 1).End(3).Row > 3 Then   '如果操作页的A列有原始数据存在(即第4行开始向下有数据存在),则
  6.         For Each Rng In .Range(.[a4], .Cells(.Rows.Count, 1).End(3))    '循环A列数据区各单元格
  7.             If Rng <> "" Then   '如果当前循环到的单元格不为空(容错作用),则
  8.                 With Rng
  9.                     If .Offset(0, 4).Comment Is Nothing Then    '判断D列当前行是否有批注存在,如果没有则
  10.                         hasComment = False  '判断有无批注的逻辑变量值为假
  11.                         Str2 = ""   '记录批注文本的字符串变量为空
  12.                     Else
  13.                         hasComment = True   '判断有无批注的逻辑变量值为真
  14.                         Str2 = .Offset(0, 4).Comment.Text   '记录批注文本的变量赋值为批注的内容
  15.                     End If
  16.                     Dic.Add UCase(.Value) & "." & UCase(.Offset(0, 1).Value), Replace(.Offset(0, 2).Value, "A/", "") & vbTab & .Offset(0, 4).Text & vbTab & UCase(CStr(hasComment)) & vbTab & Str2  '添加对应的字典项(item项格式:版本去除字母后的数值+D列的文本内容+判断注释存在的逻辑变量的值的文本+记录注释文本的变量的值)
  17.                 End With
  18.             End If
  19.         Next Rng
  20.         With .Range(.[a4], .Cells(.Rows.Count, 1).End(3).Offset(0, 6))  '当有原始数据时清除原始数据中的内容(含文本及批注)
  21.             .ClearContents
  22.             .ClearComments
  23.         End With
  24.     End If
  25.     FN = Dir(ThisWorkbook.Path & "\*.pdf")  '查找当前工作簿文件夹下的pdf文件
  26.     N = 4   '初始化数据起始行的行号值变量
  27.     Do While FN <> ""   '当文件名不为空时继续循环
  28.         Arr = Split(UCase(FN), ".")     '将文件名全部变成大写后依"."分割成数段放入数组中
  29.         Str = Arr(0) & "." & Arr(1)     '组合1、2段,方便同字典中的项目进行对比
  30.         If Dic.exists(Str) Then     '如果存在该字典项目,则
  31.             .Cells(N, 1) = Arr(0)   '向数据区A列当前行写入文件名1段内空
  32.             .Hyperlinks.Add .Cells(N, 2), ThisWorkbook.Path & "\" & FN, "", Arr(1), Arr(1)      '向B列当前行写入链接文本
  33.             .Cells(N, 3) = Replace(Arr(2), "A", "A/")   '向C列当前行写入变换后的版本号文本
  34.             If Val(Replace(Arr(2), "A", "")) > Val(Split(Dic(Str), vbTab)(0)) Then  '判断当前版本号是否大于旧的版本号,如果大于则
  35.                 .Cells(N, 5) = Format(Date, "yyyy-m-d")     'E列当前行写入当前日期
  36.                 If UCase(Split(Dic(Str), vbTab)(2)) = "TRUE" Then   '如果原始数据该单元格有批注,则
  37.                     .Cells(N, 5).AddComment Split(Dic(Str), vbTab)(3) & vbNewLine & Format(Date, "yyyy-m-d") & "-" & .Cells(N, 3).Value     '将原有批注内容与新的版本信息串接后作为新的批注插入E列当前行
  38.                 Else    '如果原数据没有批注,则
  39.                     .Cells(N, 5).AddComment Split(Dic(Str), vbTab)(1) & "-A/" & Split(Dic(Str), vbTab)(0) & vbNewLine & Format(Date, "yyyy-m-d") & "-" & .Cells(N, 3).Value     '将原始数据的日期及版本及当前日期及版本作为批注插入
  40.                 End If
  41.             Else    '如果版本未更新,则
  42.                 .Cells(N, 5) = Split(Dic(Str), vbTab)(1)    'E列当前行写入原始数据的日期
  43.                 If UCase(Split(Dic(Str), vbTab)(2)) = "TRUE" Then .Cells(N, 5).AddComment Split(Dic(Str), vbTab)(3)     '判断是否原始数据有批注,有则同样插入原始数据中的批注
  44.             End If
  45.         Else    '如果字典中不存在该项目,则全新添加
  46.             .Cells(N, 1) = Arr(0)
  47.             .Hyperlinks.Add .Cells(N, 2), ThisWorkbook.Path & "\" & FN, "", Arr(1), Arr(1)
  48.             .Cells(N, 3) = Replace(Arr(2), "A", "A/")
  49.             .Cells(N, 5) = Format(Date, "yyyy-m-d")
  50.         End If
  51.         N = N + 1       '下移一行
  52.         FN = Dir    '下一个文件
  53.     Loop
  54. End With
  55. Set Dic = Nothing   '清空字典项目
  56. End Sub


附示例文件。
文件列表更新示例.rar
2楼
篮板球
跟着K版学习VBA没错的。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap