«Недопустимое использование пустого значения» в операторе DoEvents в MsAccess - PullRequest
3 голосов
/ 02 апреля 2012

У меня странная ситуация в Access. Как правило, недопустимое использование ошибки Null - довольно простая вещь - присвоение нуля строковой переменной или чему-то другому. Но я получаю ошибку в месте, где, как мне кажется, этого не должно быть. Вот фрагмент кода:

bch = Form_Akces.txtMaxCisla.BackColor
If Err <> 0 Then Stop
Form_Akces.txtMaxCisla.BackColor = vbYellow
If Err <> 0 Then Stop
DoEvents
If Err <> 0 Then Stop ' This is where I get the error
With qdf_GPsp

Происходит то, что я получаю эту ошибку только иногда, обычно только в первый раз, когда запускаю код в какое-то время. Если я закрываю базу данных и сразу же заново ее открываю, обычно я не получаю ошибку. Это уже давно сводит меня с ума, поэтому я вставил все эти утверждения «Если ошибся <> 0, то останови», пытаясь отследить, где это происходит. Это живая система, и пользователи знают, что нужно просто перезапустить приложение, но это огромная PIA и довольно неудобно для загрузки.

Кто-нибудь может придумать, что попробовать или проверить? Я не совсем любитель Access, но это далеко не все, с чем я когда-либо сталкивался. Почему оператор DoEvents должен генерировать такую ​​ошибку, я не знаю, тем более что я ничего не делаю даже в предыдущих инструкциях, которые должны генерировать такую ​​ошибку, что ее можно как-то «удерживать» до тех пор, пока процессор не получит возможность выдать ошибку , Если я уберу DoEvents, я просто получу ту же ошибку несколько дальше. txtMaxCisla - это несвязанное текстовое поле в форме Form_Akces, из которого вызывается подпрограмма, содержащая этот код. Это только при запуске - как только все загружено и работает, это никогда не случится снова. И это происходит только время от времени - я не смог обнаружить ни одного паттерна.

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

  • Обновление *

Не повезло - он все еще падает, и абсолютно НИКАКОЙ причины, которую я могу видеть. Вот код сейчас:

Public Sub ReloadMaxNumbers(tmc As TextBox)
Dim rst As DAO.Recordset, x$, xb$, xe$, bch&
On Error GoTo 0
If Err <> 0 Then Stop
DoEvents
If Err <> 0 Then Stop
...

Код останавливается на ВТОРОМ тесте после DoEvents с той же ошибкой «Недопустимое использование Null». Я понимаю, что этот код полностью запаздывает, но это результат отслеживания, пытающегося найти корень ошибки. Без этого он падает где-то вниз по дороге, с той же ошибкой. На данный момент я не могу думать ни о чем другом, чтобы даже попробовать.

1 Ответ

1 голос
/ 02 апреля 2012

Я озадачен Form_Akces в вашем коде.Если я создаю форму с именем Akces, модуль кода формы получает имя Form_Akces.Но вы сказали " в форме Form_Akces ".Поэтому я не понимаю, является ли Form_Akces именем формы или модулем кода формы.Возможно, Access также запутан.

В любом случае, поскольку вы сказали, что код находится в модуле кода формы, я предлагаю вам заменить Me на Form_Akces

Редактировать : Я неправильно понял вашу ситуацию.Код, который вы нам показали, на самом деле из процедуры в другом модуле кода, а не из модуля кода формы.В этом случае я бы сделал что-то подобное для внешней процедуры DoSomething:

Public Sub DoSomething(ByRef frm As Form)
    bch = frm.txtMaxCisla.BackColor
    frm.txtMaxCisla.BackColor = vbYellow
    DoEvents
    ' whatever else you need
End Sub

Затем в модуле кода формы, где вы вызываете DoSomething:

DoSomething Me

И если DoSomething работает только с одним элементом управления каждый раз, вместо этого вы можете просто передать ссылку на этот элемент управления.

Public Sub DoSomething(ByRef ctl As Control)

Этот подход позволит повторно использовать DoSomething для других форм без изменений, посколькуимя целевой формы не является «встроенным» в процедуру.Кроме того, оно не сломается, если вы переименуете форму Akces.Во втором варианте также будут учтены изменения имени элемента управления.

...