What you're complaining about is unfortunately, due to the nature of cross tab queries. Since unique row values become field (column) headers, there is no way to know how many fields you'll end up with as that is the dynamic part of the query. If you build a report from a query that has 6 field values today and run it tomorrow and there's 7, you have a problem.
IF your problem is that there is NO data for a quarter (I just noticed you said that earlier) then that is a different problem. A report has an OnNoData event that is meant for this situation. In it, you just cancel the opening of the report. If the calling code balks and reports that the Open event was canceled (2501 maybe) you just trap that error in the calling sub. Maybe that's what you meant from the beginning and we didn't catch on.
If you remain stuck, maybe post a copy of your db for us to fiddle with. Unfortunately I have nothing to work with for this. But I think that this
how can I design the report so that it doesn't error should there be no data in a quarter
may be your real problem, solvable via OnNoData.
If this really is about the usual crosstab query type of report and missing fields, then there are ways around it. Trick is to find one that makes sense to you or at least fits your situation. If for example, this were about months, you ensure that the sql includes them as fields. Sorry, I can't recall if that's just by using the IN clause (one value for every time period) or if the query needs defined parameters.
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.