【问题标题】:VBA loop for calling files in a folder用于调用文件夹中文件的 VBA 循环
【发布时间】:2015-04-22 03:04:28
【问题描述】:

我正在尝试创建一个比较文本文件的宏。但是,我需要一个循环来比较文件夹中的所有文件。

例如,我现在只比较 template1 和 spool1 的宏。 我需要一个循环来比较 template1 和 spool1 .. template2 和 spool2 等。关于如何做到这一点的任何想法?

我想我必须先将文件添加到集合中,然后再调用它。不过我不确定。

这是我的代码

ChangeFileOpenDirectory "D:\Users\tmp4jj\Desktop\ComparisonTool\"
Dim template1 As Word.Document
Dim spool1 As Word.Document
Set template1 = Documents.Open("D:\Users\tmp4jj\Desktop\ComparisonTool\template1.docx")
Set spool1 = Documents.Open("D:\Users\tmp4jj\Desktop\ComparisonTool\spool1.txt")

Application.CompareDocuments OriginalDocument:=Documents("template1.docx") _
    , RevisedDocument:=Documents("spool1.txt"), Destination:= _
    wdCompareDestinationNew, Granularity:=wdGranularityWordLevel, _
    CompareFormatting:=False, CompareCaseChanges:=True, CompareWhitespace:= _
    False, CompareTables:=True, CompareHeaders:=True, CompareFootnotes:=True, _
     CompareTextboxes:=True, CompareFields:=True, CompareComments:=True, _
    CompareMoves:=False, RevisedAuthor:="UOB", IgnoreAllComparisonWarnings:= _
    False

提前致谢,因为我是编码新手!

【问题讨论】:

  • templateX.docx 和 spoolX.txt 是否总是相互对应,还是需要检查所有组合?否则它工作吗?
  • 是的,它们确实相互对应。例如,我需要将 templateX 与 spoolX 进行比较,将 templateY 与 spoolY 进行比较。我现在的宏只比较一对文档,我需要一个循环来遍历整个文件夹。
  • Loop comparison macro 的可能重复项

标签: vba loops ms-word


【解决方案1】:

如果文件名始终对应,您可以使用带通配符的 Dir$() 函数来查找其中一个或另一个,然后根据结果构建另一个文件名。 Dir$() 在后续调用中返回下一个结果,然后在返回所有文件时返回一个空字符串。这使得构建循环变得容易:

ChangeFileOpenDirectory "D:\...\ComparisonTool\"
Dim template_doc As Word.Document
Dim spool_doc As Word.Document

Dim spool As String
Dim templ As String
spool = Dir$("D:\...\ComparisonTool\spool*.txt")
Do While spool <> vbNullString
    templ = "template" & Left$(Left$(Right$(spool, Len(spool) - 5), _
            Len(spool) - 4), Len(spool) - 9) & ".docx"
    Set template_doc = Documents.Open("D:\...\ComparisonTool\" & templ)
    Set spool_doc = Documents.Open("D:\...\ComparisonTool\" & spool)

    Application.CompareDocuments OriginalDocument:=Documents(templ) _
        , RevisedDocument:=Documents(spool), Destination:= _
        wdCompareDestinationNew, Granularity:=wdGranularityWordLevel, _
        CompareFormatting:=False, CompareCaseChanges:=True, _
        CompareWhitespace:=False, CompareTables:=True, CompareHeaders:=True, _
        CompareFootnotes:=True, CompareTextboxes:=True, CompareFields:=True, _
        CompareComments:=True, CompareMoves:=False, RevisedAuthor:="UOB", _
        IgnoreAllComparisonWarnings:=False

    spool = Dir$
Loop

注意:我缩短了目录名称以消除侧滚动 - 您需要将它们替换为实际的目录路径。

【讨论】:

  • 抱歉,spool* 应该保持这种状态吗?还应该将模板改回模板对吗?我对此很陌生,所以如果我提出明显的问题,我深表歉意。当我将模板改回模板时,从 Application.Compare 文档开始的代码行出现错误。
  • 另外,我将 Dim template_doc As Word.Document 更改为 Dim template_doc As Documents。同样对于假脱机一,假脱机文件实际上是 .txt 文件。这有什么影响吗?非常感谢您的帮助,共产国际!
  • @JunJie - 是的。这就像在控制台窗口中输入 Dir spool*.txt 一样。 templ是匹配文件名进入的变量名。
  • @JunJie - 您需要保留As Document 原样。 Document 是变量的对象类型。您应该从上面发布的代码中更改的唯一一件事是将"D:\...\ComparisonTool\" 替换为原始"D:\Users\tmp4jj\Desktop\ComparisonTool\"
  • 将模板文件读取为 .txt 文件时出现错误。只有假脱机文件在 .txt 中,而模板文件在 .docx 中。错误在于这一行:“Set template_doc = Documents.Open("D:\Users\tmp4jj\Desktop\ComparisonTool\" & templ)”有什么办法可以解决这个问题吗??
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多