I get your idea and I knew instinctively that your "solution" was flawed. I tried to convey that there are ways to do this that do not involve buttons. As I said, YOU decided what the solution was. You chose to not describe the problem. You started this thread KNOWING what your solution was and only needed advice on how to implement it. Therefore, you got a rote answer that doesn't actually solve the problem. It just looks like it works because it works if everyone does everything correctly AND it also only works for the first record in the subform because the button is on the main form and not on the subform. The tag property gets set but it is set for EVERY row because the tag is a property of the FORM, not the RECORD. But your original solution was never optimal and is in fact dangerous in that it relies on the user to remember to do the right thing.
It is only because I persisted AFTER you had a "solution" that we are now at the point where we have a clearer understanding of the problem and are not trying to implement your incorrect solution.
Remove the button. A separate button is not appropriate for this process.
In the subform's BeforeUpdate event, you check the type field. If it is oil, you can check to see if the other required fields are present. If they are not, you can use
Cancel = True to prevent Access from saving the incomplete record and go back and fill in the missing data.
BUT, you still are saying that this data needs to be added to a separate table. The question now becomes - WHY? Why if every new record requires a new pricing record is that pricing data separate? If the price can never be reused, then it doesn't belong in a separate table.
Without that clarification, the suggested solution is still incomplete so there is no point in even providing air code.