简体   繁体   English

EXCEL VBA:我的宏正在创建一个 3D 维数组

[英]EXCEL VBA: My macro is creating a 3D dimension array

I have lots of recruitment data that i want to re-arrange, separate and modify using arrays. The data includes all information from 1st stage, 2nd stage and 3rd stage interview for each candidates.我有很多招聘数据,我想使用 arrays 重新排列、分离和修改。数据包括每个候选人的第一阶段、第二阶段和第三阶段面试的所有信息。 The idea is to separate each stage onto their own sheets (eg Interview 1, interview 2, interview 3).这个想法是将每个阶段分开到他们自己的工作表上(例如采访 1、采访 2、采访 3)。 And then to also create a table that has information from all three stages for each candidate.然后还要创建一个表,其中包含每个候选人的所有三个阶段的信息。

Firstly, i have created an array of all the data by declaring the range ("A1:AV10000") as a variant.首先,我通过将范围 ("A1:AV10000") 声明为变体来创建所有数据的数组。

Then i have created a loop to loop through this data, and separate each type of event that occurs into their own arrays, using an IF function within the loop.然后我创建了一个循环来遍历这些数据,并将发生的每种类型的事件分离到它们自己的 arrays 中,在循环中使用 IF function。 If condition is met, create a new array and add each row that condition is met to an array.如果满足条件,则创建一个新数组并将满足条件的每一行添加到数组中。

However, i believe my arrays are being made into a 3D array and i am sure how to edit the code so that it remains 2Darray.但是,我相信我的 arrays 正在被制作成一个 3D 数组,我确定如何编辑代码以使其保持 2Darray。 I understand why the code may be creating 3D array (due to iterating by 1 in the loop), however i am unsure how to write code so it includes all data the row and only iterates as shown below.我理解为什么代码可能正在创建 3D 数组(由于在循环中迭代 1),但是我不确定如何编写代码以使其包含该行的所有数据并且仅如下所示进行迭代。

eg currently it goes (1)(1,1),(1)(1,2) then (2)(1,1),(2)(1,2) then (3)(1,1),(3)(1,2).例如目前它去 (1)(1,1),(1)(1,2) 然后 (2)(1,1),(2)(1,2) 然后 (3)(1,1),( 3)(1,2)。 I would think it would work if it was (1,1)(1,2) then (2,1)(2,2) then (3,1)(3,2).如果它是 (1,1)(1,2) 然后是 (2,1)(2,2) 然后是 (3,1)(3,2),我认为它会起作用。 Screenshot of array format from local window数组格式截图来自本地 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


The code is being called as shown below.正在调用代码,如下所示。

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)

Try the next adapted function, please:试下适配function,请:

Function AddProcessStageToArray(SourceWorksheet As Worksheet, RawDataArray, LastrowData As Long, WhatStage As String) As Variant
Dim ArrayOutput() As Variant, o As Long, i As Long, j As Long

ReDim ArrayOutput(1 To UBound(RawDataArray, 2), 1 To UBound(RawDataArray, 2))
For i = LBound(RawDataArray) To UBound(RawDataArray)
    If RawDataArray(i, 13) = WhatStage And RawDataArray(i, 38) <> "NOK" Then
        o = o + 1
        For j = 1 To UBound(RawDataArray, 2)
            ArrayOutput(j, o) = RawDataArray(i, j)
        Next j
    End If
Next
ReDim Preserve ArrayOutput(1 To UBound(RawDataArray, 2), 1 To o)
AddProcessStageToArray = WorksheetFunction.Transpose(ArrayOutput)
End Function

It can be called in this way:可以这样调用:

Sub testAddProcessStToArr()
  Dim DataWs As Worksheet, DataArr As Variant, LastrowData As Long
  
  Set DataWs = ThisWorkbook.Sheets("DATA")
    LastrowData = DataWs.Range("A" & rows.count).End(xlUp).row
    DataArr = DataWs.Range("A1:AO" & LastrowData)
    Dim PQLArray() As Variant
    PQLArray = AddProcessStageToArray(DataWs, DataArr, LastrowData, "Prequalification")
    Dim NewSheet as Worksheet
    Set NewSheet = ActiveWorkbook.Sheets.Add
    NewSheet.Range("A1").Resize(UBound(PQLArray), UBound(PQLArray, 2)).Value = PQLArray
End Sub

Edited :编辑

Please, also try the next approach, involving a preliminary counting of rows respecting the conditions criteria and then use them to fill the final array.请也尝试下一种方法,包括根据条件标准对行进行初步计数,然后使用它们来填充最终数组。 The adapted function to be used will be the next:要使用的适配 function 将是下一个:

Function AddProcessStageToArr(RawDataArray, arrNo As Variant) As Variant
 Dim ArrayOutput() As Variant, o As Long, i As Long, j As Long

 ReDim ArrayOutput(1 To UBound(arrNo) + 1, 1 To UBound(RawDataArray, 2))
 For i = 0 To UBound(arrNo)
    o = o + 1
    For j = 1 To UBound(RawDataArray, 2)
        ArrayOutput(o, j) = RawDataArray(arrNo(i), j)
    Next j
 Next
 AddProcessStageToArr = ArrayOutput
End Function

The above function should be called in the next way:上面的 function 应该用下面的方式调用:

Sub testAddProcessStToArrBis()
  Dim DataWs As Worksheet, DataArr As Variant, LastrowData As Long
  Dim arrNo As Variant, i As Long, k As Long
  
  Set DataWs = ActiveSheet
    LastrowData = DataWs.Range("A" & rows.count).End(xlUp).row
    DataArr = DataWs.Range("A1:AO" & LastrowData).Value
    ReDim arrNo(UBound(DataArr))
    For i = 1 To UBound(DataArr)
        If DataArr(i, 13) = "Prequalification" And DataArr(i, 38) <> "NOK" Then
            arrNo(k) = i: k = k + 1
        End If
    Next i
    ReDim Preserve arrNo(k - 1)
    Dim PQLArray() As Variant
    PQLArray = AddProcessStageToArr(DataArr, arrNo)
    Dim NewSheet As Worksheet
    Set NewSheet = ActiveWorkbook.Sheets.Add(After:=DataWs)
    NewSheet.Range("A1").Resize(UBound(PQLArray), UBound(PQLArray, 2)).Value = PQLArray
End Sub

The same function must be used, but changing "Prequalification" with "Candidate Interview x" and rebuild arrNo for each case...必须使用相同的 function,但将“Prequalification”更改为“Candidate Interview x”并为每个案例重建arrNo ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM