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

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

Например:

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

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


person user972489    schedule 30.09.2011    source источник


Ответы (1)


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

Шаги:

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

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

Private Sub Input1_BeforeUpdate(Cancel As Integer)
  ' TO-DO: Validate/sanitize input as necessary for security & 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
person Miles Erickson    schedule 30.09.2011
comment
Спасибо, а есть советы по разбору? Я пробовал eval() и такие вещи, как cdbl(). то есть me.mytotal = eval(me.mytotal) - person user972489; 30.09.2011
comment
Большое спасибо. Ваше решение работает, если я использую отдельное поле, но я надеялся сделать это в том же поле (множество полей ввода данных, поэтому удваивать числа не рекомендуется). - person user972489; 30.09.2011
comment
Вы можете заставить это решение вести себя точно так же, как если бы оно находилось в том же поле. Просто щелкните правой кнопкой мыши Input1 и Layout->Remove. Щелкните правой кнопкой мыши Input1 еще раз и выберите «Позиция» -> «На передний план». Переместите Input1 так, чтобы он был точно поверх Field1. Щелкните правой кнопкой мыши Input1 и выберите «Свойства». На вкладке «Формат» Input1 установите для параметра «Стиль фона» значение «Прозрачный». На вкладке События Input1 нажмите кнопку ... для события Lost Focus и добавьте одну строку в Sub Input1_LostFocus: Input1 = Null. Сохраните изменения в редакторе VBA. Наконец, на вкладке «Данные» Field1 установите для параметра «Включено» значение «Нет», а для параметра «Заблокировано» — значение «Да». Сохраните форму и протестируйте. - person Miles Erickson; 30.09.2011
comment
Спасибо, Майлз. Хорошее решение, но слишком много усилий, слишком много полей, и все, вероятно, будут иметь такой ввод, я думаю, что я скрою приложение, чтобы преуспеть, и добавлю основные функции данных, которые мне нужны, вместо того, чтобы использовать правильную базу данных. - person user972489; 03.10.2011