Циклы в Access VBA - PullRequest
       26

Циклы в Access VBA

1 голос
/ 23 марта 2019

Я новичок в Access VBA, и у меня возникли проблемы с циклом.

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

Введенные пользователем значения являются строками, а все остальное объявляется как double.

У меня есть 200+ комбинаций, которые я тестирую, и я попробовал case операторы, DLookup, do while, do until, if и elseif петли безуспешно.

Я также ограничен ИТ-отделом и не могу использовать код DAO.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 23 марта 2019

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

Такая таблица может быть такой же простой, как содержащая три поля:

  • Символ 1 (текст)
  • Символ 2 (текст)
  • Значение (число)

enter image description here

Затем вы можете заполнить такую ​​таблицу допустимыми комбинациями:

enter image description here

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

Очень упрощенным подходом может быть использование формы с тремя текстовыми полями:

enter image description here

Здесь первые два текстовых поля будут несвязанными и могут называться char1 и char2, а третье текстовое поле может называться result и иметь свойство Control Source , равное:

=DLookup("Value", "LookupTable", "char1 = '" & [char1] & "' and char2 = '" & [char2] & "'")

Это приведет к следующему поведению:

enter image description here

0 голосов
/ 24 марта 2019

Вы можете использовать следующую функцию типа в кнопке формы результата или после события в обоих текстовых полях. Dim resultValue как Integer If DCount ("numeric_value", "tblCombination", "[combn1] = '" & Forms! MyForm! MyUserInputField1 &"'и [combn2] ='" & Forms! myForm! myUserInputField2 & "'")> 0 затем

  resultValue = Dlookup("numeric_value", "tblCombinations", "[combn1] = '" & Forms!myForm!myUserInputField1 & "' and [combn2] = '" & Forms!myForm!myUserInputField2 & "'")

   txtResult = Distance_Calculation(resultValue) 

Иначе Msgbox "Такой комбинации не существует. Пожалуйста, проверьте комбинацию", vbinformation, "Information"

  txtResult = 0

Конец, если

0 голосов
/ 23 марта 2019

Рассмотрите возможность использования Access в качестве базы данных и приложения с графическим интерфейсом, сохраняя 200+ комбинаций в таблице с соответствующим числовым значением. Затем создайте фильтр запросов SQL по вводу пользователя и используйте полученное значение для необходимых вычислений. Ниже требуется создание и использование четырех объектов доступа : таблицы, запроса, формы и модуля.

Таблица (тблКомбинации)

 id  combn1  combn2  numeric_value
  1       A       B            150  
  2       C       D            225
  3       E       F            100 
  4       G       H             75
  5       I       J            200
...

SQL (циклы не нужны; используются значения элемента управления формы Access)

SELECT c.combn1, c.combn2, c.numeric_value
FROM tblCombinations c
WHERE c.combn1 = Forms!myForm!myUserInputField1
  AND c.combn2 = Forms!myForm!myUserInputField2

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

SELECT c.combn1, c.combn2, Distance_Calculation(c.numeric_value) As distance_result
FROM tblCombinations c
WHERE c.combn1 = Forms!myForm!myUserInputField1
  AND c.combn2 = Forms!myForm!myUserInputField2

VBA (место в стандартном модуле)

Public Function Distance_Calculation(num_value As Long) As Double
   ...
   Distance_Calculation = some_value 
End Function
...