比较目录中的文件

时间:2017-07-11 16:44:56

标签: vba

在下面的代码中,我尝试将第一个(old)文件夹中的Word文档与第二个(new)文件夹中的修订版本进行比较,并将比较文档保存为第三个({ {1}})文件夹。代码运行得非常好,现在编译并且没有运行时错误。

但是,在运行它之后,只有一个比较文件被保存到第三个文件夹,即,即使每个文件夹中有三个文件,也只比较每个文件夹中的第一个文件并保存在第三个文件夹中。此外,第三个(result)文件夹中保存的文件未被打开,同时声明该文件存在一些问题。

任何建议或想法如何解决此问题?

result

2 个答案:

答案 0 :(得分:1)

您的代码中没有任何内容让我感到震惊,因为#34;这可能无法正常工作"。但是我确实有建议使代码更容易调试/维护。

ABC的命名完全令人烦恼并且使代码很难遵循 - 我发现自己经常回顾他们被分配以记住他们所代表的内容。命名很难,但值得。还要考虑将变量声明为更接近其第一次使用/赋值,因此从上到下顺利读取代码:

Dim pathOld As String
pathOld = "C:\Users\Rock\Desktop\old\"

Dim pathNew As String
pathNew = "C:\Users\Rock\Desktop\new\"

Dim pathResult As String
pathResult = "C:\Users\Rock\Desktop\result\"

考虑使它们成为常量,和/或使用%USERPROFILE%\Desktop而不是硬编码特定用户。

与文档对象同上:

Dim docOld As Word.Document
Dim docNew As Word.Document
Dim docResult As Word.Document

您正在致电"文件规范"实际上是一个"文件过滤器"由通配符和文件扩展名组成。

Const fileExtension As String = ".docx"
Const fileFilter As String = "*" & fileExtension

请注意我也使用匈牙利表示法 - 我使用匈牙利表示法一直用于的方式来描述种类数据类型相反,当你面前有声明时,这是无用的噪音)。 "路径"变量都描述了路径和" doc"变量都是指文档对象。有关错误代码看错的所有详细信息,请阅读this excellent article

您实际上可以完全删除result文档对象,方法是将一些循环体添加到自己的函数中,并使用With块:

Dim currentFileName As String
currentFileName = Dir(pathOld & fileFilter)

Do While currentFileName <> vbNullString
    Set docOld = Application.Documents.Open(pathOld & currentFileName)
    Set docNew = Application.Documents.Open(pathNew & currentFileName)
    With CompareDocuments(docOld, docNew)
        .SaveAs FileName:=pathResult & currentFileName
        .Close
    End With
    currentFileName = Dir
Loop

我可能是错的(VBA对象生命周期管理有它的怪癖),但最后两个Set语句似乎没有用......我将删除它们。

Private Function CompareDocuments(ByVal docOld As Word.Document, ByVal docNew As Word.Document) As Word.Document
    'if we're given null references, break here and debug:
    Debug.Assert docOld Is Not Nothing And docNew Is Not Nothing

    Application.CompareDocuments _
        OriginalDocument:=docOld, _
        RevisedDocument:=docNew, _
        Destination:=wdCompareDestinationNew
    docOld.Close
    docNew.Close

    'if there's no active document, something has gone wrong. break and debug:
    Debug.Assert Application.ActiveDocument Is Not Nothing
    Set CompareDocuments = Application.ActiveDocument
End Function

答案 1 :(得分:0)

请参阅以下链接。我认为这会做你想要的,或者至少,它会让你非常接近你需要的地方。

http://learnexcelmacro.com/wp/2011/11/how-to-get-list-of-all-files-in-a-folder-and-sub-folders/

enter image description here