Tested in Excel 365 (16.8730.2046) 64-bit
- Public Sub ArrayInArray()
- Dim a, w, i, j
- Dim b() As Variant
- For w = 1 To Worksheets.Count
- ReDim Preserve b(w)
- Worksheets(w).Select
- ' read a whole range into an array
- a = Worksheets(w).Range(Cells(1, 1), Cells(5, 8)).Value
- b(w) = a
- Next w
- 'Debug.Print b(1)(1, 4)
- 'Debug.Print b(1)(4, 1)
- ' access the elements
- For w = 1 To Worksheets.Count
- For i = 1 To UBound(b(w), 1) 'max row
- For j = 1 To UBound(b(w), 2) 'max col
- b(w)(i, j) = b(w)(i, j) * 4
- Worksheets(w).Cells(i, j).Value = b(w)(i, j)
- Next j
- Next i
- Next w
- End Sub
Or as function:
- Option Explicit
- Public Function ArrayInArray(LastRow, LastCol) As Variant
- Dim a, w, i, j
- Dim b() As Variant
- For w = 1 To Worksheets.Count
- ReDim Preserve b(w)
- Worksheets(w).Select
- ' read a whole range into an array
- a = Worksheets(w).Range(Cells(1, 1), Cells(LastRow, LastCol)).Value
- b(w) = a
- Next w
- ArrayInArray = b
- End Function
- ' you can use it like this
- Public Sub Main()
- Dim b As Variant
- Dim w, i, j
- b = ArrayInArray(7, 5)
- ' access the elements like
- 'Debug.Print b(1)(1, 4)
- 'Debug.Print b(1)(4, 1)
- ' or (let's say we multiply with 100)
- For w = 1 To Worksheets.Count
- For i = 1 To UBound(b(w), 1) 'max row
- For j = 1 To UBound(b(w), 2) 'max col
- b(w)(i, j) = b(w)(i, j) * 100
- Worksheets(w).Cells(i, j).Value = b(w)(i, j)
- Next j
- Next i
- Next w
- End Sub