RE: VB6 Impression peu orthodoxe (Urgent)

Kouran666 Messages postés 20 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 décembre 2004 - 1 déc. 2004 à 11:27
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 - 1 déc. 2004 à 22:40
Merci à tous ceux qui ont tenter de résoudre mon problème d'impression. Malheureusement le problème continue.

Réexplication du problème :
Lors d'impression multipages (impression simple aucun problème) se lance, suite à ma tâche d'impression, une tâche de plusieurs 10ène de pages. le résultat est l'impression anarchique de diverses éléments de la flexgrid jusqu'au manque de papier dans la plupart des cas (type un mot par feuille).

Voici mon algo d'impression multipages Tel qu'il est actuellement :

'Si plus d'une page lancement procédure
Private Sub PageSuivante()

j = Currentj

On Error GoTo Err_Imprimante
With Printer
.NewPage
.Font = "MS Sans Serif"
Printer.ScaleMode = 7
.CurrentX = 13.5
.CurrentY = 27.5
Printer.Print "Page : " & .Page & "/" & nbPages
.FontBold = True
Printer.Line (0.5, 3.5)-(20.5, 3.5), vbBlack

.FontSize = 10
For i = 0 To 7
.CurrentY = 3
With MSFlexGrid1
.Col = i
.Row = 0
End With
If i = 0 Then
.CurrentX = 1
ElseIf i = 1 Then
.CurrentX = 4.5
ElseIf i = 2 Then
GoTo Suivant4
ElseIf i = 3 Then
.CurrentX = 11.6
ElseIf i = 4 Then
.CurrentX = 14.1
ElseIf i = 5 Then
.CurrentX = 15.3
ElseIf i = 6 Then
.CurrentX = 16.9
Else
.CurrentX = 17.8
End If
Printer.Print MSFlexGrid1.Text
Suivant4:
Next i

.FontSize = 9
.FontBold = False
For j = j To Compteur - 1
For i = 0 To 7
.CurrentY = 3.1 + 0.5 * (j - nbLignes)
With MSFlexGrid1
.Col = i
.Row = j
End With
If i = 0 Then
.CurrentX = 0.5
ElseIf i = 1 Then
.FontSize = 8
.CurrentX = 2.7
If Len(MSFlexGrid1.Text) > 18 Then
TextAbreg = Left(MSFlexGrid1.Text, 60)
Printer.Print TextAbreg
GoTo Suivant3
End If
ElseIf i = 2 Then
GoTo Suivant3
ElseIf i = 3 Then
.CurrentX = 11.3
If Len(MSFlexGrid1.Text) > 18 Then
TextAbreg = Left(MSFlexGrid1.Text, 18)
Printer.Print TextAbreg
GoTo Suivant3
End If
ElseIf i = 4 Then
.FontSize = 9
.CurrentX = 14.1 + 0.75 - .TextWidth(MSFlexGrid1.Text)
ElseIf i = 5 Then
.CurrentX = 15.8 + 0.7 - .TextWidth(MSFlexGrid1.Text)
If MSFlexGrid1.Text = "0.00" Then
GoTo Suivant3
End If
ElseIf i = 6 Then
.CurrentX = 17 + 0.5 - .TextWidth(MSFlexGrid1.Text)
Else
.CurrentX = 18.3 + 1.5 - .TextWidth(MSFlexGrid1.Text)
End If
Printer.Print MSFlexGrid1.Text
Suivant3:
Next i
If j - nbLignes > 39 And j < Compteur - 1 Then
nbLignes = j - 1
Currentj = j + 1
Printer.EndDoc
PageSuivante ElseIf j Compteur - 1 And Imprime True Then
Imprime = False
FinImpression ' procédure d'impression de bas de page
End If
Next j

End With

Exit Sub

Err_Imprimante:
Printer.KillDoc
Printer.EndDoc
MsgBox "Erreur Interne de l'imprimante"

End Sub

Merci d'avance à tous pour votre aide.

4 réponses

Kouran666 Messages postés 20 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 décembre 2004
1 déc. 2004 à 16:15
Correctif du dernier IF, même si cela n'a rien changer au problème :

If j - nbLignes > 39 And j < Compteur - 1 And Imprime = True Then
nbLignes = j - 1
Currentj = j + 1
PageSuivante ElseIf j Compteur - 1 And Imprime True Then
Imprime = False
FinImpression
End If
0
dthuler Messages postés 121 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 29 avril 2009
1 déc. 2004 à 17:09
Du point de vue logique, j'essaierai une inversion des lignes
Printer.KillDoc
Printer.EndDoc

