数组返回的空单元格

时间:2013-02-14 10:39:04

标签: excel excel-vba vba

我一直在研究这个特定的问题,显然我很遗憾。我试图在Excel中基于动态范围创建一个aray,并使用各个元素与另一个数组进行比较。附加代码的唯一问题是它继续显示空元素。任何指导将不胜感激。 我的整体代码的一部分。

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

1 个答案:

答案 0 :(得分: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

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

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