Действие Openform было отменено в коде MS-Access VBA - PullRequest
0 голосов
/ 24 февраля 2009

Я поддерживаю приложение, которое работало в течение последних 3 лет. Он был полностью разработан в MS Access и написан на VBA.

Внезапно приложение сталкивается с упомянутой ошибкой в ​​следующих строках:

DoCmd.OpenForm FormName:="frmNewPeerGroup", View:=acNormal, windowmode:=acWindowNormal, OpenArgs:=5

Код FrmNewPeerGroup

Private Sub Form_Open(Cancel As Integer)

    Dim lDept As Long, lDiv As Long

    lType = OpenArgs 'Supplied by caller
    lAssmtVer = 1 'Current
    sName = ""
    sDescription = ""
    dtCreatedDate = Format(Now(), "dd/mm/yyyy")
    sCreatedBy = UCase(userPerms.NTLoginName)
    lSupervisorID = userPerms.userID
    lTeam = 0

    With cmbBxType
        .RowSourceType = "Value List"
        .RowSource = GetValueListDict(pgType)
        .Value = lType
        .Enabled = (OpenArgs = 1)
    End With
    With cmbBxVersion
        .RowSourceType = "Value List"
        .RowSource = GetValueListDict(pgAssmtType)
        .Value = lAssmtVer
    End With

    mgLogoDesc.Visible = False
    txtBxCreatedDate.Value = dtCreatedDate
    txtBxCreatedBy.Value = sCreatedBy

    If OpenArgs = 5 Then
        lTeam = oActiveAssmt.TeamID
        lDept = GetParentID(aTeams(), CInt(lTeam))
        lDiv = GetParentID(aDepts(), CInt(lDept))
        With cmbBxDivision
            .RowSourceType = "Value List"
            .RowSource = GetValueListArray(aDivs())
            .Value = lDiv
            .Enabled = False
        End With
        With cmbBxDepartment
            .RowSourceType = "Value List"
            .RowSource = GetValueListArray(aDepts())
            .Value = lDept
            .Enabled = False
        End With
        With cmbBxTeam
            .RowSourceType = "Value List"
            .RowSource = GetValueListArray(aTeams())
            .Value = lTeam
            .Enabled = False
        End With
    Else
        With cmbBxDivision
            .RowSourceType = "Value List"
            .RowSource = GetValueListArray(aDivs())
            .Enabled = False
        End With
        cmbBxDepartment.Enabled = False
        cmbBxTeam.Enabled = False
    End If

End Sub

Многие экземпляры команды DoCmd.OpenForm выдают ошибку в окне сообщения:

The expression On Click you entered as the event property setting
produced the following error: The OpenForm action was canceled.

- The expression may not result in the name of macro, the name of 
  a user-defined function, or [Event procedure].
- There may have been an error evaluating the function, event, or macro.

Это сообщение об ошибке, которое я получаю.

Моя проблема в том, что тот же код выполнялся около 3 лет, но внезапно некоторые обновления для Microsoft или Office могли создать проблемы для этого кода.

Кто-нибудь сталкивался с этой ошибкой в ​​последние недели? Пожалуйста, дайте мне знать, что еще мы можем сделать, чтобы эта работа снова.

Ответы [ 5 ]

2 голосов
/ 25 апреля 2017

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

Мои формы были формами ввода данных в мастер-таблицу и были настроены на Pop-up и Modal с Me.Form.Name, отправленным в качестве параметра в команде DoCmd.OpenForm с помощью кнопки (событие OnClick), расположенной рядом с элементами управления Combo в форме транзакции, чтобы позволить пользователю быстро добавлять новые записи. Это значение параметра было выбрано в событии Form_Open(Cancel As Integer) и использовано позже для обновления поля со списком (Forms!<formname>.Controls!<controlname>.Requery) после отправки данных в основную таблицу с помощью всплывающей формы.

