Как я могу сделать так, чтобы мой итерационный макрос пропускал несколько строк в Excel? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть макрос Excel, написанный на VBA, который копирует данные с листа на другой. Прямо сейчас, строки между 72 и 77 больше не нужны (есть таблица, которая всегда располагается между теми строками, которые должны идти), поэтому я хотел прекратить итерировать их, удалив их из окончательного листа. Как я мог достичь этого? Вот код моей подпрограммы:

Windows(report).Activate
Sheets("bond forward").Select

k = 1000

For conta = 16 To 500
    If Cells(conta, 14) = "BDCHFT_MM" Then
        Rows(conta).Select
        Selection.Copy
        Rows(k).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        k = k + 1
    End If
Next conta

k = 2000
For conta2 = 16 To 500
    If Cells(conta2, 14) = "BAT_TIGO" Then
        Rows(conta2).Select
        Selection.Copy
        Rows(k).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        k = k + 1
    End If
Next conta2

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Самый простой способ пропустить цикл - написать соответствующий флаг с помощью оператора GoTo:

Dim firstRowToSkip As Long, lastRowToSkip As Long
firstRowToSkip = 72
lastRowToSkip = 77
For conta = 16 To 500
    ' skip loop
    If conta >= firstRowToSkip And conta <= lastRowToSkip Then GoTo NextIteration
    'rest of loop
NextIteration:
Next
1 голос
/ 09 апреля 2019

Даже если вы говорите, что ваш код копируется с одного листа на другой, я не могу найти другой лист, вы копируете с того же листа несколько строк ниже.

Во всяком случае, я исправилваш код, поэтому он не будет использовать .Select или .Activate, что вы должны избегать.Также добавлена ​​ссылка на лист, так что вы всегда можете сослаться на нее в своем коде, как в примере.

Что-то важное, используйте Option Explicit для принудительного объявления всех ваших переменных, иначе вы столкнетесь со многими ошибками:

Option Explicit
Sub Test()

    Dim ws As Worksheet, k As Long, l As Long, conta As Long

    'I believe the workbook with the bond forward sheet is not called report, so change the name and include it's extension
    Set ws = Workbooks("Report.xlsx").Sheets("bond forward")

    k = 1000
    l = 2000
    With ws
        For conta = 16 To 500
            If conta > 71 And conta < 78 Then GoTo NextRow 'this will skip the rows 72-77
            If .Cells(conta, 14) = "BDCHFT_MM" Then
                .Rows(conta).Copy 'you can copy in one step without selecting
                .Rows(k).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False 'same for paste
                k = k + 1
            ElseIf .Cells(conta, 14) = "BAT_TIGO" Then 'also you don't need another loop to do this, just another variable for the paste row
                .Rows(conta).Copy
                .Rows(l).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
                l = l + 1
            End If
NextRow:
        Next conta
    End With

End Sub
0 голосов
/ 09 апреля 2019

Другое возможное решение:

Option Explicit

Sub test()

    Dim k1 As Long, k2 As Long, conta As Long

    k1 = 1000
    k2 = 2000

    With ThisWorkbook.Worksheets("bond forward")

        For conta = 16 To 500

            If conta > 72 And conta < 77 Then

                If .Cells(conta, 14) = "BDCHFT_MM" Then

                    .Rows(conta).Copy
                    .Rows(k1).PasteSpecial Paste:=xlPasteValues

                    k1 = k1 + 1

                ElseIf Cells(conta, 14) = "BAT_TIGO" Then

                    .Rows(conta).Copy
                    .Rows(k2).PasteSpecial Paste:=xlPasteValues

                    k2 = k2 + 1

                End If

            End If

        Next conta

    End With

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