我在五个不同的工作簿上使用三张500K +行表,在我提取所需数据的路上,我想出了以下代码:
Sub Macro3()
Dim lngFirstRow As Long, lngLastRow As Long, cRow As Long, lngNextDestRow As Long
Dim jbs As Date
Dim shSrc As Worksheet, shDest As Worksheet
Set shDest = ActiveWorkbook.Sheets("Sheeet1") '''Feuille de destination (sheetDestination)
lngNextDestRow = 2
For Each shSrc In ThisWorkbook.Worksheets
Nom = shSrc.Name
If Nom <> "Sheeet2" Then
With shSrc
lngFirstRow = 2
lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
For cRow = lngFirstRow To lngLastRow Step 1
jbs = .Cells(cRow, 2)
If jbs <> .Cells(cRow - 1, 2).Value Then
.Range("B" & cRow).Copy Destination:=shDest.Range("A" & lngNextDestRow)
.Range("D" & cRow).Copy Destination:=shDest.Range("B" & lngNextDestRow)
.Range("D" & cRow + 1).Copy Destination:=shDest.Range("C" & lngNextDestRow)
.Range("E" & cRow).Copy Destination:=shDest.Range("D" & lngNextDestRow)
.Range("E" & cRow + 1).Copy Destination:=shDest.Range("E" & lngNextDestRow)
.Range("F" & cRow).Copy Destination:=shDest.Range("F" & lngNextDestRow)
.Range("F" & cRow + 1).Copy Destination:=shDest.Range("G" & lngNextDestRow)
lngNextDestRow = lngNextDestRow + 1
End If
Next cRow
End With
End If
Next shSrc
End Sub
这就是我需要的。我只是一点一点地修改它,以便更快地处理五个工作簿。在这里,我在同一工作簿的新工作表中提取数据。
1)它似乎有效,但在整个过程完成后我不断得到&#34; jbs = .Cells(cRow,2)&#34;突出显示和错误13类型。知道如何解决这个问题吗?
2)有人向我提供了这一行:
lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
有没有办法找到数据列表中最后一个填充行的编号?
答案 0 :(得分:2)
jbs
被声明为Date
。当您收到错误时,.Cells(cRow,2)
指的是一个不包含可以转换为日期的日期或浮点数的单元格。假设您不关心第2列中您正在查看的种值,请替换:
jbs = .Cells(cRow, 2)
If jbs <> .Cells(cRow - 1, 2).Value Then
使用:
If .Cells(cRow, 2) <> .Cells(cRow - 1, 2) Then
这消除了声明jbs
和完全输入。
lngLastRow = .UsedRange.Rows.Count
答案 1 :(得分:0)
您正在使用的lngLastRow
代码将返回工作表上最后一个使用过的单元格的一行。不一定是列中最后使用的单元格&#34; B&#34;您稍后将在代码中进行比较,例如:If jbs <> .Cells(cRow - 1, 2).Value Then...
如果你想在列#34; B&#34;中找到最后使用的行。用这种方法使用:lngLastRow = .columns(2).Find(What:="*", LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
这应该摆脱循环错误,因为它将适当地停止它应该。
来源: