VBA копирует и пропускает строки в разные рабочие книги при выполнении условия - PullRequest
0 голосов
/ 18 мая 2018

Цель состоит в том, чтобы указать два разных условия, и при выполнении одного из них вся строка из мастер-файла (эта рабочая книга) копируется и затем вставляется в новую рабочую книгу.

Я думаю, что проблемы как-то связаны с функцией «если», поскольку этот код прекрасно работает с одним условием (создает новую книгу и добавляет все строки в эту книгу всякий раз, когда выполняется условие).

Другие проблемы: Этот метод довольно трудоемкий, когда в masterfile содержится много наблюдений, соответствующих указанному условию.По этой причине я был бы признателен, если бы кто-то смог найти лучшее решение по этому вопросу.Вместо того, чтобы вставлять строки одну за другой, было бы замечательно, если бы все строки могли быть одновременно размещены в правильной книге.

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

>

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я не смог найти ошибку относительно второго "если".Я предлагаю проверить, если значение 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
0 голосов
/ 18 мая 2018

Попробуйте вместо этого:

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

Вместо двух операторов If Then вы можете использовать Or для указания двух условий.Если любое из условий выполнено, строка копируется и вставляется.

Что касается времени, которое требуется для выполнения кода, обычно следует избегать использования .Select и .Activate, что вы часто делаете.Постарайтесь выяснить, можете ли вы придумать способ избежать этого самостоятельно - если вы не можете, я помогу вам позже сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...