Вернуть последнее значение в столбце таблицы - PullRequest
0 голосов
/ 14 февраля 2019

Новый для VBA.В течение двух дней я искал ответ, но не нашел вопрос, который действительно спрашивает, на что я хочу получить ответ.

Я работаю с пользовательской формой, которая заполняет таблицу на одном из моих листов.

Мойпроблема в сабе UserForm_Initialize().Первое, что я пытаюсь сделать, это выяснить, содержит ли моя последняя строка (и, кстати, первый столбец) в моем DataBodyRange указанной таблицы идентификационный номер.

Если это так, то я беру это значение, добавляю его и заполняю текстовое поле внутри своей пользовательской формы.

Если, однако, таблица состоит из заголовков и одной пустой строки, я хочу заполнить TextBox номером 1 (который через другую подпрограмму будет добавлен в эту пустую строку), но мой код перестает работать сошибка.

С помощью следующего кода я получаю ошибку

Ошибка времени выполнения '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 голосов
/ 14 февраля 2019

Find() возвращает диапазон, и если ничего не найдено, то диапазон равен 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
0 голосов
/ 14 февраля 2019

Только к вашему сведению, вам не нужно 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
0 голосов
/ 14 февраля 2019

Сбой из-за

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

Если метод Range.Find ничего не находит, он возвращает 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 
...