首页 > 解决方案 > 返回表列中的最后一个值

问题描述

VBA 新手。两天来一直在寻找答案,但没有找到真正问我想要答案的问题。

我正在使用在我的一张工作表中填充表格的用户窗体。

我的问题在 Sub 内UserForm_Initialize()。我要做的第一件事就是找出我在我的 DataBodyRange 中的最后一行(顺便说一下,第一列)是否包含一个 ID 号。

如果是这样,那么我取那个值,添加一个,然后在我的用户窗体中填充一个文本框。

但是,如果该表由标题和一个空行组成,我想用数字 1 填充 TextBox(通过另一个子将添加到该空行),但我的代码停止工作并出现错误。

使用以下代码,我得到了错误

运行时错误“91”:对象变量或未设置块变量

Private Sub UserForm_Initialize()
Dim tbl As ListObject, rng As Range

Set tbl = Worksheets("Sheet1").ListObjects("table1")
Set rng = tbl.ListColumns("ID").DataBodyRange

If IsEmpty(rng.Cells.Find("*", LookIn:=xlValues,_
           SearchOrder:=xlByRows,_
           SearchDirection:=xlPrevious).Value) Then
    Me.textBox.Value = 1
Else
    Me.textBox.Value = rng.Cells.Find("*", LookIn:=xlValues,_
           SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Value + 1
End If

End Sub

我不明白我找到的关于错误代码或如何修复它的解释。我认为该错误与该错误有关,rng.Cells.Find...因为那是在单步执行代码时出现错误的时候,但是我一生都无法理解为什么。

标签: excelvbafindlistobject

解决方案


Find()返回一个 Range,如果没有找到,则 Range 为 Nothing。因此,应该检查 Is Nothing。

在下面的代码中,result引入了一个新的范围变量。检查它是否为空:

Private Sub UserForm_Initialize()
    Dim tbl As ListObject, rng As Range

    Set tbl = Worksheets("Sheet1").ListObjects("table1")
    Set rng = tbl.ListColumns("ID").DataBodyRange

    Dim result As Range
    Set result = rng.Cells.Find("*", LookIn:=xlValues, _ 
                  SearchOrder:=xlByRows, SearchDirection:=xlPrevious)

    If Not result Is Nothing Then
        Debug.Print result.Address
    Else
        Debug.Print "result is nothing"
    End If

End Sub

推荐阅读