Если вам когда-либо приходилось создавать разделенный список значений поля/запроса вместе с другой информацией из вашей базы данных, вы знаете, что это может быть в лучшемost люди думают, что это невозможно. Если, например, вас попросили составить отчет о том, кто входит в пятерку лучших продавцов (в порядке убывания) за каждый месяц года или в 5 ближайших магазина к каждому покупателю, то вы, возможно, останетесь без ответа. с обработкой перекрестных запросов или ручным объединением результатов вне Access. Но с помощью небольшого кода VBA вы через несколько минут получите следующие результаты…
| Января | Джон, Салли, Билл |
| фев | Салли, Адам, Джон |
| Вт | Адам, Салли, Билл |
Во многих случаях было бы полезно иметь возможность отображать список результатов с разделителями как часть более крупного запроса — список 3 крупнейших клиентов для каждого торгового представителя, 5 ближайших магазинов к каждому из ваших клиентов с самыми высокими расходами. , список можно продолжить.
Хватит сшивать отчет воедино
Хотя более чем возможно получить детали для создания такого отчета, вам обычно приходится вручную сшивать результаты вместе вне Access как часть электронной таблицы или отчета.
Следующий код избавляет от необходимости возиться с результатами запроса вне Access и вместо этого позволяет с легкостью получать результаты, показанные выше.
Во-первых, давайте наметим, что мы хотим, чтобы код мог делать:
«Для заданного запроса вернуть x результатов, объединенных в одну строку, разделенную y»
Прежде чем мы начнем
Прежде чем мы посмотрим на код, важно отметить, что, хотя можно создать более общую функцию VBA, способную обрабатывать любую комбинацию запросов, это приведет к довольно длинному коду, поэтому мы сделаем это в этой статье. заключается в том, чтобы определить пример случая и написать функцию для обработки этого случая. Если вы сделаете это таким образом, вам будет намного проще воссоздать код в соответствии с вашими конкретными потребностями.
Образец дела
У нас есть база данных продаж, в которой хранится информация о покупках клиентов, а также категория продукта, к которой принадлежит покупка. Мы хотим создать отчет, который показывает по месяцам 3 верхние категории в порядке убывания.
Для простоты мы сохраним пример для одной таблицы, хотя принципал будет работать независимо от вашей настройки. Таблица, которую мы будем использовать, настроена следующим образом:
| Распродажа |
| Имя Клиента |
| Дата сделки |
| Значение транзакции |
| Категория |
Очевидно, что это слишком упрощенная установка, но вы поняли идею.
Теперь — код
Public Function CategoryList(Month As String, NumResults As Integer, SortAscending As Boolean, Delimiter As String) As String
Dim sSql, resultString As String
Dim rst As Recordset
Dim firstLine As Boolean
'Create our SQL string using the supplied parameters
sSql = "SELECT TOP " & NumResults & " [category] FROM sales GROUP BY Format([TransactionDate],""mmm""), sales.Category HAVING (((Format([TransactionDate], ""mmm"")) = """ & Month & """))"
If SortAscending Then sSql = sSql & " ORDER BY Sum(sales.TransactionValue) DESC;"
Set rst = CurrentDb.OpenRecordset(sSql)
firstLine = True
'Loop through the results, and create the string to return
With rst
Do While Not .EOF
If Not firstLine Then
resultString = resultString & Delimiter & .Fields("category")
Else
resultString = resultString & .Fields("category")
firstLine = False
End If
.MoveNext
Loop
End With
Set rs = Nothing
CategoryList = resultString
End Function
Код - объяснение

Вы заметите, что мы проверяем, должны ли мы добавлять разделитель в строку или нет — без этой проверки вы получите либо плохо отформатированную результирующую строку, либо вам придется добавить код для удаления нежелательных разделителей — таким образом, с самого начала все будет красиво и аккуратно.
Саму функцию, конечно, можно вызвать из запроса, отчета или откуда угодно из Access.
Исправить поврежденную базу данных доступа
Если вы столкнулись поврежденные базы данных Access когда вы запускаете приведенный выше код, то лучше использовать какой-нибудь специализированный инструмент для их восстановления и восстановления всех таблиц из поврежденных баз данных.
Об авторе:
Митчелл Понд — эксперт по восстановлению данных в DataNumen, Inc., которая является мировым лидером в области технологий восстановления данных, включая исправить проблему с SQL и программные продукты для восстановления Excel. Для получения дополнительной информации посетите www.datanumen.com