如何修复编译错误:VBA中未定义子或函数?

如何修复编译错误:VBA中未定义子或函数?,vba,Vba,这是一个代码,它遍历中B列中的单元格。如果它在B列中找到一个不是日期的值,则会复制该值,将其粘贴到另一个名为“errors”的工作表中,然后从Sheet2中删除该行。然而,每当我尝试运行它时,就会得到一个“编译错误:未定义子或函数”。我在这上面看到了一些其他的帖子,但是上面没有提到对我有用的东西 Sub removeerrors() Dim i As Range Dim x As Double x = Worksheet("Errors").CountA("A1:A100") For

这是一个代码,它遍历中B列中的单元格。如果它在B列中找到一个不是日期的值,则会复制该值,将其粘贴到另一个名为“errors”的工作表中,然后从Sheet2中删除该行。然而,每当我尝试运行它时,就会得到一个“编译错误:未定义子或函数”。我在这上面看到了一些其他的帖子,但是上面没有提到对我有用的东西

Sub removeerrors()
Dim i As Range
Dim x As Double
x = Worksheet("Errors").CountA("A1:A100")

    For Each i In Worksheet("Sheet2").Range(Range("A2"), Range("A2").End(xlDown))
        If IsDate(i.Offset(0, 1)) = False Then
            Range(i, i.End(xlToRight)).Copy
            Worksheet("Errors").Range("A1").Offset(x, 0).Paste
            Range(i).EntireRow.Delete
        End If
    Next i
End Sub

您只需将
工作表
更改为
工作表
,最后加上“s”

Sub removeerrors()
Dim i As Range
Dim x As Double
x = Worksheets("Errors").CountA("A1:A100")

    For Each i In Worksheets("Sheet2").Range(Range("A2"), Range("A2").End(xlDown))
        If IsDate(i.Offset(0, 1)) = False Then
            Range(i, i.End(xlToRight)).Copy
            Worksheets("Errors").Range("A1").Offset(x, 0).Paste
            Range(i).EntireRow.Delete
        End If
    Next i
End Sub

脚本中还可能出现一些其他错误/更改

  • s
    添加到工作表
  • 在代码顶部使用
    选项Explicit
  • Application.WorksheetFunction.CountA
  • 将范围作为参数添加到
    Counta
    Application.WorksheetFunction.Counta(工作表(“错误”).range(“A1:A100”)
  • 通过使用工作表(“表2”)包装
    ,确保使用正确的范围
  • 通过使用
    .Cells(.Rows.Count,“A”).End(xlUp).row
    从工作表底部向上移动来确定最后一行,或者可以循环到工作表底部
  • 删除行的语法正确:
    i.EntireRow.delete
  • 您可以将复制粘贴放在一行:
    .Range(i,i.End(xlToRight))。复制工作表(“错误”)。Range(“A1”)。Offset(x,0)
  • 小心使用
    End(xlToRight)
    ,以防在工作表的最右侧结束
  • 通过关闭某些功能来优化代码,例如,在循环过程中关闭屏幕更新以防止重新绘制
  • 使用Union收集要删除的范围并在1中删除go或loop BACKWARD删除
  • VBA:


    使用完全限定的范围引用

    删除行时向后循环

    更新目标工作表粘贴行索引

    如下

    Option Explicit
    
    Sub removeerrors()
        Dim iRow As Long
        Dim x As Double
        x = Worksheets("Errors").CountA("A1:A100")
    
        With Worksheets("Sheet2") ' referecne "Sheet2" sheet
            With .Range(.Range("A2"), .Range("A2").End(xlDown))  ' reference referenced sheet range from cell A2 down to next not empty one
                For iRow = .Rows.Count To 1 Step -1 ' loop reference range backwards from its last row up
                    If Not IsDate(.Cells(iRow, 2)) Then ' if referenced range cell in column B current row is not a date
                        .Range(.Cells(iRow, 1), .Cells(iRow, 1).End(xlToRight)).Copy Destination:=Worksheets("Errors").Range("A1").Offset(x, 0) ' copy referenced range current row spanning from column A to next not empty column and paste it to sheet "Errors" column A row x
                        x = x + 1 ' update offset
                        .Rows(1).EntireRow.Delete ' delete referenced range current row
                    End If
                Next
            End With
        End With
    End Sub
    
    Option Explicit
    
    Sub removeerrors()
        Dim iRow As Long
        Dim x As Double
        x = Worksheets("Errors").CountA("A1:A100")
    
        With Worksheets("Sheet2") ' referecne "Sheet2" sheet
            With .Range(.Range("A2"), .Range("A2").End(xlDown))  ' reference referenced sheet range from cell A2 down to next not empty one
                For iRow = .Rows.Count To 1 Step -1 ' loop reference range backwards from its last row up
                    If Not IsDate(.Cells(iRow, 2)) Then ' if referenced range cell in column B current row is not a date
                        .Range(.Cells(iRow, 1), .Cells(iRow, 1).End(xlToRight)).Copy Destination:=Worksheets("Errors").Range("A1").Offset(x, 0) ' copy referenced range current row spanning from column A to next not empty column and paste it to sheet "Errors" column A row x
                        x = x + 1 ' update offset
                        .Rows(1).EntireRow.Delete ' delete referenced range current row
                    End If
                Next
            End With
        End With
    End Sub