在下面的代码中,我尝试将第一个(old
)文件夹中的Word文档与第二个(new
)文件夹中的修订版本进行比较,并将比较文档保存为第三个({ {1}})文件夹。代码运行得非常好,现在编译并且没有运行时错误。
但是,在运行它之后,只有一个比较文件被保存到第三个文件夹,即,即使每个文件夹中有三个文件,也只比较每个文件夹中的第一个文件并保存在第三个文件夹中。此外,第三个(result
)文件夹中保存的文件未被打开,同时声明该文件存在一些问题。
任何建议或想法如何解决此问题?
result
答案 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/