Note: New addition to this function is the ability to change the final delimiter to get a return like red, white, and blue.
To use any function like this, open a new module. Copy the code from "Function Con..." to "End Function" into the new module. Select Debug|Compile to make sure there are no compile errors. Then save the module as "modConcatenate". You can then use the Concatenate() function as an expression in a query or control source or other places.
Note: When creating a query with this function, make sure you understand the difference between numeric and text fields as noted in the code.
While this sample uses two tables, it could also be used with a single table. It might be easiest to use a totals query to create a pseudo "tblFamily" that is grouped on the appropriate field.
CODE
Function Concatenate(pstrSQL As String, _ Optional pstrDelim As String = ", ", _ Optional pstrLastDelim As String = "") _ As Variant ' Created by Duane Hookom, 2003 ' this code may be included in any application/mdb providing ' this statement is left intact ' example ' tblFamily with FamID as numeric primary key ' tblFamMem with FamID, FirstName, DOB,... ' return a comma separated list of FirstNames ' for a FamID ' John, Mary, Susan
' ======= in a Query ========================= ' SELECT FamID, ' Concatenate("SELECT FirstName FROM tblFamMem ' WHERE FamID =" & [FamID]) as FirstNames ' FROM tblFamily ' ============================================
' to get a return like Duane, Laura, Jake, and Chelsey
' ======= in a Query ========================= ' SELECT FamID, ' Concatenate("SELECT FirstName FROM tblFamMem ' WHERE FamID =" & [FamID], ",",", and ") as FirstNames ' FROM tblFamily ' ============================================
' If FamID is a string rather than numeric, ' it will need to be delimited with quotes
' ======= in a Query ========================= ' SELECT FamID, ' Concatenate("SELECT FirstName FROM tblFamMem ' WHERE FamID =""" & [FamID] & """", ",",", and ") as FirstNames ' FROM tblFamily ' ============================================
'======For DAO uncomment next 4 lines======= '====== comment out ADO below ======= Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset(pstrSQL)
'======For ADO uncomment next two lines===== '====== comment out DAO above ====== 'Dim rs As New ADODB.Recordset 'length before last concatenation Dim intLenB4Last As Integer 'rs.Open pstrSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic Dim strConcat As String 'build return string With rs If Not .EOF Then .MoveFirst Do While Not .EOF intLenB4Last = Len(strConcat) strConcat = strConcat & _ .Fields(0) & pstrDelim .MoveNext Loop End If .Close End With Set rs = Nothing '====== uncomment next line for DAO ======== Set db = Nothing If Len(strConcat) > 0 Then strConcat = Left(strConcat, _ Len(strConcat) - Len(pstrDelim)) If Len(pstrLastDelim) > 0 Then strConcat = Left(strConcat, _ intLenB4Last - Len(pstrDelim) - 1) _ & pstrLastDelim & Mid(strConcat, intLenB4Last + 1) End If End If If Len(strConcat) > 0 Then Concatenate = strConcat Else Concatenate = Null End If End Function