#ms-access
#ms-access
Вопрос:
моя проблема здесь связана с объединением операторов amp; и .
Я должен объединить текстовые поля с такими именами, как txt1, tx11, txt2, txt21, txt3, txt31 и так далее со следующей окончательной структурой:
**txt1 (txt11), txt2 (txt21), txt3 (txt31)**
где txt1 всегда присутствует, и это единственный, который будет присутствовать и никогда не будет нулевым.
Все остальные текстовые поля могут иметь значение Null, но если есть текст с двузначным значением (например, txt11, txt21, txt31), то перед ним нужна запятая и круглые скобки (кроме первого, txt11, для которого нужны только круглые скобки), чтобы воссоздать приведенную выше структуру.
Проблема в том, что я не могу найти правильную комбинацию amp; и для достижения своей цели, иногда отсутствуют текстовые поля, иногда круглые скобки без текстовых полей внутри и тому подобное.
Есть предложения о том, как действовать дальше?
Ответ №1:
Это должно сработать:
Public Function GetControls
Dim strResult As String
Dim i As Integer
Dim strF As String
strResult = ""
For i = 1 To 33
strF = "txt" amp; i ' setup text box name
If Nz(Me(strF), "") <> "" Then
If strResult <> "" Then strResult = strResult amp; ","
If i >= 11 Then
strResult = strResult amp; "(" amp; Me(strF) amp; ")"
Else
strResult = strResult amp; Me(strF)
End If
Next i
GetControls = strResult
End Function
Таким образом, вышеуказанное можно поместить в форму как общедоступную функцию.
Затем, чтобы отобразить в текстовом поле в этой форме, установите для источника управления значение
=GetControls()
Таким образом, это просто перебирает от 1 до 33.
Скажем, если у первых 5 нет ни одного, то у нас ничего нет.
Если у нас есть один или несколько, то, конечно, мы добавляем «,» с этой проверкой
If strResult <> "" Then strResult = strResult amp; ","
(да, это однострочный фрагмент кода VBA!)
Затем мы проверяем, является ли 11 или больше, и, таким образом, помещаем «() вокруг значения. Но концепция добавления «,» и «()» — это своего рода отдельные задачи.
Кроме того, от 1 до 33 элементов управления? Что ж, я буду держать эту лекцию короткой об отсутствии нормализованных данных здесь.
Вы навсегда будете вынуждены писать всевозможные процедуры для решения таких проблем. И около 99% из них не потребуются — особенно когда дело доходит до того, что вы пытаетесь сообщить об этих данных — вы будете страдать здесь. Таким образом, такие данные таким образом — плохая идея и плохой дизайн. С нормализованными данными вы не будете писать так много циклов. Теперь в этом случае я признаю, что вам понадобится аналогичный цикл, как указано выше, для дочерней таблицы, но вы не будете ограничены 33 значениями, и у вас может быть 2 или 40. Но во время запроса с нормализованными данными вы можете использовать sum() , counts() и даже группировать данные — и вам не нужно менять код, отчеты или что-то еще, если вы решите использовать 2 или 40 значений.
Комментарии:
1. Спасибо, честно говоря, я вообще не рассматривал VBA, я думал о чем-то более приземленном, например, о создании новой текстовой метки и ручном объединении каждой из других текстовых меток с соответствующими операторами, amp; и
2. Ну, вы могли бы — но с более чем 30 элементами управления, это было бы довольно выражением Гарри Болла. Как уже отмечалось, вы МОЖЕТЕ поместить «= MyFunctionName()» в качестве выражения в текстовое поле, и оно будет работать в форме. Но для формы continues, или, скажем, list или report, тогда, вероятно, возможно длинное ужасное выражение.
3. Я понимаю, и я принял к сведению, но моих элементов управления на самом деле всего 6, я назвал их txt11, txt21 .. с двузначными цифрами, чтобы показать, что они должны следовать соответствующим однозначным — txt1, txt2… — вот почему я все еще ищу более быстрый и аккуратный способ использования amp; и для использования в источнике управления (в данных).