【问题标题】:sub or function not defined error in excel vbaexcel vba中的子​​或函数未定义错误
【发布时间】:2016-02-13 00:08:37
【问题描述】:

我正在尝试运行我也在此处找到的代码。该代码正在删除工作簿上每个扩展表上每一列的重复项,将其视为一个单独的实体。每当我尝试运行代码时,编译器错误都会显示“未定义子或函数”,并且最上部有一个黄色突出显示,“LastCell”有一个蓝色突出显示。我已经添加了求解器参考,但它仍然给我同样的错误。我只是无法弄清楚问题是在代码上还是我应该添加另一个参考。

Sub Removeduplicates()

    Dim ws As Workbook
    Dim lLastcol As Long
    Dim lLastrow As Long
    Dim i As Long


    For Each ws In ThisWorkbook.Worksheets
        lLastcol = LastCell(ws).Column

        For i = 1 To lLastcol

            lLastrow = LastCell(ws, i).Row

            With ws
                .Range(.Cells(1, i), .Cells(lLastrow, i)).Removeduplicates Columns:=1, Header:=xlNo
            End With


        Next i

   Next ws

End Sub

【问题讨论】:

标签: vba excel


【解决方案1】:

看起来 lasy cell 是您认为拥有的功能。我们是传入的工作表。函数将使用类似

Function lastcell(w as worksheet) as range
   Set Lastcell=w.range("a" & w.rows.count).end(xlup)

End function

【讨论】:

  • Range.Address propertyRange object是从什么时候开始的?
  • 抱歉,我上班路上正在平板电脑上打字。
  • 您仍然需要 SetRange object 并且如果您查看代码中 LastCell 函数的两次出现,其中一个使用了可选的列参数并且他们都没有询问对于 A 列中的最后一个单元格,除非 A 列是工作表上唯一填充的列。此响应似乎位于 this 组的中间。
【解决方案2】:

破译你的sn-p代码后,这是我能想到的最好的了。

Function lastCell(ws As Worksheet, _
                  Optional c As Variant, _
                  Optional r As Variant) As Range
    With ws
        If IsMissing(c) And IsMissing(r) Then
            Set lastCell = .Cells.SpecialCells(xlCellTypeLastCell)
        ElseIf IsMissing(c) And Not IsMissing(r) Then
            Set lastCell = .Cells(r, .Columns.Count).End(xlToLeft)
        ElseIf IsMissing(r) And Not IsMissing(c) Then
            Set lastCell = .Cells(.Rows.Count, c).End(xlUp)
        Else
            Set lastCell = .Cells(r, c)
        End If
    End With
End Function

将该代码复制到您的 VBA 项目中的模块代码表中。它可以用一个简短的子程序进行测试,如下所示。

Sub test()
    Dim ws1 As Worksheet

    Set ws1 = ActiveSheet

    Debug.Print lastCell(ws1).Address(0, 0)      '<~~ last cell on worksheet
    Debug.Print lastCell(ws1, 3).Address(0, 0)   '<~~ last used cell in column C
    Debug.Print lastCell(ws1, , 4).Address(0, 0) '<~~ last used column on row 4
End Sub

【讨论】:

  • 你的意思是我将代码复制到另一个模块?谢谢你顺便帮我。
  • 不,您可以将其粘贴到您已有的 Removeduplicates 子下方。它只是不能进入工作表代码表(例如 Sheet1);它必须是模块代码表(例如 Module1)。
  • 希望您不介意我在尝试运行代码时询问为什么出现类型不匹配运行时错误,它会突出显示 For Each ws In ThisWorkbook.Worksheets
  • 在您的原始代码中应该是 Dim ws As Worksheet 而不是 Dim ws As Workbook
【解决方案3】:

如果您指的是 Darren Bartrup-Cook here 的解决方案,请务必将函数 LastCell 也复制到您的代码中。

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多