I was casting around SE and the web yesterday looking for a way to concatenate specific fields from multiple records together as part of a query/report structure in my Access database. I found this SE question which led me to Allen Browne's ConcatRelated() function here. After getting off on the wrong foot by naming the module the same as the function, I got it working as desired.
However, On my initial attempt to use it in a query, I made a dumb mistake and fed it parameters that equated to "WHERE Employee = " & [Employee]
instead of the correct'WHERE Employee = ' & [Employee] & "'"
necessary to evaluate as a string. This resulted in the expected 3464 (data type mismatch) runtime error but with Allen's modifications it showed the actual string that caused the error. No surprise, I'll just click ok and go fix the SQL. I was surprised to find that didn't work. As soon as I clicked away the msgbox it would come back again. I used Ctrl+Break
to stop the code but clicking End
caused it to go right back to the same error rather than actually ending the Function. The only way I could stop the loop was by clicking Debug
which drops me into the code as expected but I couldn't get out of the code to change the original Query. Hitting reset caused the error to pop again and put me right back in the loop.
I eventually got out of it by commenting everything out of the Error Handler and telling it to Exit Function
. I knew that most likely was only masking the problem so I added a counter and had it increment every time the error handler was called then checked the value in the Immediate window. Sure enough, it would go up by 10 or more each time I clicked somewhere in the query.
What I don't understand is what is causing the error to loop. Err_Handler
should dump it out of the function on the first error since there's nothing telling it to attempt to Resume
and it specifically directs it to Exit_Handler
which resets a couple variables and then does Exit Function
. Even directly putting Exit Function
in Err_Handler
still causes multiple increments to the my error counter. Further experimenting with Debug
highlights the line Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)
. I don't know that it helps that much since it's the first line after the function constructs the value of strSql
. Commenting it out caused the next line to be highlighted.
I know why caused the initial error (my mistake) and that's an easy fix. I'm more interested in the unintended result of the mistake and the loop it created.
tl;dr
- What would cause this error to loop instead of exiting or breaking?
- Why would it seem to occur a finite number of times if error handling calls an immediate exit but adding something like
msgbox
first seems to loop infinitely, or at least until I got tired of clicking. - Is there a way to circumvent this in the code so that it actually stops after the fist error?
I initially was using a table with 600+ records but then experimented further with a small table of only 10 records.
Small Table Query SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames
FROM TestEmpHistory
to reproduce the error.
The table TestEmpHistory
is in the following format:
ID(AutoNum)|Employee|EmpGroup| Other fields not referenced in the query
ID|Employee | EmpGroup|
1 |Employee1| G&A
2 |Employee1| Sales
3 |Employee2| CSR
4 |Employee2| G&A
5 |Employee3| CSR
6 |Employee3|Programming
7 |Employee3| G&A
8 |Employee4| CSR
9 |Employee4| CSR
10|Employee4| Programming
I'm using Access 2016