VBA Dir()执行刷新?

时间:2017-09-14 09:28:56

标签: excel vba excel-vba

我有一个主要的Sub,我在其中放置了Dir()函数,以便遍历所选文件夹中的文件(文件由于它们的扩展而被定向到特定的Subs)。其中一种格式是Outlook电子邮件(.msg),然后宏提取工作簿并对其进行操作,最后删除提取的工作簿。但是(这是我的问题),宏需要对附件进行操作,尽管已被删除。它看起来像Dir()函数也包含这些附件,但是收集文件的Dir()指令是在主Sub的开头执行的(它没有放在循环中)。

我不知道如何删除附件并保留第一个文件集合。

以下是代码。 在一个主要的Sub:

dirfilename = Dir(strfilename & "\")
'Do the loop for all files in a folder
Do While dirfilename <> ""
    If InStr(1, dirfilename, ".xls", vbBinaryCompare) > 0 Then
        update_Excel_files strfilename, dirfilename, mistakes_table_name, counter
    ElseIf InStr(1, dirfilename, ".msg", vbBinaryCompare) > 0 Then
        update_Emails strfilename, dirfilename, mistakes_table_name, counter
    End If
    dirfilename = Dir
Loop

然后我在Sub'update_Emails'的末尾使用Kill()函数。

1 个答案:

答案 0 :(得分:0)

解决方案一

在执行处理/解压缩之前备份所有.msg文件

Sub main()
  .
  .
  .
  dirfilename = Dir(strfilename & "\")
  'Make a backup of all the .msg files
  MkDir(strfilename & "\backUP")
  FileCopy(strfilename & "\*.msg", strfilename & "\backUP\.")
  'Do the loop for all files in a folder
  Do While dirfilename <> ""
    If InStr(1, dirfilename, ".xls", vbBinaryCompare) > 0 Then
      update_Excel_files strfilename, dirfilename, mistakes_table_name, counter
    ElseIf InStr(1, dirfilename, ".msg", vbBinaryCompare) > 0 Then
      update_Emails strfilename, dirfilename, mistakes_table_name, counter
    End If
    dirfilename = Dir
  Loop
  .
  .
  'MAKE SURE YOU CLEAN UP AT THE END OF MAIN SUB
  Kill(strfilename & "\backUP\*.*")
  RmDir(strfilename & "\backUP")
End Sub

Sub update_Emails(strfilename As String, dirfilename As String, mistakes_table_name As String, counter As Integer)
  .
  .
  .
  'PROCESS ON .MSG FILES FROM <<strfilename & "\backUP">>
  .
  .
  .
End Sub

解决方案二

在处理它们时备份.msg。这样,在任何给定的时间点只有一个文件副本。

Sub main()
  MkDir(strfilename & "\backUP")
  .
  .
  .
  Kill(strfilename & "\backUP\*.*")
  RmDir(strfilename & "\backUP")
End Sub
Sub update_Emails(strfilename As String, dirfilename As String, mistakes_table_name As String, counter As Integer)
  .
  .
  'PROCESS ANY OLDER .MSG FILES FROM BAKCUP FOLDER
  .
  .
  .
  'MAKE A BACKUP OF THE FILE BEFORE IT IS KILLED
  FileCopy(strfilename & "\" & dirfilename, strfilename & "\backUP\.")
  Kill(strfilename & "\" & dirfilename)
End Sub

我没有进行任何错误处理,但请做好帮助。

已修改

我相信你在Dir sub中使用update_Emails函数。请参阅下文,了解Dir的工作原理摘要。
 1. Dir(<dir_name or file_match_string>) - &gt;这会将Dir状态重置为从开始列出文件  2.对Dir()的后续调用将列出从步骤 1 收集的列表中的下一个文件
 3.当{em> 2 中没有其他文件要返回时,Dir会返回空字符串一次  4. Dir将在 3 之后超出范围,并且会在您再次执行 1 之前抛出错误

如果您在1函数调用的任何阶段执行步骤Dir(),那么您将状态重置为从开始列出文件(实质上是您打扰状态{如果您在Dir Sub中随时致电main,请Dir(<dir_name>) Sub {1}}

我相信您必须在另一个update_EmailsDir Sub)的中间重新使用update_Emails(在Dir Sub内),所以我会在下面执行: -

解决方案三

main