In transaction VL01N I offer a pushbutton that starts a certain transaction ZSPRINT. But since GuiXT first performs an "Enter" on the VL01N screen, when the user clicks on the button, he gets an error message and the InputScript is terminated. How can I avoid this?

You probably have a pushbutton definition 

Pushbutton (....) "Print ..." process="script.txt"

and an InputScript "script.txt" that starts with

Screen sapmv50a.4001
Enter "/Nzsprint"

In this case, GuiXT first performs an "Enter" on the VL01N screen and you run into the problem that you described.

Instead, please specify the function code  "/Nzsprint" directly in the pushbutton definition:

Pushbutton (....) "Print ..."      "/Nzsprint"   process="script.txt"

and start the InputScript "script.txt" with the first screen of the new transaction zsprint.

Alternatively you can keep your pushbutton definition 

Pushbutton (....) "Print ..." process="script.txt"

and add the command

Enter "/Nzsprint"

in script.txt   b e f o r e   the first Screen command. All statements before the first screen command are executed prior to the "Enter" for this screen, and with your own "Enter" command you can set the new function code "/Nzsprint".