(KillDoc après EndDoc, mais je pense pas que ça puisse résoudre ton problème).

Sinon, as-tu ce problème avec une seule imprimante ou plusieurs modèles différents font-ils la même erreur?

~~ Brainiax ~~ 8-)
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
1 déc. 2004 à 19:09
salut

à mon avis :
- le Printer.EndDoc après Printer.KillDoc ne sert à rien
- Printer.EndDoc indique la fin d'impression mono ou multi page peu importe mais si tu as plusieurs pages à imprimer tu fais un seul enddoc à la fin...
- éviter la récursivité quand on peut s'en passer...

sinon, j'ai essayé de deviner à quoi correspondent tes variables :
je mettrais cela (sans savoir vraiment ce que tu veux faire)
'si ce n'est toujours pas ca : explique ce que tu veux faire et à quoi correspondent tes variables (globales ?)

Sub Header()
With Printer
.Font = "MS Sans Serif"
Printer.ScaleMode = 7
.CurrentX = 13.5
.CurrentY = 27.5
Printer.Print "Page : " & .Page & "/" & nbPages
.FontBold = True
Printer.Line (0.5, 3.5)-(20.5, 3.5), vbBlack
.FontSize = 10
For i = 0 To 7
.CurrentY = 3
With MSFlexGrid1
.Col = i
.Row = 0
End With
If i = 0 Then
.CurrentX = 1
ElseIf i = 1 Then
.CurrentX = 4.5
ElseIf i = 2 Then
GoTo Suivant4
ElseIf i = 3 Then
.CurrentX = 11.6
ElseIf i = 4 Then
.CurrentX = 14.1
ElseIf i = 5 Then
.CurrentX = 15.3
ElseIf i = 6 Then
.CurrentX = 16.9
Else
.CurrentX = 17.8
End If
Printer.Print MSFlexGrid1.Text
Suivant4:
Next i
End With
End Sub

'Si plus d'une page lancement procédure
Private Sub PageSuivante()
Dim jj As Long, Compteur As Long, nbLignesImprimées As Long

On Error GoTo Err_Imprimante
With Printer
.FontSize = 9
.FontBold = False
' jj = 0
For j = 0 To nbLignes - 1
For i = 0 To 7
.CurrentY = 3.1 + 0.5 * (j - nbLignes)
With MSFlexGrid1
.Col = i
.Row = j
End With
If i = 0 Then
.CurrentX = 0.5
ElseIf i = 1 Then
.FontSize = 8
.CurrentX = 2.7
If Len(MSFlexGrid1.Text) > 18 Then
TextAbreg = Left(MSFlexGrid1.Text, 60)
Printer.Print TextAbreg
GoTo Suivant3
End If
ElseIf i = 2 Then
GoTo Suivant3
ElseIf i = 3 Then
.CurrentX = 11.3
If Len(MSFlexGrid1.Text) > 18 Then
TextAbreg = Left(MSFlexGrid1.Text, 18)
Printer.Print TextAbreg
GoTo Suivant3
End If
ElseIf i = 4 Then
.FontSize = 9
.CurrentX = 14.1 + 0.75 - .TextWidth(MSFlexGrid1.Text)
ElseIf i = 5 Then
.CurrentX = 15.8 + 0.7 - .TextWidth(MSFlexGrid1.Text)
If MSFlexGrid1.Text = "0.00" Then
GoTo Suivant3
End If
ElseIf i = 6 Then
.CurrentX = 17 + 0.5 - .TextWidth(MSFlexGrid1.Text)
Else
.CurrentX = 18.3 + 1.5 - .TextWidth(MSFlexGrid1.Text)
End If
Printer.Print MSFlexGrid1.Text
Suivant3:
Next i
If Compteur = nb_de_ligne_par_pages Then
FinImpression 'bas de page
Compteur = 0
nbLignesImprimées = nbLignesImprimées + nb_de_ligne_par_pages
If nbLignesImprimées < nbLignes Then
Printer.NewPage
Header
End If
Else
Compteur = Compteur + 1
End If
Next j
End With
Printer.EndDoc

Exit Sub

Err_Imprimante:
Printer.KillDoc
MsgBox "Erreur Interne de l'imprimante"

End Sub

ShareVB
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
1 déc. 2004 à 22:40
labout
Le print ENDDOC est à mettre uniquement en fin
c'est printer.NewPage qu'il faut entre chaque page
@+
0
Rejoignez-nous