The reason this is happening is that the persistent Db object is caching a copy of the QueryDef and its properties (to include the .SQL property). If you call MyPassThruSetDates, then make a change to the SQL for MyPassThru, then call MyPassThruSetDates again, the original SQL overwrites any changes made since the original call to MyPassThruDates.
The solution is to refresh the QueryDefs collection to ensure it is using the most current values:
Sub MyPassThruSetDates(FromDate As Date, ThruDate As Date)
Const FromPattern As String = "(@FromDate datetime = ')([\d/]+)'"
Const ThruPattern As String = "(@ThruDate datetime = ')([\d/]+)'"
Dim qd As DAO.QueryDef
Db.QueryDefs.Refresh ' <--- This is the key!!!
Set qd = Db.QueryDefs("MyPassThru")
qd.SQL = RegExReplace(FromPattern, qd.SQL, "$1" & Format(FromDate, "m/d/yyyy") & "'")
qd.SQL = RegExReplace(ThruPattern, qd.SQL, "$1" & Format(ThruDate, "m/d/yyyy") & "'")
Set qd = Nothing
End Sub
For further explanation of why this happens, refer to the following heavily-commented test routine:
Sub TestDbCache()
Const QName As String = "TempQry"
Dim qd As DAO.QueryDef, db As DAO.Database
'First, we create a querydef
Set db = CurrentDb
Set qd = db.CreateQueryDef(QName, "SELECT 'original'")
Debug.Print qd.SQL '--> SELECT 'original';
'Next, we update the querydef's .SQL outside the scope of our db object
CurrentDb.QueryDefs(QName).SQL = "SELECT 'changed'"
'The querydef and db objects are unaware of the change to .SQL
Debug.Print qd.SQL '--> SELECT 'original';
Debug.Print db.QueryDefs(QName).SQL '--> SELECT 'original';
Debug.Print CurrentDb.QueryDefs(QName).SQL '--> SELECT 'changed';
'Refreshing the collection updates both the db and qd objects
db.QueryDefs.Refresh
Debug.Print qd.SQL '--> SELECT 'changed';
Debug.Print db.QueryDefs(QName).SQL '--> SELECT 'changed';
'Note that the .SQL is "SELECT 'changed'" when we set the NewDb object
Dim NewDb As DAO.Database
Set NewDb = CurrentDb
'We change the .SQL without refreshing the NewDb's QueryDefs collection
CurrentDb.QueryDefs(QName).SQL = "SELECT 'changed again'"
'Since the NewDb object never cached the contents of the query,
' it returns the correct current value of .SQL
Debug.Print NewDb.QueryDefs(QName).SQL '--> SELECT 'changed again';
'The other db object has not refreshed its QueryDefs collection,
' so it is wrong once again
Debug.Print qd.SQL '--> SELECT 'changed';
Debug.Print db.QueryDefs(QName).SQL '--> SELECT 'changed';
End Sub