Доступ к VBA: введите выражение в пользовательской форме, сохраните вычисленный результат в таблице?

#database #ms-access #vba #user-input #ms-access-2010

#База данных #ms-access #vba #пользовательский ввод #ms-access-2010

Вопрос:

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

Например:

  1. Пользователь вводит «1 5» в текстовое поле.
  2. Ответ 6 сохраняется в таблице базы данных.

В настоящее время ввод «1 5» в поле моей числовой формы приводит к повторной ошибке: «ввод текста в числовое поле». Есть ли какой-нибудь способ сделать это?

Ответ №1:

Вы можете написать скрипт VBA для анализа входных данных и выполнения любых необходимых вычислений. Это может быть вызвано событием BeforeUpdate несвязанного поля формы.

Шаги:

  1. Создайте поле с именем Field1 для вычисляемого значения (привязанного к соответствующему полю базы данных).
  2. Добавьте в свою форму несвязанное поле и назовите его Input1.
  3. В режиме конструктора щелкните правой кнопкой мыши на Input1 и выберите Свойства. В разделе События -> Перед обновлением нажмите кнопку «…».
  4. Вставьте код VBA, который я написал (ниже).
  5. Сохраните изменения и закройте редактор VBA.
  6. Вернитесь в представление формы и введите выражение в поле ввода 1 . Когда вы выходите из поля, выражение будет вычислено, и значение появится в Field1.

Обратите внимание, что по соображениям безопасности и / или целостности данных вам может потребоваться очистить ваш пользовательский ввод, прежде чем оценивать его как выражение. Детали «как» и «почему» выходят за рамки исходного вопроса.

 Private Sub Input1_BeforeUpdate(Cancel As Integer)
  ' TO-DO: Validate/sanitize input as necessary for security amp; validity;
  '        Exit Sub prior to the Eval() if we see something we don't like
  Dim result As Variant
  result = Eval(Input1.Value)                ' Evaluate the contents of Input1
  If IsNumeric(result) Then Field1 = result  ' Save any numeric result to Field1
End Sub
  

Комментарии:

1. Спасибо, есть какие-нибудь советы по его разбору? Я пробовал eval() и такие вещи, как cdbl(). т.е. me.mytotal = eval(me.mytotal)

2. Большое спасибо. Ваше решение работает, если я использую отдельное поле, но я надеялся сделать это в том же поле (много полей ввода данных, поэтому удвоение чисел не является предпочтительным).

3. Вы можете заставить это решение вести себя точно так, как если бы оно находилось в том же поле. Просто щелкните правой кнопкой мыши Input1 и Layout-> Удалить. Снова щелкните правой кнопкой мыши Input1 и расположите -> Вывести на передний план. Переместите Input1 так, чтобы он находился точно поверх Field1. Щелкните правой кнопкой мыши Ввод1 и выберите Свойства. На вкладке Формат Input1 верните стиль на прозрачный. На вкладке События Input1 нажмите кнопку «…» для события «Потерянный фокус» и добавьте одну строку в подраздел Input1_LostFocus: Input1 = Null . Сохраните изменения в редакторе VBA. Наконец, на вкладке Данных Field1 установите значение Enabled на No и Locked на Yes. Сохраните форму и протестируйте.

4. Спасибо, Майлз. Хорошее решение, но слишком много усилий, слишком много полей, и все, вероятно, будут иметь такой ввод, я думаю, что я закрою приложение в Excel и добавлю основные функции данных, которые мне нужны, вместо того, чтобы использовать правильную базу данных.