It is kind of arbitrary limit.
The simple solution is to place your data into a table, and then let the
listbox feed on that table. When you use a query, there is not the same
limit.
Of course when you use a value list as a long string, then a string much
longer then 2000 characters is not the best thing to use anyway. All kinds
of performance problems would arise when you have to work with strings
larger that what is now allowed. It is probably a good idea that the
designers put that limit in, since allowing larger strings would be just
giving the users more rope to hang themselves with.
Further, any listbox with more then 20 or 30 entries is starting to be a bad
interface.
However, if you MUST create this data on the fly, then using temp table is
also a really bad idea. Using a temp table will bypass the limit of a
valuelist, but it will create un-necessary bloat in the application. Thus,
we really want to avoid the use of temp tables.
So, if you can, use a query, or even build the sql in code and just stuff it
into the listbox (this is best solution).
me.MyListBox.RowSource = "select * from table....etc."
If you must, or have to generate the data via code (and cannot come up with
some kind of query), then you can use what is called a call back function to
fill the listbox. The call back function works very well, has no 2000
characters limit, and you can even map the listbox right into a array you
declare. It is very useful when exhaust all other possible solutions.
Check out:
http://www.mvps.org/access/forms/frm0049.htm