1

我一直在研究这个特殊问题一段时间,显然我错过了一些非常简单的东西。我正在尝试根据 Excel 中的动态范围创建一个数组,并使用各个元素与另一个数组进行比较。附加代码的唯一问题是它继续显示空元素。任何指导将不胜感激。附上我的整体代码的一部分。

Sub Test_Again()
Dim R As Long
Dim C As Long
Dim List() As Variant
Dim i As Integer

List = Sheets("Sheet11").Range("A2:A17").Value

For R = 1 To UBound(List, 1) ' First array dimension is rows.
    For C = 1 To UBound(List, 2) ' Second array dimension is columns.
        Debug.Print List(R, C)
    Next C
Next R

ReDim List(UBound(List, 1))    
    Do Until i = UBound(List)
               If List(i) = Now() Then                                      
                          End If
               i = i + 1
    Loop
End Sub
4

1 回答 1

2

正常Redim将清除您的阵列 - 除非您使用Redim Preserve. 但是,根据帮助:

如果使用 Preserve 关键字,则只能调整最后一个数组维度的大小,并且根本无法更改维度数。例如,如果您的数组只有一个维度,您可以调整该维度的大小,因为它是最后一个也是唯一的维度。但是,如果您的数组有两个或多个维度,您可以只更改最后一个维度的大小,并且仍然保留数组的内容。

因此,在您的情况下Redim不会在这里帮助您。如果要将二维数组转换为一维数组,则需要手动执行此操作:

Sub Test_New()
    Dim lRow As Long, lCol As Long
    Dim vListSource() As Variant, vListTarget() As Variant

    'Assign soure array
    vListSource = Sheets("Sheet11").Range("A2:A17").Value

    'Show full content for debug
    For lRow = LBound(vListSource) To UBound(vListSource) ' First array dimension is rows.
        For lCol = LBound(vListSource, 2) To LBound(vListSource, 2) ' Second array dimension is columns.
            Debug.Print vListSource(lRow, lCol)
        Next lCol
    Next lRow

    'Transfer array to one dimension
    ReDim vListTarget(LBound(vListSource) To UBound(vListSource))
    For lRow = LBound(vListSource) To UBound(vListSource)
        vListTarget(lRow) = vListSource(lRow, LBound(vListSource, 2))
    Next lRow

    'Your check code
    For lRow = LBound(vListTarget) To UBound(vListTarget)
        If vListTarget(lRow) = Now() Then
            'Do something here
        End If
    Next lRow
End Sub

这会将您的范围/数组的第一行复制到一维数组中,并将其用于进一步处理。

但是,从您的代码和问题中,我看不到将其重新调整为一维的优势-您可以轻松地循环一个二维数组-只需查看第一列也是唯一一列。

于 2013-02-14T10:53:36.923 回答