返回表列中的最后一个值

时间:2019-02-14 10:46:34

标签: excel vba find listobject

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

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

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

如果是,那么我采用该值,添加一个值,然后在UserForm中填充一个文本框。

但是,如果表由标题和一个空行组成,我想用数字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...有关,因为那是在单步执行代码时出现错误的时候,但是我可以终生不明白为什么。

3 个答案:

答案 0 :(得分:0)

由于

而失败
rng.Cells.Find("*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Value

如果Range.Find method找不到任何内容,它将返回Nothing,然后您尝试获取.Value中的Nothing失败。

在使用Find之前,请始终对其Nothing的结果进行测试:

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

If Not FoundAt Is Nothing Then
    Debug.Print FoundAt.Value 'now you can safely use .Value
Else
    MsgBox "Nothing found"
End If 

答案 1 :(得分:0)

Find()返回一个范围,如果未找到任何内容,则范围为空。因此,应对照“没有”进行检查。

在下面的代码中,引入了一个新的范围变量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

答案 2 :(得分:0)

仅供参考,您实际上不需要Find,因为您可以直接获取最后一个单元格:

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

    Set tbl = Worksheets("Sheet1").ListObjects("table1")
    Set rng = tbl.ListColumns("ID").DataBodyRange
    With rng
        Set lastCell = .Cells(.Cells.Count)
    End With
    If IsEmpty(lastCell) Then
        Me.TextBox.Value = 1
    Else
        Me.TextBox.Value = lastCell.Value + 1
    End If

End Sub