使用条件VBA或过滤器复制和粘贴

时间:2017-07-13 20:00:18

标签: excel vba excel-vba copy-paste

我的名字是Pedro,我是VBA开发的初学者。我有一个关于复制和粘贴标准的问题。当我运行一个在另一个工作簿中复制和粘贴行的宏时,我有代码向我报告错误1004工作簿。如何使用以下代码修复此错误?

    Dim LastRow As Integer, i As Integer, erow As Integer
    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

    Application.ScreenUpdating = False
    Application.Calculation = xlManual

    For i = 2 To LastRow
     'If Cells(i, 9) = "Aline" Then
        'Range(Cells(i, 1), Cells(i, 16)).Select
        'Selection.Copy

        'Workbooks.Open Filename:="L:\Controle\Assessoria Tecnica\Pessoas\Aline.xlsx"
        'Worksheets("Plan1").Select
        'erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

        'ActiveSheet.Cells(erow, 1).Select
        'ActiveSheet.Paste
        'ActiveWorkbook.Save
        'ActiveWorkbook.Close
        'Application.CutCopyMode = False
End If

Next i

    Application.ScreenUpdating = True '
    Application.Calculation = xlCalculationAutomatic

    MsgBox "Informações inseridas com sucesso", vbInformation
End sub

我还想解释一下我的代码是做什么的。我的代码符合" I"中的特定条件。列(如Aline,Carol,Karine,Lucas,Thiago)之后,根据匹配的条件,将每行复制并粘贴到另一个工作簿中。柱。那么你认为在这种情况下会出现什么问题呢?我该怎么做才能解决这个错误?或者创建一个复制带条件的行的新代码并将其粘贴到另一个工作簿中?

1 个答案:

答案 0 :(得分:0)

至于你发布的代码,你已经评论了你的IF块,但没有评论整件事。 END IF也应该被评论。

我过去做过类似的事情,所以让我提供一些代码片段作为建议。这应该让你开始。这绝不是做事的正确或完美的方式,但它很容易理解。经过多年的VB编写,我不会这样写。 :)

    Sub Open_SlaveWB()
        vFile = Workbooks.Open Filename:="L:\Controle\Assessoria Tecnica\Pessoas\Aline.xlsx"
        If TypeName(vFile) = "Boolean" Then Exit Sub
        Set UpdateSheet = wbMaster.Sheets("Update") 'Name of the sheet in the master WB to copy into
        Set wbSlave = Workbooks.Open(vFile)
        Set SlaveSheet = wbSlave.Sheets("Plan1") 'Name of the sheet in the slave WB to copy from

        Exit Sub
    errMessage:
        MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"
        Resume Next
    End Sub

如果您完全确定路径和文件名将保持不变,请使用此方法,否则我建议将vfile设置为:Application.GetOpenFilename("Excel-files,*.xlsx", 1, "Select One File To Open", , False),这将打开文件选择对话框。

我发现将表单复制到主工作簿并从那里获取数据而不是后续的从属工作簿会更有效。

Sub Copy_SlaveToMaster()
    LastSlaveRow = SlaveSheet.UsedRange.Rows.Count
    LastSlaveColumn = SlaveSheet.UsedRange.Columns.Count
    SlaveSheet.Range(Cells(1, 1), Cells(LastSlaveRow, LastSlaveColumn)).Copy
    UpdateSheet.Cells(1, 1).PasteSpecial

    Exit Sub
errMessage:
    MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"
    Resume Next
End Sub

你显然不需要奴隶WB保持开放。

Sub Close_SlaveWB()
    Application.DisplayAlerts = False
    wbSlave.Close
    Application.DisplayAlerts = True

    Exit Sub
errMessage:
    MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "Error!"
    Resume Next
End Sub

从那里你可以编写一些代码来操作新工作表,根据需要使用新工作表中的数据。