擦除数组中的空单元格

时间:2015-04-28 21:46:49

标签: arrays excel excel-vba vba

我将一个数组粘贴到一列中,问题是它将列中的一些单元格留空。如何清除列中的那些单元格?

这就是我所拥有的:

Private Sub Worksheet_Change(ByVal Target As Range)

    Worksheets("Info").Range("A1").Select
    Dim i As Integer
    Dim iLastRow As Long
    iLastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row
    Dim arrmatrix() As String

     ReDim arrmatrix(1 To iLastRow, 1 To 1)
    For i = 1 To iLastRow
    Range("A2").Cells(i, 1).Select
    If Selection.Offset(0, 11) = "Pi emitida" Then
    arrmatrix(i, 1) = Range("A2").Cells(i, 1).Value
    End If
    Next i
    Worksheets("Inicio").Range("G4:G1000000").ClearContents

    Worksheets("Inicio").Range("G4").Resize(UBound(arrmatrix, 1)).Value =     arrmatrix()

end sub

1 个答案:

答案 0 :(得分:0)

您的示例代码存在一些问题。

  1. 希望这是在信息工作表的代码表中。您不应该尝试.Activate来自Worksheet_Change事件宏的工作表。
  2. 目前尚不清楚为什么在Worksheet_Change事件宏中需要此功能。按原样,只要添加/修改/删除工作表中任何位置的值,就会运行此操作。这听起来有点矫枉过正,因为确定结果的唯一两列是A列和L列。
  3. ReDim statement可以与 Preserve 一起使用来展开数组,但它只能重新定位最后一个等级。
  4. 此修改不依赖于在处理之前选择或激活工作表。 arrmatrix 数组根据需要进行扩展,因此您不会在数组中得到空值。

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("A:A, L:L")) Is Nothing Then
            On Error GoTo Fìn
            Application.EnableEvents = False
            Dim i As Long, n As Long
            Dim arrmatrix As Variant
            ReDim arrmatrix(1 To 1, 1 To 1)
            For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                If Cells(i, 12).Value = "Pi emitida" Then
                    n = n + 1
                    ReDim Preserve arrmatrix(1 To 1, 1 To n)
                    arrmatrix(1, n) = Cells(i, 1).Value
                End If
            Next i
            With Worksheets("Inicio")
                .Range("G4:G" & Rows.Count).ClearContents
                .Range("G4").Resize(UBound(arrmatrix, 2), 1) = Application.Transpose(arrmatrix)
            End With
        End If
    
    Fìn:
        Application.EnableEvents = True
    End Sub
    

    仅当添加/更改/删除A列或L列中的值时才会运行。

    由于我一直在扩展和填充最后一个排名,我使用Application.Transpose重新定位数据,然后将其重新填充到 Inicio 工作表中。