你说的应该就是我的问题,在引入customOrder之前我目前的排序是混乱的,一旦有0就会放在前面,但我需要实现的是先负数从小到大,再0,再正数从小到大。请问应该怎么修改代码?或者应该怎么转换为数组?
时间: 2024-09-16 22:05:17 浏览: 33
确实,根据您的描述,您想要改变排序规则为先负数(小于0),接着是0,最后是正数(大于0)。您可以直接调整`customOrder`变量的内容。这里是一个简单的示例,展示如何创建这个自定义排序顺序:
```vba
Dim customOrder As String
customOrder = "[<0];0;[>=0]"
' 这里的 "<0>" 表示小于0,"[>=0]" 表示大于等于0,注意需要加方括号包围条件。
ws.Range("D2:F" & LastRow).Sort Key1:=ws.Range("F2:F" & LastRow), _
Order1:=xlAscending, Header:=xlYes, MatchCase:=False, _
Orientation:=xlTopToBottom, OrderCustom:=customOrder
```
这表示将所有小于0的值排在最前,然后是0,之后是所有非负值(包含0)。
至于转换为数组,VBA其实并不推荐这种方式来排序,因为它复杂且容易出错。但是如果你想尝试的话,可以这样做:
```vba
Dim sortArray() As Variant
ReDim sortArray(LastRow - 2) As Variant ' 减去1是因为数组下标从0开始
For i = 2 To LastRow
If ws.Cells(i, 6).Value < 0 Then
sortArray(i - 2) = ws.Cells(i, 6).Value '<- 负数
ElseIf ws.Cells(i, 6).Value = 0 Then
sortArray(i - 1) = ws.Cells(i, 6).Value '<- 0
Else
sortArray(i) = ws.Cells(i, 6).Value '<- 正数
End If
Next i
' 然后你可以使用Application.WorksheetFunction.Sort或其他方法对这个数组进行排序,然后再应用到原数据上
```
请注意,这种方法比较繁琐,且可能会降低效率。在实际应用中,建议保持使用自定义排序规则的方式。
阅读全文