I think your problem is that you have bound the left box to a sql statement that excludes anything in the right box. When you think of it, after the first loop, you have removed that item from the left box. Now the row count and index (ItemData.varItem) has changed so the code selects from the start of the list. You cannot expect to maintain the list of selected items if you're going to change the index.
You'll have to design some other way. Easiest is probably to copy the items to the right box, but to do that, it doesn't have to be bound. Just use the .AddItem (varItem) approach. If you have to move them, maybe loop the items then build sql statements that add or delete as needed. You probably could also use an array, but why complicate things?
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.