提问人:Christopher Costabile 提问时间:11/17/2023 最后编辑:braXChristopher Costabile 更新时间:11/18/2023 访问量:96
有没有办法使用Excel和VBA对非空白连续单元格(即任意选择的范围)进行排序?
Is there a way to sort a selection of non blank contiguous cells (i.e. an arbitrarily selected range) using Excel & VBA?
问:
我的Excel文档被用作金属熔化文档。它用于混合各种合金。在制作熔体时,我们将选择行并为行着色,以指示选择熔体的材料。我有 5 个工作按钮,这是我们在任何时候都可以打开的熔体限制。我还有一个排序按钮和一个空白按钮,用于在处理金属后从单元格中删除颜色。消隐按钮还将从突出显示的单元格中删除数据。
我的问题在于,我可以使用 Excel 的自定义排序功能进行排序,但是,它从用户那里获取输入并将其应用于定义的范围。当用户选择下一组范围时,这些输入将被删除。
我的排序函数旨在首先按单元格颜色按黄色、蓝色、绿色、紫色和深蓝色的顺序排序,然后对标识列单元格值进行排序。目前,我的排序按钮适用于单列。我希望行中的数据随标识列一起移动。
所有文档的 VBA 脚本都位于一个模块中,附在下面。
New_macro() - New_macro6() 用于着色单元格,6 用于着色 None 和清除单元格。
ColourSort() 是不起作用的排序函数 - 错误在这里 -
我不想对列的整个长度进行排序,因为底部有一个计数行......
Sub New_macro()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.Color = RGB(255, 192, 0)
End Sub
Sub New_macro2()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.Color = RGB(0, 176, 240)
End Sub
Sub New_macro3()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.Color = RGB(146, 208, 80)
End Sub
Sub New_macro4()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.Color = RGB(122, 48, 160)
End Sub
Sub New_macro5()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.Color = RGB(0, 112, 192)
End Sub
Sub New_macro6()
Dim myRange As Range
Set myRange = Selection
Selection.Interior.ColorIndex = xlNone
Selection.Clear
End Sub
Sub ColourSort()
Dim myRange As Range
Set myRange = Selection
myRange.Select
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255, _
192, 0)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
, 240)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(146, _
208, 80)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(122, 48 _
, 160)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 112 _
, 192)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Selection() _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.ActiveSheet.Sort
.SetRange Selection
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
答:
我认为用 .我认为 your 的键应该表示数据排序的单个列。SortFields.Add(Selection, ...)
SortFields.Add
例如:
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Selection() _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
应该说更像
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Range("A3:A13") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
评论
我已经弄清楚出了什么问题。
初始宏:
Range("A3:C12").Select
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255, _
192, 0)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
, 240)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(146, _
208, 80)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(122, 48 _
, 160)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 112 _
, 192)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Range("A3:A12") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.ActiveSheet.Sort
.SetRange Range("A3:C12")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
可以看出,开头的范围是“A3:C12”。用于排序的范围仅引用 A 列,即“A3:A12”。因此,如果我们用 myRange.Columns(1) 替换 Selection,我的代码将起作用,这就是我所做的,它起作用了。这是有道理的,因为一个人只对一列进行排序,因此只需要第 1 列,我的代码试图按所有列对行进行排序,从而产生错误。
评论