在Excel中排序保持风格?

时间:2014-05-08 15:36:54

标签: excel vba sorting

我有一个excel文件,背景交替,以提高可读性。

Row 1: White Background
Row 2: Gray Background
Row 3: White Backgrund
[...]

我使用VBA函数对Excel文件的内容进行排序,单击按钮抛出事件:

Sub SortByName()
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range("BO6:BO1024"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=Range("D6:D1024"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("A6:DD1024")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

排序工作正常,就像我想要的那样,但是Backgroundstyle也随着内容移动,这会破坏交替的风格,如:

Row 1: White (was row 3)
Row 2: White (was row 1)
Row 3: Gray  (was row 2)
[...]

有没有办法在没有复制样式的情况下对内容进行排序?

1 个答案:

答案 0 :(得分:2)

我承认这是一个黑客攻击,但下面会有效。它正在进行"修复格式化"一次只有一个单元格 - 大概你可以改变它来完成整行

Sub sortNoFormat()
Dim r As Range
Dim f()    ' a place to keep the formatting
Dim ii As Integer
Dim c

' set up the sort:
Set r = Range("tosort")
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=r, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

' before sorting, copy the format (color) of each cell to array f:
ReDim f(1 To r.Cells.Count)
ii = 1
For Each c In r.Cells
    f(ii) = c.Interior.ColorIndex
    ii = ii + 1
Next

' Perform the sort:
With ActiveSheet.Sort
    .SetRange r
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

' apply the old formatting:
ii = 1
For Each c In r.Cells
  c.Interior.ColorIndex = f(ii)
  ii = ii + 1
Next

End Sub

我相信很容易看出如何创建一些辅助函数 - formats = copyFormats(range)pasteformats(range, formats),这些函数会使代码更具模块性和可读性。这将把我在上面添加的一些行封装在一个简单的包装器中,这样你的原始代码只需要两行(以及辅助模块中的两个函数)。