嵌套If语句切割&将行粘贴到不同的工作表

时间:2017-06-22 15:08:27

标签: vba excel-vba if-statement excel

有人可以帮忙解决这个问题吗?

我正在比较两本工作簿。我已经构建了一个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

2 个答案:

答案 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循环,并在一次操作中创建了一个新的要删除的行范围