VBA Excel - 同一行中的非连续单元格,逐行

时间:2015-02-27 21:10:49

标签: excel vba excel-vba

我正在一个表对象中工作,我需要根据唯一的引用列来重新定义或删除数据行。问题是,这些数据被分解为自己的非连续列。我应该准确地说明我正在尝试做什么:

For Each i In Range("Table1[#Headers]")
    If i = "REF" Then
        For Each j In Range("Table1[" & i & "]")
            If j <> j.Offset(-1, 0) Then
                Range("Table1[[#All],[COL01]]").Cells(j.Row, 1) = val(Range("Table1[[#All],[COL01]]").Cells(j.Row, 1))
                Range("Table1[[#All],[COL05]]").Cells(j.Row, 1) = val(Range("Table1[[#All],[COL05]]").Cells(j.Row, 1))
'etc....
            Else:
                Range("Table1[[#All],[COL01]]").Cells(j.Row, 1).ClearContents
                Range("Table1[[#All],[COL05]]").Cells(j.Row, 1).ClearContents
'etc....
            End If
        Next j
        Exit For
    End If
Next i

这会找到已排序且具有相同值的倍数的“REF”列,确定每组相似值{j <> j.Offset(-1, 0)}的开头,如果j确实是...的开头一组,查看同一行中的不同列,并在其上执行val(),有效地将空白变为零​​。否则,它将清除该单元格的内容......

问题是..我有很多“COL”型列可以使用,它们并不总是连续的,而且这个数据表中的行是10,000+;整个过程需要永远。有没有办法做Union()类型的范围不是写作的噩梦?也许使用数组/字典/东西?任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

好的,我已设法使用自定义范围和Intersect()

找到答案

这是我提出的代码:

Dim Rng As Range

For Each i_1 In Range("Table1[#Headers]")
    If i_1 = "REF" Then
        For Each j_1 In Range("Table1[#Headers]")
            If InStr(1, "COL01|COL05|...|...|...", j_1) <> 0 Then
                If Rng Is Nothing Then
                    Set Rng = Range("Table1[[#All],[" & j_1 & "]]")
                Else:
                    Set Rng = Union(Rng, Range("Table1[[#All],[" & j_1 & "]]"))
                End If
            End If
        Next j_1
        For Each j_2 In Range("Table1[" & i_1 & "]")
            If j_2 <> j_2.Offset(-1, 0) Then
                Intersect(Rng, Rows(j_2.Row)).SpecialCells(xlCellTypeBlanks).Value = 0
            Else:
                Intersect(Rng, Rows(j_2.Row)).ClearContents
            End If
        Next j_2
    Exit For
    End If
Next i_1

查看一旦找到"REF"列,就会将所有必需的列建立到Union()范围内。然后它通过另一个具有自己条件的循环将这些列与Table1中的每一行相交。如果你能找到一个更好的方法来创建这个让我知道,但我发现它大大缩短了处理时间。