检查单元格的值
我正在尝试在Excel中执行以下操作:
我有一个包含一些数据( 400k
行,这就是为什么我用variables而不是整数的variables),我想检查列R(其中包含ID的),需要检查然后列S和T.如果R是相同的S和T是不同的,代码应该复制整行并粘贴到另一个表。 代码运行并粘贴一些东西,但不是正确的行。 在此先感谢,任何帮助将不胜感激。
样本数据
RST 1234 Kevin Smith 2345 John Miller 1234 Carl Jones 1234 Kevin Smith 4567 Mike Redwood 2058 William Wales
码
Sub mySub1() Set wb = ThisWorkbook Set tbl = wb.Sheets("sheet1") Dim lrow As Long Dim i As Long Dim x As Long Dim y As Long Dim cell As Range i = 1 x = 0 y = 1 Sheets("sheet1").Activate lrow = tbl.Cells(Rows.Count, "A").End(xlUp).Row For Each cell In Range("R2:R" & lrow) If cell.Offset(x, 0).Value = cell.Offset(i, 0).Value And _ cell.Offset(0, 1) <> cell.Offset(i, 1).Value And _ cell.Offset(0, 2).Value <> cell.Offset(i, 2).Value Then ActiveSheet.Range(Cells(i + 1, 1), Cells(i + 1, 26)).Select Selection.Copy Sheets("sheet2").Select ActiveSheet.Cells(y, 1).PasteSpecial y = y + 1 End If Sheets("sheet1").Activate i = i + 1 x = x + 1 Next End Sub
好吧,我尝试了400k行不同的方法。 这是我发现最快的一个。
逻辑:
- 将数据复制到临时表,然后删除重复项。
- 对数据进行sorting
- 将结果范围存储在一个数组中
- 循环和做比赛,并最终复制
我假设Sheet1
中的数据没有标题。 如果确实如此,则将Header:=xlNo
更改为Header:=xlYes
并修改for循环。
IMP:由于行数的原因,不能使用自动Autofilter
或Autofilter
工作表函数。
码:
Sub Sample() Dim wsI As Worksheet, wsO As Worksheet, wsTemp As Worksheet Dim wsILRow As Long, wsOLRow As Long Dim rng As Range Dim itm As String Dim Myar Set wsI = ThisWorkbook.Sheets("Sheet1") Set wsO = ThisWorkbook.Sheets("Sheet2") Set wsTemp = ThisWorkbook.Sheets.Add wsOLRow = wsO.Range("A" & wsO.Rows.Count).End(xlUp).Row + 1 wsI.Cells.Copy wsTemp.Cells With wsTemp wsILRow = .Range("R" & .Rows.Count).End(xlUp).Row .Range("$R$1:$T$" & wsILRow).RemoveDuplicates Columns:=Array(1, 2, 3), _ Header:=xlNo .Columns("A:Z").Sort Key1:=.Range("R1"), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal wsILRow = .Range("R" & .Rows.Count).End(xlUp).Row Set rng = .Range("R1:T" & wsILRow) End With Myar = rng.Value For i = 1 To UBound(Myar) If i > 1 Then If Myar(i, 1) = Myar(i - 1, 1) Then GoTo NextRec itm = Myar(i, 1) For j = i + 1 To UBound(Myar) If Myar(j, 1) = itm Then If Myar(i, 2) & Myar(j, 2) <> Myar(i, 3) & Myar(j, 3) Then wsTemp.Rows(j).Copy wsO.Rows(wsOLRow) wsOLRow = wsOLRow + 1 End If End If Next j NextRec: Next i Application.DisplayAlerts = False wsTemp.Delete Application.DisplayAlerts = True End Sub
如果您不必使用VBA,则可以使用简单的工作表操作来完成此操作。
参加工作表:
- 追加一个包含增加的行号的列,
- 按ID(列R)和行号sorting,
- 将公式
=AND(R2=R1,OR(S2<>S1,T2<>T1))
到第2行并将其复制到工作表中, - 筛选以显示所有真实的行
- 将可见行复制到新工作表。
这应该给你更好的性能,更容易维护。
- 当Excel只消耗70MB时,VBA“内存不足”错误
- 在Excel 2007中,如何从指定范围的多个列的SUMIFS索引?
- 函数将所有选中的项目从列表框中返回到单元格中
- 使用embedded式Microsoft Query在Excel Mac 2016 ODBC连接中存储密码
- jXLS jx:image以java.lang.IllegalArgumentException结尾:imgBean值必须包含图像字节
- 如何使用自动化在C ++中迭代Excel列的集合?
- 如何返回数组中的array()函数在单元格中使用数组公式(matricial公式):用于在多单元格中分割texte
- xlrd库不能使用xlsx files.any方式来隐藏xlsx到xls使用python?
- 获得一个Excel范围的独特verion的排名