Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使迭代宏跳过Excel中的某些行?_Excel_Vba - Fatal编程技术网

如何使迭代宏跳过Excel中的某些行?

如何使迭代宏跳过Excel中的某些行?,excel,vba,Excel,Vba,我有一个excel宏,用VBA编写,可以将数据从一个工作表复制到另一个工作表。现在,72和77之间的行不再需要了(有一个表总是放在需要转到的行之间),所以我想通过从最后一张表中删除它们来停止对它们的迭代。我怎样才能做到这一点?下面是我的子程序的代码: Windows(report).Activate Sheets("bond forward").Select k = 1000 For conta = 16 To 500 If Cells(conta, 14) = "BDCHFT_MM

我有一个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

即使你说你的代码是从一张纸复制到另一张纸,我也找不到另一张纸,你是从同一张纸复制下面的一些行

无论如何,我已经修改了您的代码,因此它不会使用
。请选择
。激活
,这是您应该避免的。还添加了对工作表的引用,以便您可以在代码中始终引用它,如示例所示

重要的是,使用
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
选项显式
子测试()
将ws标注为工作表,k标注为长,l标注为长,conta标注为长
我相信带有债券远期票据的工作簿不是报告,所以请更改名称并包括其扩展名
设置ws=工作簿(“Report.xlsx”).工作表(“远期债券”)
k=1000
l=2000
与ws
对于conta=16至500
如果conta>71且conta<78,则转到下一步“这将跳过第72-77行
如果.Cells(conta,14)=“BDCHFT_MM”,则
.Rows(conta).Copy“您可以一步复制,而无需选择
.Rows(k).Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank_
:=False,转置:=False'与粘贴相同
k=k+1
Cells(conta,14)=“BAT_TIGO”然后“您也不需要另一个循环来执行此操作,只需要粘贴行的另一个变量
.行(续)。复制
.Rows(l).Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank_
:=假,转置:=假
l=l+1
如果结束
下一步:
下一个康塔
以
端接头

即使你说你的代码是从一张纸复制到另一张纸,我也找不到另一张纸,你是从同一张纸复制下面的几行

无论如何,我已经修改了您的代码,因此它不会使用
。请选择
。激活
,这是您应该避免的。还添加了对工作表的引用,以便您可以在代码中始终引用它,如示例所示

重要的是,使用
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
选项显式
子测试()
将ws标注为工作表,k标注为长,l标注为长,conta标注为长
我相信带有债券远期票据的工作簿不是报告,所以请更改名称并包括其扩展名
设置ws=工作簿(“Report.xlsx”).工作表(“远期债券”)
k=1000
l=2000
与ws
对于conta=16至500
如果conta>71且conta<78,则转到下一步“这将跳过第72-77行
如果.Cells(conta,14)=“BDCHFT_MM”,则
.Rows(conta).Copy“您可以一步复制,而无需选择
.Rows(k).Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank_
:=False,转置:=False'与粘贴相同
k=k+1
Cells(conta,14)=“BAT_TIGO”然后“您也不需要另一个循环来执行此操作,只需要粘贴行的另一个变量
.行(续)。复制
.Rows(l).Paste特殊粘贴:=xlPasteValues,操作:=xlNone,skipblank_
:=假,转置:=假
l=l+1
如果结束
下一步:
下一个康塔
以
端接头

跳过循环的最简单方法是使用
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
将firstRowToSkip变长,将lastRowToSkip变长
firstRowToSkip=72
lastRowToSkip=77
对于conta=16至500
“跳过循环

如果conta>=firstRowToSkip和conta跳过循环的最简单方法是使用
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
将firstRowToSkip变长,将lastRowToSkip变长
firstRowToSkip=72
lastRowToSkip=77
对于conta=16至500
“跳过循环

如果conta>=firstRowToSkip和conta另一种可能的解决方案:

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
选项显式
子测试()
尺寸k1为长,k2为长,conta为长
k1=1000
k2=2000
使用此工作簿。工作表(“向前绑定”)
对于conta=16至500
如果conta>72且conta<77,则
如果.Cells(conta,14)=“BDCHFT_MM”,则
.行(续)。复制
.行(k1).粘贴特殊粘贴:=xlPasteValues
k1=k1+1
其他单元格(续,14)=“BAT_TIGO”然后
.行(续)。复制
.行(k2).粘贴特殊粘贴:=XLPasteValue
k2=k2+1
如果结束
如果结束
下一个康塔
以
端接头

另一种可能的解决方案:

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
选项显式
子测试()
尺寸k1为长,k2为长,conta为长
k1=1000
k2=2000
使用此工作簿。工作表(“向前绑定”)
对于conta=16至500
如果conta>72且conta<77,则
如果.Cells(conta,14)=“BDCHFT_MM”,则
.行(续)。复制
.行(k1).粘贴特殊粘贴:=xlPasteValues
k1=k1+1
其他单元格(续,14)=“BAT_TIGO”然后
.行(续)。复制
.行(k2).粘贴特殊粘贴:=XLPasteValue
k2=k2+1
如果结束
如果结束
下一个康塔
以
端接头

您的答案将粘贴复制到第1000行或第2000行的每一行。在每次迭代中重新启动
k1
k2
变量