我正在一个表对象中工作,我需要根据唯一的引用列来重新定义或删除数据行。问题是,这些数据被分解为自己的非连续列。我应该准确地说明我正在尝试做什么:
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()
类型的范围不是写作的噩梦?也许使用数组/字典/东西?任何帮助都会非常感激。
答案 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
中的每一行相交。如果你能找到一个更好的方法来创建这个让我知道,但我发现它大大缩短了处理时间。