我有一个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)
[...]
有没有办法在没有复制样式的情况下对内容进行排序?
答案 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)
,这些函数会使代码更具模块性和可读性。这将把我在上面添加的一些行封装在一个简单的包装器中,这样你的原始代码只需要两行(以及辅助模块中的两个函数)。