Похоже, что событие Open не возникает, когда вы активируете уже открытую форму (ссылка: https://msdn.microsoft.com/en-us/library/office/aa211439(v=office.11).aspx). Каждый раз, когда я получал ошибку, моя форма ввода данных была открыта в представлении «Дизайн» в Access. Я закрыл форму в режиме конструктора и повторил шаги. И вуаля! Без ошибок!

Поскольку у меня будет открыто более одной формы, теперь мне нужно протестировать и попытаться использовать Form_Activate(), как рекомендовано в приведенной выше ссылке MSDN.

0 голосов
/ 26 февраля 2009

Я не знаю, квалифицируется ли это как ответ, но код в этом событии OnOpen зависит от множества внешних функций. В частности, код назначает списки значений для RowSources группы комбинированных блоков. Непосредственный красный флажок, который мне приходит в голову, заключается в том, что источники строк, отличные от SQL, имеют конечную длину, а в Access 97 этот предел составлял 2048 символов (в Access 2003 это 32 750 - не спрашивайте меня, почему это число!).

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

Если это фактический ответ, то вы можете написать функцию обратного вызова, которая будет возвращать значения в массивах, и она не будет иметь ограничения на возвращаемую длину. Вы должны установить RowsourceType в качестве имени вашей функции обратного вызова и оставить свойство Rowsource пустым.

Пример функции обратного вызова находится в справке A97 (хотя я не могу найти тот же пример в справке A2K3). В справке A97 вы можете найти это, выполнив поиск RowsourceType, а затем в окне справки нажмите на ссылку в предложении со словами «Вы также можете установить свойство RowSourceType с помощью ____ пользовательской функции ____.» * *

Чтобы проверить это, вам просто нужно узнать длину строки, возвращаемой из GetValueListArray () каждым массивом, на который есть ссылка в событии OnOpen.

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

И, наконец, позвольте мне сказать, что это выглядит как ужасное программирование. Мне кажется, большая часть этого должна быть настроена с использованием свойств по умолчанию. Я также подвергаю сомнению такую ​​зависимость от OpenArgs с таким недокументированным значением ввода. Что значит "5"? А что значит "1"? Это где-то задокументировано? Это просто ужас, ужасный код, на мой взгляд.

Я бы, скорее всего, сделал это с помощью автономного модуля класса, потому что это будет самодокументировано с точки зрения того, что делает что. Вы установили бы конкретное именованное свойство равным 5, и это управляло бы тем, что форма получает от методов модуля класса для заполнения полей со списком. Все это будет в одном месте, и вы можете использовать осмысленное имя свойства, чтобы прояснить, что представляют значения 5 и 1. Это особенно полезно, если у вас есть один и тот же код в событии OnOpen нескольких форм. В этом случае нетрудно переместить его из модулей формы, и единственный вопрос заключается в том, поместите ли вы его в обычный модуль или в отдельный модуль класса (как я предлагаю).

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

0 голосов
/ 24 февраля 2009

Какой код у формы frmNewPeerGroup? Какую версию Access вы используете? Если это 2003, sp3 вызывает проблемы, для которых есть исправление. Вы пробовали декомпилировать и / или сжимать и восстанавливать?

Если у вас есть оригинальный mdb, проверьте ссылки, чтобы убедиться, что ни одна из них не помечена как MISSING. Это вполне вероятная причина проблемы в том, что она внезапно возникла.

Чтобы проверить ссылки, посмотрите Инструменты-> Ссылки в меню для окна с кодом.

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

0 голосов
/ 24 февраля 2009
  • Вы уверены, что одна из обязательных ссылок (VBA IDE> Option> References) не пропущена?

  • Если вы ссылаетесь на Excel / Word или внешние объекты, уверены ли вы, что ссылки на библиотеки типов правильные (если вы используете конкретные версии вместо позднего связывания )

  • Вы случайно не собираете MDE на 64-битной машине?

0 голосов
/ 24 февраля 2009

Может ли это быть в настройках безопасности Access? Все последние версии Access имеют диалоговое окно настроек безопасности, где вы можете включить (или отключить) макросы в приложении. Я думаю вы получите эту ошибку, если макросы отключены.

...