【发布时间】:2015-01-27 13:05:11
【问题描述】:
我正在使用下面的代码来尝试遍历文件夹中的大量 Excel 工作表。我希望代码打开文件,按字母顺序排序,然后进行自定义排序,然后将所有内容复制粘贴到新工作表中。就其本身而言,如果我在打开的工作表上运行它,排序就可以完美运行。但是,在下面的循环内部,没有任何排序,因为它将未排序的值粘贴到新工作表中。需要明确的是,将所有内容放在一张纸上的循环是有效的,排序部分是有效的。只有将它们放在一起时,排序才会停止。我认为问题在于我的代码正在尝试对 ThisWorkbook 进行排序,而不是对刚刚打开的工作表进行排序,尽管我不确定为什么。我对 VBA 非常陌生。
Sub MergeFiles()
Dim bookList As Workbook
Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object
Application.ScreenUpdating = False
Set mergeObj = CreateObject("Scripting.FileSystemObject")
Set dirObj = mergeObj.Getfolder("PATH")
Set filesObj = dirObj.Files
For Each everyObj In filesObj
Set bookList = Workbooks.Open(everyObj)
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add _
Key:=Range("A1:ER1"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange Range("A1:ER195")
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add _
Key:=Range("A1:ER1"), SortOn:=xlSortOnValues, Order:=xlAscending, _
CustomOrder:="thing1,thing2,thing3", _
DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange Range("A1:ER195")
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
Range("A2:ES" & Range("A196").End(xlUp).Row).Copy
ThisWorkbook.Worksheets(1).Activate
Range("A10000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
Application.CutCopyMode = False
bookList.Close
Next
End Sub
【问题讨论】:
-
a) 是否需要 Excel 来猜测是否有表头?那肯定是
xlYes或xlNo通过循环吗? b) 您能否确认您要排序xlLeftToRight而不是xlTopToBottom?我只问后者,因为它几乎从未使用过。 c)A1:ER195是静态区域还是或多或少取决于工作簿/工作表? d) 您使用工作簿中的哪个工作表作为来源?表 1?