I didn't fix it but learned a couple things. I tried having the program modify the subform's RecordSource rather than modifying Me.Filter. That didn't fix the problem, but it did speed things up because I had separate calls for changing the Filter and OrderBy properties. Combining them into a single change of the RecordSource property really smoothed out some blinking going on while I toggle back and forth between single-form and datasheet views.
The best I could do to deal with the NewRow problem was to create this
Code:
Private Sub NewLineBugHack()
blnSuppressCurrentEffects = True
DoCmd.RunCommand acCmdSubformDatasheet 'switch to single-form view
DoCmd.RunCommand acCmdSubformDatasheet 'switch back to datasheet view
blnSuppressCurrentEffects = False
End Sub Then I put a call to it right after Me.Undo. It's pretty quick so not really visible. I needed to use a flag to suppress the code I have in the OnCurrent event handler which would otherwise run for each of these commands.
Another thing I learned is that if you have code to modify the RecordSource property of a subform and the parent form's AllowAdditions property is set to True, the modification will go through okay but an irritating popup will appear asking you how you want to handle changing the parent form's Recordsource even though you're not touching that RecordSource. It says "to complete this operation access must modify the recordsource property of the current form" and refers to the parent form's RecordSource. You can't get around it by Docmd.SetWarnings on/off, because the default button is Yes, and ignoring means you accept the default option. This wil eliminate the first popup, but just takes you more automatically to another complex popup for creating a query.
So you have to set the parent's AllowAdditions property to False if you want to be able to edit the subform's RecordSource property. Makes perfect sense, right? :/
I really can't believe how amateur Microsoft Access seems to be sometimes.