VBA listobject не будет добавлять строки - PullRequest
0 голосов
/ 26 октября 2018

У меня есть wb с несколькими листами, каждый из которых имеет две таблицы (списки объектов). У меня также есть пользовательская форма, которая позволяет пользователю добавлять, редактировать, удалять строки из таблиц. Эти таблицы являются статическими, что означает, что они всегда присутствуют и никогда не удаляются, они расположены в одном месте и никогда не перемещаются. Я также ссылался на эти объекты по-разному, по индексу или по имени, чтобы понять, имеет ли это значение.

Иногда, когда пользователь выполняет добавление, редактирование или удаление в любой таблице, я получаю ошибку 1004 во время выполнения. Не знаю почему, потому что я точно знаю, что объект существует. После ошибки Excel, кажется, выходит из строя и отключается, не сохраняя выполненную работу. В приведенном ниже коде ошибка возникает на tbl.ListRows.Add AlwaysInsert:=True и многим другим, как это.

Я читал, что есть ситуации, когда Excel забывает, что эти объекты есть, или даже забывает, сколько записей в таблице.

Я не уверен, что когда-нибудь получу ответ, почему Excel делает это ...

У меня вопрос, как эффективно перехватить эту ошибку и выполнить сброс, чтобы Excel не выключился.

Private Sub pg1AddDoCode_Click()
Dim tbl As ListObject
Dim lrow As Integer

Set tbl = ThisWorkbook.Worksheets("Constants").ListObjects("DoCode")

tbl.ListRows.Add AlwaysInsert:=True

lrow = tbl.ListRows.count

With tbl.ListRows(lrow)
    .Range(1) = UCase(Me.pg1DoCode)
    .Range(2) = UCase(Me.pg1DoName)
End With

ClearValues Me.MultiPage1.Pages(1).Controls

Me.pg1AddDoCode.Enabled = True
Me.pg1EditDoCode.Enabled = False
Me.pg1DelDoCode.Enabled = False
Me.pg1Query.RowSource = tbl.Name
Set tbl = Nothing

End Sub

1 Ответ

0 голосов
/ 01 ноября 2018

Мне кажется, я знаю ответ:

Вы используете Listobject в качестве RowSource.Это, как я недавно узнал, опасный. Как опасная опасность крушения .

Выполните следующие действия: Прежде чем манипулировать объектом listobject, убедитесь, что для элементов ALL вашей пользовательской формы задано значение "Rowsource": "

Me.pg1Query.RowSource = ""

.установить пустую строку.Потому что, если вы измените размер таблицы, которая является источником строк чего-то, Excel прекратит работу.

После манипуляции вы можете снова сбросить источник строк:

Me.pg1Query.RowSource = tbl.name
...