楼主 kevinchengcw | 
Q: 如何利用vba代码实现根据规则的文件名更新文件列表及链接、批注等内容? A: 本例中文件名命名规则为:字段1.字段2.版本.pdf,基于如此规则的命名,在重建列表时即可轻易的实现对应字段分割及版本号检查工作。 示例代码如下:
 -  Sub test()
  - Dim FN$, Arr, N%, Dic, Rng As Range, Str$, Str2$, hasComment As Boolean
  - Set Dic = CreateObject("scripting.dictionary")  '创建字典项目
  - With Sheet1 '对操作页进行操作
  -     If .Cells(.Rows.Count, 1).End(3).Row > 3 Then   '如果操作页的A列有原始数据存在(即第4行开始向下有数据存在),则
  -         For Each Rng In .Range(.[a4], .Cells(.Rows.Count, 1).End(3))    '循环A列数据区各单元格
  -             If Rng <> "" Then   '如果当前循环到的单元格不为空(容错作用),则
  -                 With Rng
  -                     If .Offset(0, 4).Comment Is Nothing Then    '判断D列当前行是否有批注存在,如果没有则
  -                         hasComment = False  '判断有无批注的逻辑变量值为假
  -                         Str2 = ""   '记录批注文本的字符串变量为空
  -                     Else
  -                         hasComment = True   '判断有无批注的逻辑变量值为真
  -                         Str2 = .Offset(0, 4).Comment.Text   '记录批注文本的变量赋值为批注的内容
  -                     End If
  -                     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列的文本内容+判断注释存在的逻辑变量的值的文本+记录注释文本的变量的值)
  -                 End With
  -             End If
  -         Next Rng
  -         With .Range(.[a4], .Cells(.Rows.Count, 1).End(3).Offset(0, 6))  '当有原始数据时清除原始数据中的内容(含文本及批注)
  -             .ClearContents
  -             .ClearComments
  -         End With
  -     End If
  -     FN = Dir(ThisWorkbook.Path & "\*.pdf")  '查找当前工作簿文件夹下的pdf文件
  -     N = 4   '初始化数据起始行的行号值变量
  -     Do While FN <> ""   '当文件名不为空时继续循环
  -         Arr = Split(UCase(FN), ".")     '将文件名全部变成大写后依"."分割成数段放入数组中
  -         Str = Arr(0) & "." & Arr(1)     '组合1、2段,方便同字典中的项目进行对比
  -         If Dic.exists(Str) Then     '如果存在该字典项目,则
  -             .Cells(N, 1) = Arr(0)   '向数据区A列当前行写入文件名1段内空
  -             .Hyperlinks.Add .Cells(N, 2), ThisWorkbook.Path & "\" & FN, "", Arr(1), Arr(1)      '向B列当前行写入链接文本
  -             .Cells(N, 3) = Replace(Arr(2), "A", "A/")   '向C列当前行写入变换后的版本号文本
  -             If Val(Replace(Arr(2), "A", "")) > Val(Split(Dic(Str), vbTab)(0)) Then  '判断当前版本号是否大于旧的版本号,如果大于则
  -                 .Cells(N, 5) = Format(Date, "yyyy-m-d")     'E列当前行写入当前日期
  -                 If UCase(Split(Dic(Str), vbTab)(2)) = "TRUE" Then   '如果原始数据该单元格有批注,则
  -                     .Cells(N, 5).AddComment Split(Dic(Str), vbTab)(3) & vbNewLine & Format(Date, "yyyy-m-d") & "-" & .Cells(N, 3).Value     '将原有批注内容与新的版本信息串接后作为新的批注插入E列当前行
  -                 Else    '如果原数据没有批注,则
  -                     .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     '将原始数据的日期及版本及当前日期及版本作为批注插入
  -                 End If
  -             Else    '如果版本未更新,则
  -                 .Cells(N, 5) = Split(Dic(Str), vbTab)(1)    'E列当前行写入原始数据的日期
  -                 If UCase(Split(Dic(Str), vbTab)(2)) = "TRUE" Then .Cells(N, 5).AddComment Split(Dic(Str), vbTab)(3)     '判断是否原始数据有批注,有则同样插入原始数据中的批注
  -             End If
  -         Else    '如果字典中不存在该项目,则全新添加
  -             .Cells(N, 1) = Arr(0)
  -             .Hyperlinks.Add .Cells(N, 2), ThisWorkbook.Path & "\" & FN, "", Arr(1), Arr(1)
  -             .Cells(N, 3) = Replace(Arr(2), "A", "A/")
  -             .Cells(N, 5) = Format(Date, "yyyy-m-d")
  -         End If
  -         N = N + 1       '下移一行
  -         FN = Dir    '下一个文件
  -     Loop
  - End With
  - Set Dic = Nothing   '清空字典项目
  - End Sub
 
 
  附示例文件。
  文件列表更新示例.rar   |