我遇到了一个问题,Excel 中使用 VBA 的自定义排序宏在我的计算机上运行良好,但在同事的计算机上执行时无法正确排序。我们在两台不同的计算机上处理同一个文件。该宏应该根据同一工作簿中另一个工作表中定义的自定义顺序对一系列单元格进行排序。
在我的计算机上,数据按预期根据自定义列表进行排序。但是,当同事在其计算机上触发相同的宏时,数据会按字母顺序排序,而不是按照自定义列表排序。
以下几点高水平要点:
下面是排序的代码:
Set ws = ThisWorkbook.Sheets("Submitted to Business")
Set rulesWs = ThisWorkbook.Sheets("Rules")
' Searching for the last row in...
ruleLastRow = rulesWs.Cells(rulesWs.Rows.Count, "A").End(xlUp).Row ' Rules
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' Submitted to Business
' Set the range in Rules sheet
Set rng = rulesWs.Range("A2:A" & ruleLastRow)
' Set the range in Submitted to Business sheet
Set r = ws.Range("A2", ws.Cells(lastRow, Table.ListColumns.Count))
' Apply the sort
r.Sort Key1:=ws.Range("B1"), Order1:=xlAscending, OrderCustom:=Application.CustomListCount + 1, Header:=xlYes
正如您从自己编写的代码中肯定了解到的那样,自定义列表是应用程序的属性,而不是工作簿的属性。它不会与
.xls*
文件一起跨计算机/Windows 帐户传送,并且一旦在计算机上创建,即使在 Excel 关闭后它也可以保留。有了这些知识,就可以很容易地确定传递给
OrderCustom
的参数应该是对函数的调用。该函数会查找您为自己创建的自定义订单的特定索引,如果丢失,则会在目标计算机上创建它。
我让您重命名以下函数并定义顺序。请注意,该函数添加了所需的 1(与您在
OrderCustom:=Application.CustomListCount + 1
本身中添加的内容相同)
Function MyCustomOrder_RenameThisFunction() As Integer
Dim result As Integer, customOrder As Variant
customOrder = Array("B", "C", "A")
result = Application.GetCustomListNum(customOrder)
If result <= 0 Then
Application.AddCustomList ListArray:=customOrder
result = Application.GetCustomListNum(customOrder)
End If
MyCustomOrder_RenameThisFunction = result + 1
End Function