基本上有两个问题:
对于excel的.sort函数:当我不知道给定工作表有多少个键(标题)时,如何添加键?(见下文)
我想传递一些预定义数组,其中包含有关如何对给定选择进行排序的信息,以及excel的.sort算法......如何正确执行此操作?
问题描述:
我有一张列出第一行标题的表格。标题是不同的名称,第一行中可以存在可变数量的标题。标题描述了工作表下方行中列出的指标的不同细节(一个指标/行)。
我需要编写一个代码,以便我可以对某些绑定在一起的行进行排序,而不是整个表单。例如,我可能需要排序第28至第35行。这将通过变量 inRange 传递给此程序。但是,我还希望能够配置排序优先级以及每次运行宏时每个列的排序方式。(请注意,一行只能更改整个位置,行中的单个单元格不能改变立场)
我有以下描述标题的全局数组:
headRow - 包含一个标题名称数组,作为按列顺序列出的字符串
prLst - 包含一个整数数组(作为字符串输入),用于确定每个标头的优先级。数组中整数的位置是它们描述的列号。
colIsString - 包含布尔值,确定给定列中列出的项是字符串还是整数。 True = string,False = Integer。同样,数组中布尔值的位置是他们描述的列号。
sortOrder - 包含指定排序方向的布尔值。 “真实” - 提升。 “假” - 下降。然而,阵列中布尔值的位置位置是他们描述的列号。***
数组中的数据已经建立,我有以下代码将这些数组提供给.sort:
Dim numHdrs, finalNumHdrs, count As Integer, newArray As Variant
For numHdrs = 1 To UBound(headRow)
If colIsString(numHdrs) = True Then
sortOrder(numHdrs) = xlAscending
ElseIf colIsString(numHdrs) = False Then
sortOrder(numHdrs) = xlDescending
End If
Next numHdrs
newArray = CombineArrays(headRow, prLst, sortOrder)
For finalNumHdrs = 1 To UBound(headRow)
If headRow(finalNumHdrs) And prLst(finalNumHdrs) And sortOrder(finalNumHdrs) <> "N/A" Then
'ActiveSheet.Sort.SortFields.Add Key(headRow(finalNumHdrs)):= finalNumHdrs
'ActiveSheet.Sort.SortFields.Add Order(finalNumHdrs):=sortOrder(finalNumHdrs)
End If
Next finalNumHdrs
With ActiveSheet.Sort
.SetRange inRange
.Apply
End With
我无法使用数组中的数据正确添加排序字段:
'ActiveSheet.Sort.SortFields.Add Key(headRow(finalNumHdrs)):= finalNumHdrs
'ActiveSheet.Sort.SortFields.Add Order(finalNumHdrs):=sortOrder(finalNumHdrs)
这显然不正确。所以我创建了一个连接 headRow,prLst,和 sortOrder 的函数,以便更容易地输入.sort:
Function CombineArrays(arr1 As Variant, arr2 As Variant, arr3 As Variant)
Dim arr4 As Variant
ReDim arr4(1 To UBound(arr2), 1 To 2)
Dim i, j As Integer
For i = 0 To UBound(arr1)
arr4(arr2(i), 1) = arr1(i)
arr4(arr2(i), 2) = arr3(i)
Next i
CombineArrays = arr4
End Function
由于arr2指定了给定列的排序优先级,我需要以arr2指定密钥号的方式将其提供给.sort。如果arr2 = 3,则key3:= arr4(3,1),order3:= arr4(3,2)。我假设我的元素到arr4的顺序无关紧要。 (如果我在arr4(3,1)之前添加arr4(4,1),它们仍将以适当的顺序列出)
这归结为两个问题:
对于excel的.sort函数:当我不知道给定工作表有多少个键(标题)时,如何添加键?
我这样做是否正确?
***注意如果我之前听说过它,我会使用收集对象。但是,由于我是VBA的新手,这就是我建立该计划的方式。考虑到我已编写的代码返回并将所有数组更改为集合对象,这将太难了。
注意:这是较大程序的一部分,其描述可在此处找到:Sorting Groups of Rows Excel VBA Macro
答案 0 :(得分:2)
我认为你期望sort方法接受一个排序键和命令的数组,它不能做。排序限制为最多3个排序列(就像在用户界面中一样)
你需要利用这个技巧,你可以通过从最不重要的一个到最重要的一个列逐列地完成相同的排序结果。下一个代码是不完整的,并不完全是您所需要的,但旨在解释一般的想法
' Assuming you have some array which lists the order in which to sort from most important to least important named priorityArr
For i = UBound(priortyArr) To LBound(prioryArr)
ActiveSheet.Sort.SortFields.Add Key:= headRow(i) Order:=sortOrder(i)
' do the rest you need to do and apply the sort
Next