问题描述
想象一下以下电子表格,但是您不确定会有多少行:
现在,您需要创建一个包含其他数组(称为ArticleArray
)的数组,以便其输出如下所示:
ArticleArray = {{"Fake Outlet 1","9/1/2020","Fake headline 1"},{"Fake Outlet 2","9/2/2020","Fake headline 2"},{"Fake Outlet 3","9/3/2020","Fake headline 3"}}
下面您可以看到我已经编写的代码示例:
Sub Pull_News()
Dim i As Long
'Finding the last row of the news table and adding borders
Dim lRow As Long
lRow = Sheets("News Archive").Cells(Rows.Count,1).End(xlUp).Row
'Creating a jagged array that will storeeach article array
Dim ArticleArray() As Variant
'Lopping through each article and creating an array
For i = 2 To lRow - 1
'Creating a temporary news array
Dim Article() As Variant
'Filling Temporary Array
Article = Sheets("News Archive").Range("A" & i & ":" & "C" & i).Value
'Adding temporary array to the jagged array
'change / adjust the size of array
ReDim Preserve ArticleArray(1 To UBound(ArticleArray) + 1) As Variant
' add value on the end of the array
ArticleArray(UBound(ArticleArray)) = Article
Next i
End Sub
我在以下行中收到以下错误消息:
ReDim Preserve ArticleArray(1 To UBound(ArticleArray) + 1) As Variant
Run-time error 9: Subscript out of range
解决方法
-
Article
不是Range
,并且没有.Value
。 -
ReDim Preserve
很昂贵。最好在循环外对数组进行一次大小调整:
Dim ArticleArray() As Variant
ReDim ArticleArray(0 To lrow -2) 'size the array outside the loop
Dim j As Long
'Looping through each article and creating an array
For i = 2 To lRow
'Creating a temporary news array
Dim Article() As Variant
'Filling Temporary Array
Article = Sheets("News Archive").Range("A" & i & ":C" & i).Value
'Adding temporary array to the jagged array
ArticleArray(j) = Article
j = j + 1
Next i
,
2D与锯齿阵列
代码
Option Explicit
Sub Pull_News()
' Constants
Const wsName As String = "News Archive"
Const srcRange As String = "A:C"
Const LastRowColumn As Long = 1
Const FirstRow As Long = 2
Dim wb As Workbook
Set wb = ThisWorkbook ' The workbook containing this code.
' Define worksheet.
Dim ws As Worksheet
Set ws = wb.Worksheets(wsName)
' Calculate last row.
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count,_
ws.Range(srcRange).Columns(LastRowColumn).Column) _
.End(xlUp).Row
' Define Source Range.
Dim rng As Range
Set rng = ws.Range(srcRange).Resize(LastRow - FirstRow + 1) _
.Offset(FirstRow - 1)
' Write values from Source Range to Source Array.
Dim Data As Variant
Data = rng.Value
' Write contents of Source Array to the Immediate window (CTRL+G).
Dim i As Long
Debug.Print "Source Array:"
For i = 1 To UBound(Data,1)
Debug.Print Data(i,1),Data(i,2),3)
Next i
' Define upper limits of arrays.
Dim UB1 As Long
UB1 = UBound(Data,1)
Dim UB2 As Long
UB2 = UBound(Data,2)
' Define jagged Articles Array.
Dim Articles As Variant
ReDim Articles(1 To UB1)
' Define Temporary Article Array.
Dim TempArticle As Variant
ReDim TempArticle(1 To 1,1 To UB2)
' Copy values from Source Array to jagged Articles Array.
Dim j As Long
For i = 1 To UB1
' Copy values from Source Array to Temporary Article Array.
For j = 1 To UB2
TempArticle(1,j) = Data(i,j)
Next j
' Copy Temporary Article Array to jagged Articles Array.
Articles(i) = TempArticle
Next i
' Write contents of jagged Articles Array to the Immediate window (CTRL+G).
Debug.Print "Jagged Articles Array:"
For i = 1 To UB1
Debug.Print Articles(i)(1,Articles(i)(1,3)
Next i
End Sub