【发布时间】:2021-01-06 20:28:47
【问题描述】:
我有很多招聘数据,我想使用数组重新排列、分离和修改。数据包括每个候选人的第一阶段、第二阶段和第三阶段面试的所有信息。这个想法是将每个阶段分开到自己的工作表上(例如面试 1、面试 2、面试 3)。然后还要创建一个表格,其中包含每个候选人的所有三个阶段的信息。
首先,我通过将范围 ("A1:AV10000") 声明为变量来创建所有数据的数组。
然后我创建了一个循环来遍历这些数据,并使用循环中的 IF 函数将发生的每种类型的事件分离到它们自己的数组中。如果满足条件,则创建一个新数组并将满足条件的每一行添加到数组中。
但是,我相信我的数组正在制作成 3D 数组,并且我确定如何编辑代码以使其保持 2Darray。我理解为什么代码可能会创建 3D 数组(由于在循环中迭代 1),但是我不确定如何编写代码,以便它包含该行的所有数据并且只迭代如下所示。
例如目前它是 (1)(1,1),(1)(1,2) 然后是 (2)(1,1),(2)(1,2) 然后是 (3)(1,1),(3 )(1,2)。 我认为如果它是(1,1)(1,2)然后是(2,1)(2,2)然后是(3,1)(3,2),它会起作用。 Screenshot of array format from local window
Sub AddProcessStageToArray(SourceWorksheet, RawDataArray, LastrowData, WhatStage, ArrayOutput)
For i = LBound(RawDataArray) To UBound(RawDataArray)
If RawDataArray(i, 13) = WhatStage And RawDataArray(i, 38) <> "NOK" Then
o = o + 1
'Dim ArrayName() As Variant
ReDim Preserve ArrayOutput(o)
ArrayOutput(o) = Application.Index(SourceWorksheet.Range("A1:AO" & LastrowData), i, 0)
End If
Next
End Sub
正在调用代码,如下所示。
Sub AddITWToArray()
Dim DataWs As Worksheet: Set DataWs = ThisWorkbook.Sheets("DATA")
Dim PoolOfWeekWs As Worksheet: Set PoolOfWeekWs = ThisWorkbook.Sheets("Pool of the week")
Dim LastrowData As Long: LastrowData = DataWs.Range("A" & Rows.Count).End(xlUp).Row
Dim LastColData As Long: LastColData = DataWs.Cells(1 & DataWs.Columns.Count).End(xlToLeft).Column
Dim LastColDataString As String: LastColDataString = Split(Cells(1, LastColData).Address, "$")(1)
Dim DataRange As Range: Set DataRange = DataWs.Range("A1:" & LastColDataString & LastrowData)
Dim DataArr As Variant: DataArr = DataWs.Range("A1:AO" & LastrowData)
'Loop through Data array, if interview process = PQL, add to table. If interview proces = 1sTITW find postion and add data, if 2ndITW find postion and highlight, if 3rd find postion and highlight
Dim PoolofWeekTableLRow As Long: PoolofWeekTableLRow = PoolOfWeekWs.Range("A" & Rows.Count).End(xlUp).Row
'PoolOfWeekWs.Rows("3:" & PoolofWeekTableLRow).ClearContents
Dim i, o As Long
Dim RowNumberArr As Variant
'Create PQLArray
Dim PQLArray() As Variant
Call AddProcessStageToArray(DataWs, DataArr, LastrowData, "Prequalification", PQLArray)
'Create 1ITWArray
Dim FirstITWArray() As Variant
Call AddProcessStageToArray(DataWs, DataArr, LastrowData, "Candidate Interview 1", FirstITWArray)
'Create 2ITWArray
Dim SecondITWArray() As Variant
Call AddProcessStageToArray(DataWs, DataArr, LastrowData, "Candidate Interview 2+", SecondITWArray)
'Create PPLArray
Dim PPLArray() As Variant
Call AddProcessStageToArray(DataWs, DataArr, LastrowData, "Candidate Interview 2*", PPLArray)
【问题讨论】:
-
得到的数组不是3D数组,是数组的数组。一个如此命名的锯齿状阵列。为了返回这样一个数组,我认为将
Sub转换为Function会很好。而且(即使在现有的Sub中)最好正确声明所有Sub/Function参数(SourceWorksheet As Worksheet, RawDataArray, LastrowData As Long, WhatStage As String)。但你真正的问题在哪里?您想读取/使用/返回锯齿状数组元素吗? -
是的。
Application.Index(SourceWorksheet.Range("A1:AO" & LastrowData), i, 0)返回一个二维数组,因此您正在创建一个数组数组。在这种情况下,我通常使用字典来收集和组织数据,然后在遍历所有数据后将其输出为二维数组。Redim Preserve在应用于多维数组时既有开销又有限制。 -
@FaneDuru 我明白了。谢谢你指出我不知道。我想要做的是将数组元素返回到每个元素的特定工作表中。然后使用创建的所有数组的组合,用来自所有阶段的数据组合信息填充表格。我正在努力将数据从数组传递到特定的工作表
-
@RonRosenfeld 我现在明白了,有没有办法在不创建数组的锯齿状/数组的情况下将一整行元素添加到数组中?字典是唯一的方法吗?
-
您可以编写每个单独的元素。但是使用字典要简单得多。