Nếu bạn từng cần tạo một danh sách các giá trị trường/truy vấn được phân tách bằng dấu phẩy cùng với các thông tin khác từ cơ sở dữ liệu của mình, bạn sẽ biết rằng đó là một nhiệm vụ khó khăn – và hầu hết mọi người đều cho rằng nó không thể thực hiện được. Ví dụ, nếu bạn được yêu cầu tạo báo cáo về 5 nhân viên bán hàng hàng đầu – theo thứ tự giảm dần – cho mỗi tháng trong năm, hoặc 3 cửa hàng gần nhất với mỗi khách hàng, thì bạn có thể phải vật lộn với các truy vấn bảng chéo hoặc kết hợp thủ công các kết quả bên ngoài Access. Nhưng với sự trợ giúp của một chút mã VBA, bạn sẽ tạo ra kết quả như sau chỉ trong vài phút…
| Tháng | John, Sally, Bill |
| Tháng Hai | Sally, Adam, John |
| Tháng Ba | Adam, Sally, Bill |
Đôi khi sẽ rất hữu ích nếu có thể hiển thị danh sách kết quả được phân tách như một phần của truy vấn lớn hơn – danh sách 3 khách hàng lớn nhất cho mỗi đại diện bán hàng, 5 cửa hàng gần nhất với mỗi khách hàng chi tiêu cao nhất của bạn , Danh sách cứ kéo dài.
Dừng việc ghép báo cáo của bạn lại với nhau
Mặc dù có nhiều khả năng lấy chi tiết để tạo loại báo cáo đó nhưng bạn thường phải ghép các kết quả lại với nhau theo cách thủ công bên ngoài Access như một phần của bảng tính hoặc báo cáo.
Đoạn mã sau loại bỏ nhu cầu xử lý các kết quả truy vấn bên ngoài Access và thay vào đó, sẽ cho phép bạn tạo ra loại kết quả được hiển thị ở trên một cách dễ dàng.
Trước tiên, hãy phác thảo những gì chúng ta muốn mã có thể thực hiện:
“Cho một truy vấn, trả về x số kết quả, kết hợp thành một chuỗi được phân cách bằng y”
Trước khi chúng tôi bắt đầu
Trước khi chúng ta xem mã, điều quan trọng cần lưu ý là mặc dù có thể tạo một hàm VBA tổng quát hơn và có khả năng xử lý bất kỳ kết hợp truy vấn nào, nhưng làm như vậy sẽ tạo ra mã khá dài, vì vậy những gì chúng ta sẽ làm trong bài viết này là định nghĩa một trường hợp mẫu và viết hàm xử lý trường hợp đó. Làm theo cách này sẽ giúp bạn dễ dàng tạo lại mã hơn để đáp ứng nhu cầu cụ thể của mình.
Trường hợp mẫu
Chúng tôi có cơ sở dữ liệu bán hàng lưu trữ thông tin chi tiết về giao dịch mua hàng của khách hàng, cùng với danh mục sản phẩm mà giao dịch mua đó thuộc về. Chúng tôi muốn tạo một báo cáo hiển thị 3 danh mục hàng đầu theo tháng theo thứ tự giảm dần.
Để đơn giản, chúng tôi sẽ giữ ví dụ trong một bảng duy nhất, mặc dù bảng chính sẽ hoạt động bất kể thiết lập của bạn như thế nào. Bảng chúng tôi sẽ sử dụng được thiết lập như sau:
| Bán hàng |
| Tên khách hàng |
| Ngày Giao dịch |
| Giá trị giao dịch |
| Phân loại |
Rõ ràng đây là một thiết lập quá đơn giản hóa, nhưng bạn hiểu ý.
Bây giờ - mã
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
Mã – giải thích

Bạn sẽ nhận thấy rằng chúng tôi kiểm tra xem có nên thêm dấu phân cách vào chuỗi hay không – nếu không có bước kiểm tra này, bạn sẽ nhận được chuỗi kết quả được định dạng kém hoặc bạn sẽ phải thêm mã để xóa các dấu phân cách không mong muốn – cách này giữ cho mọi thứ tốt đẹp và gọn gàng ngay từ đầu.
Tất nhiên, bản thân hàm này có thể được gọi từ bên trong truy vấn, báo cáo hoặc bất kỳ nơi nào bạn muốn từ bên trong Access.
Sửa cơ sở dữ liệu truy cập bị hỏng
Nếu bạn gặp phải cơ sở dữ liệu Access bị hỏng Khi bạn chạy đoạn mã trên, tốt hơn hết bạn nên sử dụng một số công cụ chuyên dụng để sửa chữa chúng và khôi phục tất cả các bảng từ cơ sở dữ liệu bị hỏng.
Giới thiệu tác giả:
Mitchell Pond là một chuyên gia phục hồi dữ liệu trong DataNumen, Inc., công ty hàng đầu thế giới về công nghệ khôi phục dữ liệu, bao gồm sửa lỗi SQL và các sản phẩm phần mềm phục hồi excel. Để biết thêm thông tin, hãy truy cập www.datanumennăm