我确信有一个帖子涵盖了这个,我只是没有找到它,所以对任何转发道歉。
我在一张纸上有一系列数据。我有一个动态列表,我需要在另一个工作表上按自定义排序对数据进行排序。我试图找出如何根据第二张数据创建一个自定义排序列表来从Sheet 1中排序数据。我能够想出的最接近的是定义28种排序并将它们分配给变量。然而,列表实际上从未排序
CustomOrder:= _
"FC1 , FC2,FC3,FC4,FC5,Fc6,FC7,FC8,FC9,FC10,FC11,FC12,FC13,FC14,FC15,FC16,FC17,FC18,FC19,FC20,FC21,FC22,FC23,FC24,FC25,FC26,FC27,FC28" _
在我的调试尝试中,我怀疑我的问题源于这一行:
{{1}}
Array将每个变量识别为其值。但是,自定义订单不会。我假设,因为它在引号中,并且看起来像一个字符串。
答案 0 :(得分:1)
如果您要将28个变量命名为1到28,则应该创建一个数组。然后你可以将它传递给ListArray参数。
现在,我们可以解决CustomOrder是一个可以接受字符串或整数的变体这一事实。似乎没有人知道为什么因为这个属性缺少M $文档。从我可以看出,下面的代码将起作用,因为我们添加了一个新的自定义列表,然后我们通过引用总列表的数量作为CustomOrder来选择最后一个。
Option Explicit
Sub CustomSort()
Application.CutCopyMode = False
Dim FC(1 to 28) As String
PopulateFCValues() ' This is an imaginary sub that populates the FC Array
Application.AddCustomList ListArray:=FC
Dim sortNum As Long
sortNum = Application.CustomListCount
ActiveWorkbook.Worksheets("Pick List").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Pick List").Sort.SortFields.Add Key:=Range("F2:F300000"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=sortNum, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Pick List").Sort
.SetRange Range("A1:V300000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
答案 1 :(得分:1)
假设这28个变量保持您的自定义排序顺序,您想要的是从这些标识符所持有的值中创建一个字符串。
CustomOrder:= _ "FC1 , FC2,FC3,FC4,FC5,Fc6,FC7,FC8,FC9,FC10,FC11,FC12,FC13,FC14,FC15,FC16,FC17,FC18,FC19,FC20,FC21,FC22,FC23,FC24,FC25,FC26,FC27,FC28"
那是用标识符自己制作一个字符串 - 现在你的直觉是正确的。
因此,不要将28个变量重新列入字符串文字,而是使用设置CustomOrder
索引的HackSlash's answer部分:
CustomOrder:=Application.CustomListCount
只要最后添加的自定义列表是您刚刚定义和添加的自定义列表,那就应该有效。
所以:
Application.AddCustomList _
ListArray:=Array(FC1, FC2, FC3, FC4, FC5, FC6, FC7, _
FC8, FC9, FC10, FC11, FC12, FC13, FC14, _
FC15, FC16, FC17, FC18, FC19, FC20, FC21, _
FC22, FC23, FC24, FC25, FC26, FC27, FC28)
Dim pickList As Worksheet
Set pickList = ActiveWorkbook.Worksheets("Pick List")
pickList.Sort.SortFields.Clear
pickList.Sort.SortFields.Add _
Key:=pickList.Range("F2:F300000"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
CustomOrder:=Application.CustomListCount, _
DataOption:=xlSortNormal
With pickList.Sort
.SetRange pickList.Range("A1:V300000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
那就是说,有28个基本上具有相同名称和数字后缀的变量是代码气味请求数据结构:而不是28个变量,你应该有一个变量,包含一个28个插槽的一维数组。
Dim fcValues(1 To 28)
fcValues(1) = "the value you gave to FC1"
fcValues(2) = "the value you gave to FC2"
'...
fcValues(28) = "the value you gave to FC28"
如果变量的值来自工作表,那么它更容易(假设单列sourceRange
):
Dim fcValues As Variant
fcValues = Application.Transpose(sourceRange.Value)
这样的数组可以按原样传递给ListArray
的{{1}}参数:
AddCustomList