接收无效的外部过程错误

时间:2017-04-06 16:25:49

标签: excel vba excel-vba

创建一个VBA,点击刷新后,数据将被过滤并从一个工作表中复制并粘贴到另一个工作表中。当我试图运行它时,发生了无效的外部程序。

我曾使用C:I因为C是应该应用和过滤标准的列。但是,我仍然需要在"跟踪表"中的粘贴数据中包含B列(因此B:I)。 C是3.但我的问题不是关于范围,只是我知道范围是不确定的背景。

Sub Refresh()
   Dim Worksheet1 As Worksheet
   Dim lastrowtop, lastrowbottom As Integer
   Worksheets("AUTOTRACK").Range("C2:I2").AutoFilter _
    field:=3, _
    Criteria1:=Date - 1

  lastrowtop = Worksheets("AUTOTRACK").Cells(3, 2105).End(xlDown).Row
  lastrowbottom = Worksheets("Tracking Sheet").Cells(3,1601).End(xlDown).Row

  Range("C:I" & lastrowtop).Copy Destination:=Worksheets("Tracking 
  Sheet").Range("B:I" & lastrowbottom + 1)

  MsgBox ("Pull is complete")
End Sub

2 个答案:

答案 0 :(得分:1)

程序范围之外的代码必须位于模块的顶部,位于声明部分。

顾名思义,模块的该部分只能包含声明,通常包括以下内容:

  • 模块选项,例如Option ExplicitOption Private Module
  • PrivatePublic和/或Friend字段声明
  • DimConst语句
  • EnumType声明
  • Declare陈述

声明部分中的任何可执行语句都是非法的,并且会产生编译时错误:

Compile error: invalid outside procedure

当可执行语句出现在模块主体中但在过程范围之外时,会引发类似的编译时错误:

Compile error: Only comments may appear after End Sub, End Function, or End Property

答案 1 :(得分:0)

也许你就是在这之后

Option Explicit

Sub Refresh()
    Dim lastrowtop As Long, lastrowbottom As Long

    lastrowbottom = Worksheets("Tracking Sheet").Cells(3, 1601).End(xlDown).Row '<--| get "Tracking Sheet" 'lastrowbottom ' row index

    With Worksheets("AUTOTRACK") '<--| reference "AUTOTRACK" sheet
        lastrowtop = .Cells(3, 2105).End(xlDown).Row '<--| get its 'lastrowtop' row index
        With .Range("B1:I" & lastrowtop) '<--| reference columns B:I from row 1 (header) to row 'lastrowtop'
            .AutoFilter field:=2, Criteria1:=Date - 1 '<--| filter on referenced range 2nd column (i.e. column "C") with 'Date-1'
            If Application.WorksheetFunction.Subtotal(103, .Cells) > 0 Then .SpecialCells(xlCellTypeVisible).Copy Worksheets("Tracking Sheet").Range("B" & lastrowbottom + 1) '<--| if any filtered cells other than headers, then copy them and paste to "Tracking Sheet" sheet from cell in column B and row 'lastrowbottom + 1'
        End With
        .AutoFilterMode = False '<--| remove autofilter
    End With
    MsgBox ("Pull is complete")
End Sub