对工作簿中的所有工作表进行排序

时间:2017-03-29 20:25:24

标签: excel vba excel-vba sorting copy

我有这个代码实际上完全符合我的要求:

转到特定范围,将表复制到新范围并重新排序表。

以下是代码:

t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t = t.in_time_zone("America/New_York").at_end_of_day
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
Model.where("created_at > ?", t - 24.hours)

问题是:代码在所有工作表中都不起作用,它在第一个工作表中重复了n次。

2 个答案:

答案 0 :(得分:8)

您永远不会告诉代码转到下一个工作表。此外,您的选择看起来不必要。

 Sub copy_paste_sort()

Dim oneRange As Range
Dim aCell As Range
Dim WS_Count As Integer
Dim I As Integer

         ' Set WS_Count equal to the number of worksheets in the active
         ' workbook.
WS_Count = ActiveWorkbook.Worksheets.Count

         ' Begin the loop.
    For I = 1 To WS_Count

Set oneRange = worksheets(I).Range("CZ269:DA294")
Set aCell = worksheets(I).Range("DA269")

worksheets(I).Range("CW269:CX294").Copy  worksheets(I).Range("CZ269:DA294")

oneRange.Sort Key1:=aCell, Order1:=xlDescending, Header:=xlNo


    Next I

End Sub

此外 - 由于您正在对范围进行排序,我猜它包含值而不是公式。如果是这种情况,您可以替换

worksheets(I).Range("CW269:CX294").Copy worksheets(I).Range("CZ269:DA294")

worksheets(I).Range("CZ269:DA294").Value = worksheets(I).Range("CW269:CX294").Value

这样做的好处是它稍快,并且不使用剪贴板。

答案 1 :(得分:2)

试一试,

Sub copy_paste_sort()

    Dim I As Long

    ' Begin the loop.
    For I = 1 To ActiveWorkbook.Worksheets.Count
        With Worksheets(I)

            With .Range("CW269:CX294")
                .Copy destination:=.Range("CZ269")
                .Offset(0, 3).Cells.Sort Key1:=aCell, Order1:=xlDescending, Header:=xlNo
            End With
        End With
    Next I


End Sub

您正在循环I作为工作单的索引编号,但没有对其执行任何操作。 With Worksheets(I) ... End With依次引用eac h工作表。请注意,Range(...)变为.Range(...),以便它知道哪个工作表是其父级。