我有3个一维数组。 每个包含与其他2个数组相对应的信息。 例如,阵列1包含客户名 数组2包含客户的姓氏 阵列3包含客户电话号码。
这不是我的实际例子,但最容易解释。 如何对所有三个数组进行排序,以便按照客户姓氏的顺序对它们进行排序。 如果史密斯先生已经排序并且从姓名阵列中的位置10移动到位置5,我希望他的电话号码和名字也在相应阵列中的第5位。
我正在处理包含10,000个项目的数组,所以我想避免循环(我当前的方法),因为这非常慢。
希望使用array.sort方法。
有人可以帮助我吗?
好的 - 所以我尝试使用新的数据类型,但我仍然不知道如何使用它立即过滤。下面是我的示例代码,它有几个问题。如果有人可以解决 - 它很想知道你是如何做到的。
代码的目的是返回包含分组问题的数组。 为简单起见,我在示例中假设找到的每个常量都是一个问题。 如果发现问题,请将其与同一工作表上的其他问题结合使用。 例如,在表1中的单元格A1和A2中找到数字2.该数组应返回A1:A2。 如果在表1中的A1和表2中的A2中找到问题,则将返回两个单独的数组条目。
Public Type Issues
ws_Sheet As Integer
rng_Range As String
s_Formula As String
s_Combined As String
d_ItemCount As Double
End Type
Sub IssuesFound()
Dim MyIssues() As Issues
Dim i_SheetCount As Integer
Dim s_Formula As String
Dim rng_Range As Range
Dim d_IssueCounter As Double
Dim s_SearchFor As String
Dim a_TempArray() As Issues
Dim d_InsertCounter As Double
d_IssueCounter = -1
' Loop All Sheets Using A Counter Rather Than For Each
For i_SheetCount = 1 To ActiveWorkbook.Sheets.Count
' Loop all Constants On Worksheet
For Each rng_Range In Sheets(i_SheetCount).Cells.SpecialCells(xlCellTypeConstants, 23)
If d_IssueCounter = -1 Then
' First Time and Issue Is Found, Start Recording In An Array
d_IssueCounter = d_IssueCounter + 1
ReDim MyIssues(0)
MyIssues(0).ws_Sheet = i_SheetCount
MyIssues(0).rng_Range = rng_Range.AddressLocal
MyIssues(0).s_Formula = rng_Range.Value
MyIssues(0).s_Combined = i_SheetCount & "#" & rng_Range.Value
MyIssues(0).d_ItemCount = 0
Else
' Going To Look For Issues Found On The Same Sheet with The Same Constant Value
s_SearchFor = i_SheetCount & "#" & rng_Range.Value
' HELP HERE: Need To Ideally Return Whether The Above Search Term Exists In The Array
' Without looping, and I want to return the position in the array if the item is found
a_TempArray = MyIssues 'Filter(MyIssues.s_Combined, s_SearchFor, True, vbTextCompare)
If IsVarArrayEmpty(a_TempArray) = True Then
' New Issue Found - Increase Counter By + 1
d_IssueCounter = d_IssueCounter + 1
' Increase The Array By 1
ReDim Preserve MyIssues(d_IssueCounter)
' Record The Information About The Constant Found. Sheet Number, Constant, Range, and also a combined string for searching and the array position
MyIssues(0).ws_Sheet = i_SheetCount
MyIssues(0).rng_Range = rng_Range.AddressLocal
MyIssues(0).s_Formula = rng_Range.Value
MyIssues(0).s_Combined = i_SheetCount & "#" & rng_Range.Value
MyIssues(0).d_ItemCount = 0
Else
' Get The Array Position Where Other Issues With The Same Worksheet and Constant are Stored
d_InsertCounter = a_TempArray.d_ItemCount
' Add The New Found Constant To The Range Already Containing The Same Constants on This Worksheet
MyIssues(d_InsertCounter).rng_Range = Union(rng_Range, Range(MyIssues(d_InsertCounter).rng_Range)).AddressLocal
End If
End If
Next
Next
End Sub
Function IsVarArrayEmpty(ByRef anArray As Issues)
Dim i As Integer
On Error Resume Next
i = UBound(anArray, 1)
If Err.Number = 0 Then
IsVarArrayEmpty = False
Else
IsVarArrayEmpty = True
End If
End Function
答案 0 :(得分:2)
根据建议,您根本不应该使用并发数组。您应该定义具有三个属性的类型,然后创建该类型的单个数组或集合。
要回答你的问题,没有办法对三个阵列进行排序,但有一种方法可以对两个阵列进行排序。这意味着您可以创建要用作键的数组的副本,然后使用该副本对其中一个数组进行排序,将原始数据排序为另一个数组。查看带有两个数组作为参数的Array.Copy重载的文档。
也就是说,复制数组然后再进行两次排序是一个很大的开销,所以你可能从这个方法中获得的收益不大。最好是首先以正确的方式进行,即使用复杂类型的单个数组而不是简单类型的并发数组。毕竟,它不再是1960年了。