2009-02-24 6 views
0

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

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

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. 

Это ошибка messag я получаю.

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

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

+0

Я добавил несколько заметок в свой ответ. – Fionnuala

+0

Добавьте обработчик ошибок в событие OnOpen формы, это, скорее всего, станет более ясным, где проблема. –

+0

Кроме того, я никогда не писал такого кода. Это выглядит катастрофой для меня, как если бы это было написано беженцем из VB, который не имеет понятия о кодировании VBA. –

ответ

0

Я не знаю, соответствует ли это ответ, но код в этом событии OnOpen зависит от множества внешних функций. В частности, код присваивает списки значений для RowSources из группы комбинированных ящиков. Непосредственный красный флаг, который возникает для меня, заключается в том, что не-SQL Rowsources имеют конечную длину, а в 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

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

0

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

0

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

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

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

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

+0

Приложение разработано в Access 97. Приложение декомпилировано и уплотнено и преобразовано в файл mde и запущено на всех концах пользователей. В конце пользователя все пользователи работают под управлением Access 97. – chinnagaja

+0

Можно ли получить копию оригинала и опубликовать код для frmNewPeerGroup? – Fionnuala

+0

Кроме того, если у вас есть такая копия, проверьте ссылки, чтобы убедиться, что ни одна из них не отмечена как пропавшая. Это довольно вероятная причина для проблемы в том, что она внезапно произошла. – Fionnuala

0
  • Вы не уверены, что одна из требуемых ссылок (VBA IDE> Option> References) отсутствует?

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

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

+0

Мое развитие от конца доступа. Где я могу найти меню VBA> Вариант Да У меня есть объект word внутри формы FrmNewPeerGroup Файлы MDE строятся только на одной машине. Я уверен, что это не 64-битная машина. – chinnagaja

+0

Я не думаю, что это относится к Access 97. – Fionnuala

+0

Ничего, - позже пост объяснил это. –

2

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

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

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

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