Not an expert in ribbon xml but what I don't do is end a starting tag with a slash; e.g. <control idMso="Paste" label="Built-in Paste" enabled="true"> not
<control idMso="Paste" label="Built-in Paste" enabled="true"/>
Also have not tried to pass a parameter to a ribbon function as opposed to having the function call the appropriate procedure. Usually functions have parameters so that you can reuse them for every possible parameter value. If your called function only ever opens the same form, I'd get rid of the parameter.
Perhaps it is as simple as the function call isn't spelled the same way as the function itself. I'd also make sure the form isn't the culprit as I have no idea what Gradebook is.
EDIT - forgot to ask - if you're opening a main form for the application, why have a ribbon button for this as opposed to just loading the form on db opening?
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.