EXCEL - Calcul avant impressions automatiques

Résolu/Fermé
Khanonji - 26 août 2010 à 23:56
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 28 août 2010 à 10:59
Bonjour,

Je débute en VBA et je planche sur ce problème depuis un bon moment donc je m'en remets à vous, spécialistes, pour m'aider à trouver une solution.

J'ai créé un fichier Excel qui, lorsqu'on clique sur un bouton, copie la feuille "Fiche de suivi type" en autant d'exemplaires qu'il y a de lignes dans ma feuille "Tableau" et remplace les champs prévus par les éléments de ces lignes (une ligne = une feuille "Fiche de suivi n°.."). Un autre bouton me permet de supprimer toutes les feuilles sauf "Tableau" et "Fiche de suivi type". Jusque là, tout fonctionne.
Par contre, mon troisième bouton qui est censé imprimer toutes les feuilles "Fiche de suivi n°.." ne fonctionne pas correctement et m'imprime la même feuille en autant d'exemplaires que de fiches de suivi différentes attendues.

Remarque : quand je clique sur une fiche de suivi, les données ne s'affichent correctement qu'après un rafraichissement.

Voilà une de mes dernières tentatives (la dernière, pas plus concluante que les autres, étant d'écrire les noms de toutes les fiches de suivi à imprimer en répétant le même code x fois...) :

Private Sub Imprimer_Click()
Dim i, z
Application.DisplayAlerts = False

z = Sheets("Tableau").Range("J2").Value 'Nombre de fiches de suivi à imprimer
Sheets("Fiche de suivi n°01").Select
For i = 1 to z
Calculate
Application.ActivePrinter = "\\serveur\GelSprinter GX 3000 sur Ne05:"
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, _
ActivePrinter:="\\serveur\GelSprinter GX 3000 sur Ne05:", Collate:=True
ActiveSheet.Next.Select
Next i
Application.DisplayAlerts = True
End Sub



J'ai essayé de résoudre le problème de plein de façons différentes :
- en essayant plusieurs modes de changement de feuille
- avec Activate au lieu de Select
- en supprimant la feuille active avant de passer à la suivante (ce qui, à la main, ne nécessite pas de rafraichissement)

Mais rien n'y fait, les feuilles imprimées sont identiques...

J'ai pensé que c'était peut-être un problème de vitesse d'exécution : l'ordinateur n'a peut-être pas le temps de calculer avant que l'impression soit lancée... J'ai donc essayé d'incorporer une instruction permettant de faire une pause pour laisser à l'ordinateur le temps de rafraichir la page mais je ne sais pas où placer Imports System.Threading :

Private Sub Imprimer_Click()
Application.DisplayAlerts = False
Imports System.Threading

Dim z
Dim i As Integer
Dim ThreadEnCours As Thread

ThreadEnCours = System.Threading.Thread.CurrentThread
z = Sheets("Tableau").Range("J2").Value

Sheets("Fiche de suivi n°01").Select

For i = 1 To z
Calculate
ThreadEnCours.Sleep (1000) 'pause en milliseconde
Application.ActivePrinter = "\\serveur\GelSprinter GX 3000 sur Ne05:"
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, _
ActivePrinter:="\\serveur\GelSprinter GX 3000 sur Ne05:", Collate:=True
ActiveWindow.SelectedSheets.Delete
ActiveSheet.Next.Select
Next i

Application.DisplayAlerts = True
End Sub


J'ai aussi essayé avec l'instruction Sleep mais je ne sais pas comment déclarer Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Voilà... c'est un peu long tout ça mais j'ai préféré bien expliquer le problème.

Merci d'avance à ceux qui voudront bien m'aider.

Khanonji
A voir également:

3 réponses

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
Modifié par eriiic le 27/08/2010 à 07:22
Bonjour,

Tu devrais aussi mettre la partie qui numérote tes feuilles...
(je suppose que tu n'as pas désactivé le calcul automatique dans les options)

eric
0
Merci pour ta réactivité, Eric.

Bien entendu, j'ai vérifié que l'option calcul automatique était bien activée dès que j'ai remarqué ce problème d'actualisation.

Alors, j'avais voulu faire simple dans mon message précédent mais en fait j'ai mis 2 fiches de suivi par feuille (pour avoir un format A5) donc il y a quelques lignes en plus. J'ai distingué les cas "moins de 10 fiches"/"au moins 10 fiches" et "nombre de fiches pair"/"nombre de fiches impair" mais ça doit pouvoir se simplifier je pense.

Voici donc la partie qui crée et numérote les fiches :

Private Sub Copie_Click()
Dim i, z
z = Sheets("Tableau").Range("J2").Value

If z < 10 Then
For i = 1 To z
If (i And 1) = 0 Then
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°0" & i
Else
End If
Next i

Else
For i = 1 To 9
If (i And 1) = 0 Then
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°0" & i
Else
End If
Next i

For i = 10 To z
If (i And 1) = 0 Then
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°" & i
Else
End If
Next i
End If


If (z And 1) Then
If z < 10 Then
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°0" & i
Else
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°" & i
End If
Else
End If
End Sub
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
Modifié par eriiic le 27/08/2010 à 22:35
Re,

J(ai peut-être de la crotte dans les yeux mais si je vois la création des feuilles et leur nommage, je ne vois pas que tu inscrives quoique ce soit sur les feuilles.

Je suppose que tu as mis une formule pour récupérer le n° du nom de l'onglet mais (de mémoire) ça ne marche que si le fichier est enregistré. C'est peut-être pour ça que ça coince...

C'est plus simple de mettre ton numéro directement dans une cellule puisque tu as du vba, par ex: [A3]="Fiche de suivi n°" & i

eric
0
Ah oui je suis bête j'ai pas précisé ce point. En fait ma fiche de suivi type possède des cellules hors zone d'impression qui permettent le remplissage des fiches.

C'est fait à l'arrache et risque de piquer les yeux d'un utilisateur averti mais bon...

Cellules hors zone d'impression :
J71=STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;21)
J72=DROITE(J71;2)
K72=CONCATENER("Tableau!A";J72)
K73=CONCATENER("Tableau!B";J72)
K74=CONCATENER("Tableau!C";J72)
K75=CONCATENER("Tableau!D";J72)
K76=CONCATENER("Tableau!E";J72)

Cellules à remplir dans les fiches de suivi :
H12=INDIRECT(K72)
Z12=INDIRECT(K73)
H16=INDIRECT(K74)
Z12=INDIRECT(K75)
H20=INDIRECT(K76)


Comme tu peux le constater, c'est un peu biscornu ^^

Si tu le souhaites, je peux t'envoyer le fichier pour que tu aies un meilleur aperçu du problème.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
28 août 2010 à 00:19
Déjà dans le 1er code tu peux supprimer tous tes cas et remplacer :
ActiveSheet.Name = "Fiche de suivi n°0" & i
par :
ActiveSheet.Name = "Fiche de suivi n°" & right("0" & i,2)
ton n°sera toujours formaté sur 2 chiffres.

et sous cette ligne ajoute (?) :
[J71]= "Fiche de suivi n°" & right("0" & i,2)
pour remplacer ta formule.

Comme tu peux le constater, c'est un peu biscornu ^^
Mais non, c'est beaucoup biscornu. Je n'ai pas eu le courage de remonter les formules pour retrouver la chaine fabriquée...
C'est pourquoi je ne suis pas sûr de la modif en J71, et il faudra mettre un calculate.
Ca serait beaucoup plus simple d'éliminer toutes ces formules et de mettre directement le résultat souhaité dans les cellules par vba

eric
0
Je te remercie pour la simplification au niveau du nommage, ça m'a supprimé plein de lignes.

J'ai également suivi ton conseil et j'ai tout fait par VBA. Résultat : plus aucun problème d'actualisationet l'impression fonctionne sans problème.

Je te montre ce que ça donne maintenant. Si tu as encore des conseils pour améliorer cette partie, ils sont les bienvenus.

Private Sub Copie_Click()
Dim i, z, t
Dim x As Worksheet
z = Sheets("Tableau").Range("J2").Value

If (z And 1) Then
t = (z + 1) / 2
Else
t = z / 2
End If

For i = 1 To t
Sheets("Fiche de suivi type 0").Copy Before:=Sheets("Fiche de suivi type 0")
ActiveSheet.Name = "Fiche de suivi n°" & Right("0" & i, 2)
ActiveSheet.Range("H12").Value = Sheets("Tableau").Cells(2 * i, 1).Value
ActiveSheet.Range("Z12").Value = Sheets("Tableau").Cells(2 * i, 2).Value
ActiveSheet.Range("H16").Value = Sheets("Tableau").Cells(2 * i, 3).Value
ActiveSheet.Range("Z16").Value = Sheets("Tableau").Cells(2 * i, 4).Value
ActiveSheet.Range("J20").Value = Sheets("Tableau").Cells(2 * i, 5).Value
ActiveSheet.Range("BE12").Value = Sheets("Tableau").Cells(2 * i + 1, 1).Value
ActiveSheet.Range("BW12").Value = Sheets("Tableau").Cells(2 * i + 1, 2).Value
ActiveSheet.Range("BE16").Value = Sheets("Tableau").Cells(2 * i + 1, 3).Value
ActiveSheet.Range("BW16").Value = Sheets("Tableau").Cells(2 * i + 1, 4).Value
ActiveSheet.Range("BG20").Value = Sheets("Tableau").Cells(2 * i + 1, 5).Value
Calculate
Next i

End Sub


Encore merci.

Khanonji
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
28 août 2010 à 10:59
Bonjour,

Ben voilà, c'est beaucoup plus court ;-)
A part le calculate qui, je pense, n'est plus nécessaire je ne vois rien d'autre.

eric
0