Excel 单列值以多维数组结束

Excel 单列值以多维数组结束,excel,vba,Excel,Vba,我正在用一部分列(范围)中的值填充数组。结果数组是多维的,但它应该是一维的。我只想将Emp ID值放入数组: 我试过这个: Sub Test() Dim colPostionNumber As Integer Dim lastRow As Integer Dim ws As Worksheet Dim positionNumberArray As Variant Set ws = ActiveSheet With ActiveWorkbook.Sheets("Sheet 1&q

我正在用一部分列(范围)中的值填充数组。结果数组是多维的,但它应该是一维的。我只想将
Emp ID
值放入数组:

我试过这个:

Sub Test()

Dim colPostionNumber As Integer
Dim lastRow As Integer
Dim ws As Worksheet
Dim positionNumberArray As Variant

Set ws = ActiveSheet

With ActiveWorkbook.Sheets("Sheet 1")
    colPositionNumber = Application.WorksheetFunction.Match("Emp ID", ws.Rows(5), 0)
    lastRow = ws.UsedRange.SpecialCells(xlCellTypeLastCell).row

positionNumberArray = .Range(Cells(5, colPositionNumber), Cells(lastRow, colPositionNumber)).Value

End With

End Sub 
但是得到的数组是二维的

我试过了,但没用。如何使用一维数组执行此操作?

将一列二维数组写入一维数组 要获得一个基于零的1D数组,必须循环

Sub Test()

    Dim colPositionNumber As Long
    Dim lastRow As Long
    Dim ws As Worksheet
    Dim Data As Variant
    Dim positionNumberArray As Variant
    
    Set ws = ActiveSheet
    
    With ActiveWorkbook.Sheets("Sheet 1")
        colPositionNumber = Application.Match("Emp ID", ws.Rows(5), 0)
        lastRow = ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
        Data = .Range(.Cells(5, colPositionNumber), _
            .Cells(lastRow, colPositionNumber)).Value
        ReDim positionNumberArray(UBound(Data, 1) - 1)
        Dim n As Long
        For n = 1 To UBound(Data, 1)
            positionNumberArray(n - 1) = Data(n, 1)
        Next n
    End With

End Sub
使用Application.Transpose 以下过程说明如何将一列或一行范围写入基于一列的1D数组:

Sub testATColumn()
    Dim rg As Range: Set rg = Range("A1:A5")
    Dim arr As Variant: arr = Application.Transpose(rg.Value)
    Debug.Print LBound(arr, 1), UBound(arr, 1)
    On Error Resume Next
    Debug.Print LBound(arr, 2), UBound(arr, 2)
    On Error GoTo 0
End Sub

Sub testATRow()
    Dim rg As Range: Set rg = Range("A1:E1")
    Dim arr As Variant
    arr = Application.Transpose(Application.Transpose(rg.Value))
    Debug.Print LBound(arr, 1), UBound(arr, 1)
    On Error Resume Next
    Debug.Print LBound(arr, 2), UBound(arr, 2)
    On Error GoTo 0
End Sub

请注意,
Application.Transpose
每个维度限制为65535个元素。

通过Excel函数
ArrayToText()
减少维度

如果您放弃MS 365版本,您可以通过Excel函数
ArrayToText()
尝试以下方法,并最终执行拆分操作

Sub reduceDim()
    Dim t#: t = Timer
    Dim rng As Range
    Set rng = Sheet1.Range("B2:B7")            ' << change to your needs
    Dim data
    data = Split(Evaluate("ArrayToText(" & rng.Address(False, False, External:=True) & ")"), ", ")

    Debug.Print "Array(" & LBound(data) & " To " & UBound(data) & ")"
    Debug.Print Join(data, "|")                 ' display resulting 0-based 1-dim array elements

    Debug.Print Format(Timer - t, "0.00 secs")
End Sub


所以不可能把范围变为一维?它总是创建二维的吗?PS:位置号应该是Emp-idy您可以做
positionnumeraray=Application.Transpose(.Range(.Cells(5,colPositionNumber),u.Cells(lastRow,colPositionNumber)).Value)
,这将生成一个基于一的1D数组。它(
Transpose
)的限制是
65535
元素,并且在日期方面存在一些问题。将多单元格连续范围读入数组通常会得到一个基于2D 1的数组。没有办法改变这一点,但您可以编写一个函数,从一行/一列单元格中获得1D数组。您好,
Dr.Evaluate
。干得好,一如既往。
    Array(0 To 5)
    1|2|3|4|5|6
    0,00 secs