Какую функцию я могу использовать в Excel VBA для разрезания массива?
Приложение. WorksheetFunction. Индекс (массив, строка, столбец)
при определении нулевого значения для строки или столбца, тогда Вы получите весь столбец или строку, которая определяется.
Пример:
Приложение. WorksheetFunction. Индекс (массив, 0, 3)
Это даст Вам весь 3-й столбец.
при определении и строки и столбца как ненулевых, тогда Вы получите только определенный элемент. Нет никакого простого способа получить меньшую часть, чем полная строка или столбец.
Ограничение : существует предел размеру массива, который WorksheetFunction.Index
может обработать, если Вы используете более новую версию Excel. Если array
имеет больше чем 65 536 строк или 65 536 столбцов, то это бросает ошибку "Несоответствия типов". Если это - проблема для Вас, то см. этот более сложный ответ , который не подвергается тому же ограничению.
Вот функция, которую я записал, чтобы сделать все мой 1D и 2D разрезание:
Public Function GetArraySlice2D(Sarray As Variant, Stype As String, Sindex As Integer, Sstart As Integer, Sfinish As Integer) As Variant
' this function returns a slice of an array, Stype is either row or column
' Sstart is beginning of slice, Sfinish is end of slice (Sfinish = 0 means entire
' row or column is taken), Sindex is the row or column to be sliced
' (NOTE: 1 is always the first row or first column)
' an Sindex value of 0 means that the array is one dimensional 3/20/09 ljr
Dim vtemp() As Variant
Dim i As Integer
On Err GoTo ErrHandler
Select Case Sindex
Case 0
If Sfinish - Sstart = UBound(Sarray) - LBound(Sarray) Then
vtemp = Sarray
Else
ReDim vtemp(1 To Sfinish - Sstart + 1)
For i = 1 To Sfinish - Sstart + 1
vtemp(i) = Sarray(i + Sstart - 1)
Next i
End If
Case Else
Select Case Stype
Case "row"
If Sfinish = 0 Or (Sstart = LBound(Sarray, 2) And Sfinish = UBound(Sarray, 2)) Then
vtemp = Application.WorksheetFunction.Index(Sarray, Sindex, 0)
Else
ReDim vtemp(1 To Sfinish - Sstart + 1)
For i = 1 To Sfinish - Sstart + 1
vtemp(i) = Sarray(Sindex, i + Sstart - 1)
Next i
End If
Case "column"
If Sfinish = 0 Or (Sstart = LBound(Sarray, 1) And Sfinish = UBound(Sarray, 1)) Then
vtemp = Application.WorksheetFunction.Index(Sarray, 0, Sindex)
Else
ReDim vtemp(1 To Sfinish - Sstart + 1)
For i = 1 To Sfinish - Sstart + 1
vtemp(i) = Sarray(i + Sstart - 1, Sindex)
Next i
End If
End Select
End Select
GetArraySlice2D = vtemp
Exit Function
ErrHandler:
Dim M As Integer
M = MsgBox("Bad Array Input", vbOKOnly, "GetArraySlice2D")
End Function
Можно использовать комбинацию строк, Столбцов, свойств Offset и Resize для получения подмножества диапазона.
, Например, если у Вас есть диапазон, который составляет 5 столбцов 3 строками:
Set rng = Range("A1:E3")
можно получить любое подмножество путем соответствующего комбинирования вышеупомянутых свойств. Например, если Вы хотите получить самые правые 3 ячейки на второй строке (т.е. "C2:E2" в вышеупомянутом примере), Вы могли сделать что-то как:
Set rngSubset = rng.Rows(2).Offset(0, rng.Columns.Count - 3).Resize(1, 3)
Вы могли тогда обернуть это в функции VBA.
Две вещи: VBA не поддерживает нарезку массивов, поэтому, что бы вы ни использовали, вам придется использовать собственное. Но поскольку это только для Excel, вы можете использовать функцию построения в листе индекса функции для нарезки массива.
Sub Test()
'All example return a 1 based 2D array.
Dim myArr As Variant 'This var must be generic to work.
'Get whole range:
myArr = ActiveSheet.UsedRange
'Get just column 1:
myArr = WorksheetFunction.Index(ActiveSheet.UsedRange, 0, 1)
'Get just row 5
myArr = WorksheetFunction.Index(ActiveSheet.UsedRange, 5, 0)
End Sub