I actually found it better to put code into the 'printbutton_clicked' event on the viewer to show the VB common print dialog.
I found that the users preferred this as just one button (and therefore one dialog) was required to change printer and also print a range of pages. This method did require a new copy of the report to be instantiated (but sent directly to the printer) as the report.printername, report.printerdriver, etc are read only at run time.
I'm not sure about Crystal's own buttons but 'report.printsetup' will call it's own dialog.
Actually just noticed when you posted this... so you're probably don't need my thoughts on the problem!