I think your difficulty is that you are trying to indirectly reference a variable from another variable. This is an example of self-modifying code. But that is (generally) bad program design.
You can't do this in VBA (that I know of) because the time at which the variable name is still available is not when you would like it to be. I.e. when you have the name of the variable you want to select, the symbol table name is no longer available. And VBA is one of those languages that does not contain a true "pointer" type of variable so you can't approach it that way.
Now if you had a record containing all the possible variables as part of a recordset, you could try this:
stSelectorName = "MyVar"
stValue = recordset.Fields(stSelectorName)
Which would work correctly if you had a field name "MyVar" in the recordset.
But the corresponding syntax doesn't necessarily work for a module because of visibility and recursion issues. For instance, suppose the variable you wanted was public and in a general module, but it was in a function or subroutine for which recursion was a very real possibility? Which instantiation of the public variable is the one you want? The Module object does not have a collection called "Variables" in it, so there is no syntax analogous to the .Fields syntax for recordsets and tabledefs.
For that matter, this kind of reference doesn't work in ANY language I know of that goes through a compile or semi-compile (meta-code) phase. And VBA does, indeed, go through a semi-compile. VB goes through a full compile. Only fully interpretive languages that support run-time variable substitution can support this type of feature. This is something like you might do in a command-line language such as DOS .BAT files or OpenVMS .COM files or UNIX interpretive shell scripts.
To do this in code to the RIGHT of an assignment statement, you might try a switch function or a Select Case syntax. This could maybe work if all you are going to do is try to get back a value based on some other item's value as a selector.
Look up Switch in the Help files. Basically, it is a run-time text-oriented Case statement. Not very efficient and the more options you give it, the clunkier it is. But it is the only way I can think of offhand to do what you are trying to do. And I'll not make any guarantees even for Switch. For instance, if you try to do this in a query outside the module containing the variable name, you are still in the same boat you were in earlier. Because in order to use this, you MUST have something in the context of the module containing the named variable.
Don't even BEGIN to ask about how to make this variable the LEFT side of your assignment statement. If you have to do this, you are doing something wrong. Trust me on this. No matter who said you should do such a thing, you have my permission to slap them up the side of the head with a very wet rubber chicken.
(Well, you COULD do the left-hand-side case in code with another Select Case... but again, yecch!)
So, now having pooh-poohed your idea, here is how you do it in code (but still not in queries...) Like I said, you cannot reference a variable this way. So for this to work, it cannot be a variable. Make it something else that CAN be reference by run-time text resolution. Like a field.
Create a table that holds all such variables that can be referenced in this manner. Each field in the table is one of your variables. Empty the table (erase it so it has no records.)
Now open a table-type recordset to this table. Do an .AddNew on it. Load initial values to all variables contained therein. Update the recordset but do not do a .Move variant.
From that point forward, you can use syntax as shown earlier.
recset.Fields(fieldname) = x ...
recset.Update
or
x = recset.Fields(fieldname)...
where fieldname is the name of the variable in which you have the name of the REAL variable, which MUST match one of the fields in the recordset.
Always, always, always remember to close the recordset when you are done. Always always always remember to ERASE the recordset when appropriate.
Remember that a record in a table has approximately a 2Kb limit when doing this. So if you have too many variables for this to be held in a single record, use more than one recordset.
And if you tell anyone I told you how to do this, I'll deny it on a stack of bibles.