Here is a little trick that I use.
I will create a query that has all the fields and calculations that I may want on my Form, but with no criteria at all. Let's call it "BaseQuery".
Create another query based on "BaseQuery" which simply returns all fields. Let's call this "SelectionQuery".
Use this "SelectionQuery" as the Record Source for your final Form. Let's call this "FinalForm".
I then create an Unbound Form where I allow my user to specify all the criteria that they may possibly want (so I think things like TextBoxes, ComboBoxes, CheckBoxes, etc). This is my Criteria Selection Form, so let's call it "CriteriaForm".
Then, I take the user selections and build the SQL Code for the criteria that I need using VBA (it is easy to see what the criteria needs to look like - just create a manual query that has that criteria and switch to "SQL View" to see what the SQL Code needs to look like.
Then, I add that SQL Code for the criteria to SQL code which returns all the fields from my "BaseQuery", i.e.
Code:
Dim mySQL as String
mySQL = "SELECT [BaseQuery].* FROM [BaseQuery] WHERE " & myCriteria
Then, in my VBA code, I will assign this new SQL code to the "SelectionQuery" and open my Form, i.e.
Code:
CurrentDb.QueryDefs(SelectionQuery").SQL = mySQL
DoCmd.OpenForm ("FinalForm")
So everything is run from your "CriteriaForm" where they will enter there criteria and click a Command Button which will return the records they want. So you are not changing the Record Source name each time, you are simply changing the SQL code that the "SelectionQuery" query runs.