自定义排序在本地有效,但在其他用户的共享文档上失败

问题描述 投票:0回答:1

我遇到了一个问题,Excel 中使用 VBA 的自定义排序宏在我的计算机上运行良好,但在同事的计算机上执行时无法正确排序。我们在两台不同的计算机上处理同一个文件。该宏应该根据同一工作簿中另一个工作表中定义的自定义顺序对一系列单元格进行排序。

在我的计算机上,数据按预期根据自定义列表进行排序。但是,当同事在其计算机上触发相同的宏时,数据会按字母顺序排序,而不是按照自定义列表排序。

以下几点高水平要点:

  • 工作簿在具有可能不同 Excel 版本的不同计算机上共享和使用。
  • 宏安全设置配置为允许宏在所有计算机上运行。
  • 自定义列表存储在工作簿中,宏读取此列表以执行排序。
  • 即使我们在同一个文档中工作并且不依赖 Excel 的内置自定义列表功能,问题仍然存在。

下面是排序的代码:

    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

excel vba sorting
1个回答
0
投票

正如您从自己编写的代码中肯定了解到的那样,自定义列表是应用程序的属性,而不是工作簿的属性。它不会与

.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
© www.soinside.com 2019 - 2024. All rights reserved.