【问题标题】:VBA copy and past rows to different workbooks when condition is met满足条件时,VBA 将行复制并粘贴到不同的工作簿
【发布时间】:2018-05-18 11:51:55
【问题描述】:

目标是指定两个不同的条件,只要满足其中一个条件,主文件(thisworkbook)中的整行就会被复制,然后粘贴到新的工作簿中。

我认为问题与“if”函数有关,因为此代码适用于一个条件(创建新工作簿并在满足条件时将所有行添加到此工作簿)。

其他问题: 当主文件包含许多符合指定条件的观察时,此方法非常耗时。出于这个原因,如果有人能在这个问题上提出更好的解决方案,我将不胜感激。如果所有行都可以一次发布到正确的工作簿上,而不是一一粘贴行,那就太棒了。

Private Sub CommandButton2_Click()
    a = Worksheets("Sheet1").Cells(Rows.Count, 9).End(xlUp).Row
    'creating new workbooks
    Dim newDataOne As Workbook
    Dim newDataTwo As Workbook
    Set newDataOne = Workbooks.Add
    Set newDataTwo = Workbooks.Add
    ThisWorkbook.Worksheets("Sheet1").Activate
    Dim nameone As String
    Dim nametwo As String
    nameone = ThisWorkbook.Worksheets("Sheet1").Range("CQ21")
    nametwo = ThisWorkbook.Worksheets("Sheet1").Range("CQ22")
    For i = 10 To a
        If Worksheets("Sheet1").Cells(i, 1).Value = nameone Then
            Worksheets("Sheet1").Rows(i).Copy
            newDataOne.ActiveSheet.Activate
            b = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
            newDataOne.ActiveSheet.Cells(b + 1, 1).Select
            ActiveSheet.PasteSpecial xlPasteValuesAndNumberFormats
            ThisWorkbook.Worksheets("Sheet1").Activate
        End If
        If Worksheets("Sheet1").Cells(i, 1).Value = nametwo Then
            Worksheets("Sheet1").Rows(i).Copy
            newDataTwo.ActiveSheet.Activate
            h = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
            newDataTwo.ActiveSheet.Cells(h + 1, 1).Select
            ActiveSheet.PasteSpecial xlPasteValuesAndNumberFormats
            ThisWorkbook.Worksheets("Sheet1").Activate
        End If
    Next i
End Sub

>

【问题讨论】:

    标签: vba excel loops conditional-statements matching


    【解决方案1】:

    试试这个:

    If Worksheets("Sheet1").Cells(i, 1).Value = nameone Or Worksheets("Sheet1").Cells(i, 1).Value = nametwo Then
                Worksheets("Sheet1").Rows(i).Copy
                newDataOne.ActiveSheet.Activate
                b = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
                newDataOne.ActiveSheet.Cells(b + 1, 1).Select
                ActiveSheet.PasteSpecial xlPasteValuesAndNumberFormats
                ThisWorkbook.Worksheets("Sheet1").Activate
    End If
    

    您可以使用Or 指定两个条件,而不是创建两个If Then 语句。如果满足任一条件,则复制并粘贴该行。

    关于运行代码所花费的时间,您通常应该避免使用.Select.Activate,您经常这样做。试试看你能否自己想出一个办法来避免这种情况——如果你不能,我今天晚些时候会帮你的。

    【讨论】:

    • 感谢您的回复!我想我没有像需要的那样清楚地解释所需的结果。我需要将主文件中的行 (i) 粘贴到不同的工作簿(如果满足第一个条件,则为 newDataOne,如果满足第二个条件,则为 newDataTwo)。
    • 好的,我明白了。是否总是满足这两个条件之一?此外,当您运行代码时会发生什么。您收到任何错误消息吗?
    • 不,这两个条件都不总是满足,我也没有收到任何错误消息。
    • 嗯,我不知道为什么它不起作用。也许您可以尝试创建一个If Then Else 语句,其中Else 部分是包含第二个条件的新If Then 语句。我怀疑它会改变什么。
    【解决方案2】:

    我找不到关于第二个“if”的任何错误。例如,我建议检查CQ22 的值是否为错误。

    尽量避免激活和选择以缩短运行代码的时间。

    Private Sub CommandButton2_Click()
        a = Worksheets("Sheet1").Cells(Rows.Count, 9).End(xlUp).Row
        'creating new workbooks
        Dim newDataOne As Workbook
        Dim newDataTwo As Workbook
        Set newDataOne = Workbooks.Add
        Set newDataTwo = Workbooks.Add
        Dim nameone As String
        Dim nametwo As String
        nameone = ThisWorkbook.Worksheets("Sheet1").Range("CQ21")
        nametwo = ThisWorkbook.Worksheets("Sheet1").Range("CQ22")
        For i = 10 To a
            If ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = nameone Then
                ThisWorkbook.Worksheets("Sheet1").Rows(i).Copy
                b = newDataOne.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
                newDataOne.ActiveSheet.Cells(b + 1, 1).PasteSpecial xlPasteValuesAndNumberFormats
            End If
            If ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = nametwo Then
                ThisWorkbook.Worksheets("Sheet1").Rows(i).Copy
                h = newDataTwo.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
                newDataTwo.ActiveSheet.Cells(h + 1, 1).PasteSpecial xlPasteValuesAndNumberFormats
            End If
        Next i
    End Sub
    

    【讨论】:

    • 感谢您的回复!也许 active 和 select- 命令确实存在一些问题,因为现在它工作得很好!但是,如果要粘贴两个以上的工作簿或大量观察,则此方法非常繁重。您能否就此事提出任何合适的解决方案(假设我将分别有五个不同的条件和工作簿)?我根本没有使用过 vba,但是是否可以将行索引保存在某种数组列表中,而不是一个一个地粘贴?
    • 如果你只需要行索引而不是粘贴行,你可以这样做:Dim c1 As New Collection Dim c2 As New Collection For i = 10 To a If ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = nameone Then c1.Add (i) If ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = nametwo Then c2.Add (i) Next i
    • 再次感谢。您知道如何进一步选择集合中包含的那些行吗?这将使整个方法更快。
    • 您可以将所有索引写入一个字符串,然后将它们用作一个范围。 Dim r As String For Each c In c1 If (r = "") Then r = c & ":" & c Else r = r & "," & c & ":" & c End If Next ThisWorkbook.Worksheets("Sheet1").Activate Range(r).Select
    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多