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