HOWEVER, you're missing the point of a relational database. In a relational database, we use tables to store data and we want to be as efficient with that as possible so we do not store the same piece of data multiple times. We use queries to retrieve data and a query that joins the tblMain and tblMainCode would bring back both the ID and text value with no problem and no potential for a data anomoly (when you store data twice, you have to ensure that one value doesn't get out of sync with the other.
BUT, there are situations where you would want to pick up an additional value from the lookup table. One example would be an Order Entry application. UnitPrice is the price at a POINT IN TIME and therefore, when you choose a product from the product table, you would also copy the price at that point in time because next week if there is a price change, you wouldn't want it to affect orders that had already shipped.
To expand on Ridders explination, the RowSource of a combo or listbox is a zero-based array. Typically we refer to the first column (which is also almost always the bound column) as Me.cboProductID. But, if we used the .column property, it would be Me.cboProductID.Column(0). To address subsequent columns of the you would use the correct index value. So, assume the RowSource is ProductID, ProductName, UnitPrice.
ProductID is the bound column and is hidden so the combo shows the second column. It could also show the third column if you set the width to something other than zero but the combo at rest will show only the first visible column. To address the UnitPrice (third column) and save it use
Me.txtUnitPrice = Me.cboProductID.Column(2)
In the AfterUpdate event of cboProductID.
If your example is real rather than made up - don't do it. You do not need to store this particular piece of data twice. Use a query with a join for your form/report to pull up the text value.