Thanks for the useful clarification. I'm afraid, though, that isn't really possible. The only thing you *could* do, is run the <surveypage> via a <survey> element (instead of a <block>):
<values>
/ rankstring = ""
/ validranking = false
</values>
<survey mysurvey>
/ pages = [1=mypage]
/ showbackbutton = false
/ showpagenumbers = false
</survey>
<text debug>
/ items = ("<%values.rankstring%>")
/ position = (50%, 5%)
</text>
<surveypage mypage>
/ stimulusframes = [1=debug]
/ questions = [1=r01; 2=r02]
/ ontrialbegin = [values.rankstring=""]
/ ontrialend = [values.rankstring=concat(concat(values.rankstring,dropdown.r01.response),dropdown.r02.response)]
/ ontrialend = [if (
length(values.rankstring) == 2 &&
length(replaceall(values.rankstring, dropdown.r01.response, "")) == 1 &&
length(replaceall(values.rankstring, dropdown.r02.response, "")) == 1
) values.validranking = true else values.validranking = false]
/ branch = [if ( values.validranking == false) surveypage.mypage]
</surveypage>
<dropdown r01>
/ caption = "Rank 1"
/ options = ("Object A", "Object B", "Object C", "Object D")
/ optionvalues = ("A", "B", "C", "D")
/ required = true
</dropdown>
<dropdown r02>
/ caption = "Rank 2"
/ options = ("Object A", "Object B", "Object C", "Object D")
/ optionvalues = ("A", "B", "C", "D")
/ required = true
</dropdown>
That will preserve previous responses, but it has other drawbacks: (1) The results will end up in a separate, differently formatted data file and (2) you will not get any record of how many times a given person had to adjust the ranking until he/she got it right.