如果您曾经需要从数据库中生成一个包含字段/查询值和其他信息的分隔列表,您就会知道这绝非易事——大多数人甚至认为这是不可能完成的任务。例如,如果您被要求生成一份报告,列出一年中每个月销售额排名前五的销售人员(按降序排列),或者列出距离每位客户最近的三家门店,那么您可能最终只能使用交叉表查询或在 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 数据库 当你运行上面的代码时,最好使用一些专门的工具来修复它们并从损坏的数据库中恢复所有表。
作者简介:
Mitchell Pond 是一位数据恢复专家 DataNumen, Inc.,它是数据恢复技术领域的世界领先者,包括 修复SQL问题 和 excel 恢复软件产品。 欲了解更多信息,请访问 datanumen.com