Excel VB新手。“我的代码”生成错误:“我的代码”;应以“结束”;。with end with语句是如何工作的?

Excel VB新手。“我的代码”生成错误:“我的代码”;应以“结束”;。with end with语句是如何工作的?,excel,vba,Excel,Vba,当我试着运行它时,我得到一个错误,说“期望以结束”。该脚本的目标是复制行的范围,并将它们放入新的单独工作表中(然后我可以将其放入单独的文件中,这些文件将在Excel 2003中读取,而不会超过最大行数)。是否应该有一个或多个附加的End With语句?您不需要重复With部分太多次 Sub RowRangeMove() Sheets.Add().Name = "CopySheet" With Sheets("BigDataSet - Copy") .Range("

当我试着运行它时,我得到一个错误,说“期望以结束”。该脚本的目标是复制行的范围,并将它们放入新的单独工作表中(然后我可以将其放入单独的文件中,这些文件将在Excel 2003中读取,而不会超过最大行数)。是否应该有一个或多个附加的End With语句?

您不需要重复With部分太多次

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With
    .
    .
    [iterate several times]
    .
    .
    Sheets.Add().Name = "CopySheet7"
    With Sheets("BigDataSet - Copy")
        .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1")
    End With


End Sub
有关“With”关键字,请参阅MSDN文档:


您不需要对零件重复这么多次

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With
    .
    .
    [iterate several times]
    .
    .
    Sheets.Add().Name = "CopySheet7"
    With Sheets("BigDataSet - Copy")
        .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1")
    End With


End Sub
有关“With”关键字,请参阅MSDN文档:

您只需要一个(以()开始)
。这就是该块的全部要点,让您每次都不包括父对象


您只需要一个(以
()开始)
。这就是该块的全部要点,让您不必每次都包含父对象。

不仅应该有至少一个结尾With,而且不应该有那么多With语句

With Sheets("BigDataSet - Copy") 
    .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1") 
    .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1") 

    .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1") 
    .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1") 
    .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1") 

    .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1") 
    .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1") 
    .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1") 
    .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1") 
    .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1") 
End With 
将是正确的语法

With语句只是缩短代码行的一种方法。With语句是一种表示“我将对一个特定对象执行一系列操作”并缩短单个代码行的方式

例如:

如果没有With语句,上面的代码将如下所示:

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With

End Sub
简而言之,With语句允许您以一个点开始单独的代码行,在With语句中,编译器将假定您指的是With语句中声明的内容

所以

相当于

With Answerer
  ' Inside this with block, any line beginning with "." , 
  ' the compiler will assume you mean "Answerer.".   
  ' Therefore ".FirstName" is the same as "Answerer.FirstName"
  .FirstName = "David"
  .LastName = "Stratton"
End With

不仅应该至少有一个结束语,而且不应该有那么多结束语

With Sheets("BigDataSet - Copy") 
    .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1") 
    .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1") 

    .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1") 
    .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1") 
    .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1") 

    .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1") 
    .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1") 
    .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1") 
    .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1") 
    .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1") 
End With 
将是正确的语法

With语句只是缩短代码行的一种方法。With语句是一种表示“我将对一个特定对象执行一系列操作”并缩短单个代码行的方式

例如:

如果没有With语句,上面的代码将如下所示:

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With

End Sub
简而言之,With语句允许您以一个点开始单独的代码行,在With语句中,编译器将假定您指的是With语句中声明的内容

所以

相当于

With Answerer
  ' Inside this with block, any line beginning with "." , 
  ' the compiler will assume you mean "Answerer.".   
  ' Therefore ".FirstName" is the same as "Answerer.FirstName"
  .FirstName = "David"
  .LastName = "Stratton"
End With

您根本不需要带End With
块的
。看起来第一个带
块正在获取A13000:J65000的一部分并将其复制到新工作表,然后获取A455006:J502750的一部分并将其粘贴到第二个新工作表上。您的代码可以按如下方式重构:

Answerer.FirstName = "David"
Amswerer.LastName = "Stratton"

您根本不需要带End With
块的
。看起来第一个带
块正在获取A13000:J65000的一部分并将其复制到新工作表,然后获取A455006:J502750的一部分并将其粘贴到第二个新工作表上。您的代码可以按如下方式重构:

Answerer.FirstName = "David"
Amswerer.LastName = "Stratton"