有人可以帮忙解决这个问题吗?
我正在比较两本工作簿。我已经构建了一个For循环来检查workbook1中的唯一ID是否与workbook2中的id匹配。 如果它们匹配,我将返回的行#分配给变量lrow。然后,我需要检查C列中返回行的值。 根据lrow中的值,C列我需要在workbook1,sheet1中剪切行并粘贴到workbook1中的不同工作表。我也 需要删除被剪切的行,这样我完成时就没有空行。
我在嵌套的Else If语句中遇到语法错误。它们都以红色突出显示。我也遇到了编译错误 这些行说“必须首先在线上声明”。
你能告诉我嵌套if中缺少的内容吗,并验证我的剪切和粘贴操作是否有效。
感谢您的协助。
Option Explicit
Sub Complete()
Dim Lastrow, Newrow As Long
Dim i, lrow As Long
Dim wb1, wb2 As Workbook
Dim ws1, ws2 As Worksheet
' Turn off notifications
Application.ScreenUpdating = False
Workbooks.OpenText Filename:="C:\workbook2.xlsx"
Set wb1 = ThisWorkbook
Set wb2 = Workbooks("workbook2.xlsx")
Set ws1 = wb1.Worksheets("Sheet1")
Set ws2 = wb2.Worksheets("Sheet1")
With wb1.Worksheets(ws1)
Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 2 To Lastrow
If Not IsError(Application.Match(.Cells(i, "G").Value, ws2.Columns("A"), 0)) Then
lrow = Application.Match(.Cells(i, "G").Value, ws2.Columns("A"), 0)
If ws2.Cells(lrow,"C") = 18 Then
Newrow = wb1.Worksheets("Sheet3").Range("A1").End(xlDown).Row + 1
ws1.Cells(i,"G").EntireRow.Cut wb1.Worksheets("Sheet3").Cells(newrow,"A")
ws1.Cells(i,"G").EntireRow.Delete
ElseIf ws2.Cells(lrow,"C") = 23 Then
Newrow = wb1.Worksheets("Sheet4").Range("A1").End(xlDown).Row + 1
ws1.Cells(i,"G").EntireRow.Cut wb1.Worksheets("Sheet4").Cells(newrow,"A")
ws1.Cells(i,"G").EntireRow.Delete
ElseIf ws2.Cells(lrow,"C") = 24 Then
Newrow = wb1.Worksheets("Sheet4").Range("A1").End(xlDown).Row + 1
ws1.Cells(i,"G").EntireRow.Cut wb1.Worksheets("Sheet4").Cells(newrow,"A")
ws1.Cells(i,"G").EntireRow.Delete
ElseIf ws2.Cells(lrow,"C") = 36 Then
Newrow = wb1.Worksheets("Sheet5").Range("A1").End(xlDown).Row + 1
ws1.Cells(i,"G").EntireRow.Cut wb1.Worksheets("Sheet5").Cells(newrow,"A")
ws1.Cells(i,"G").EntireRow.Delete
End If
End If
Next i
End With
Workbooks("workbook2.xlsx").Close savechanges:=False
' Turn on notifications
Application.ScreenUpdating = True
' Message Box showing that process is complete.
MsgBox "Done!"
End Sub
答案 0 :(得分:0)
从我对@paulbica的最后一条评论中我更正了这一行:
If Not IsError(Application.Match(.Cells(i, "G").Value, ws2.Columns("A"), 0)) Then
现在代码正确运行。我已更新帖子以反映所做的更改。
感谢。
答案 1 :(得分:0)
解决类型不匹配错误很好,但还有一些问题
行With wb1.Worksheets(ws1)
将抛出另一个类型不匹配错误,因为Worksheets函数将工作表名称或索引作为参数,而ws1是Worksheet对象,因此应将其更改为With wb1.Worksheets(ws1.Name)
或简单{ {1}}
如果它们是连续的,那么实现的循环将跳过行。例如,如果您从总共5行开始,所有这些行都需要移动,在第一次迭代中,我是2,第2行将被删除。下一次迭代第3行在删除后变为第2行,但我现在是3,因此跳过初始第3行并且处理移动到当前第3行(之前为4)
根据您拥有的数据量,您的代码非常慢,因为它经常与范围交互。例如,它为每个If分支提取With ws1
的值,为每个剪切操作提取工作表3,4和5中的最后一行,并在每次删除一行
这就是我编写代码的方式:
ws2.Cells(lrow,"C")
我将所有不必要的操作移出For循环,并在一次操作中创建了一个新的要删除的行范围