Imprimer sous Excel

J'aborde ici la définition d'une imprimante, les impressions conditionnées, la mise en page des feuilles excel, etc.


Imprimante

Montrer la boite de dialogue d'impression : application.dialogs(xlDialogPrint).show

Ordre des arguments à renseigner : range_num, from, to, copies, draft, preview, print_what, color, feed, quality, y_resolution, selection, printer_text, print_to_file, collate.
"From" est donc le deuxième argument, "Copies" le quatrième.

Vous ne pouvez pas les appeler par leur nom mais comme suit : application.dialogs(xlDialogPrint).show arg2:=5, arg4:=2 ( pour une impression en 2 exemplaires à partir de la page 5).

Cela vous permet aussi de spécifier l'imprimante : Application.Dialogs(xlDialogPrint).Show arg13:="Télécopieur"

Reproduire la boîte de dialogue Imprimer de windows : MS Web (information de Jean-Sébastien D.)

Définir l'imprimante à utiliser
: ActivePrinter = "Canon LBP-465 sur LPT1:"
Laisser choisir l'imprimante
: Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show

Une imprimante est-elle définie ou non

attention, elle peut être définie mais non branchée, ...!), technique de andrew ottavio, sujet "Re: Vba: how to test printer is online", le mercredi 13 septembre 2000 16:49

Select Case Left(Application.ActivePrinter, 7)
Case "unknown": printer_active = "No"
Case Else: printer_active = "Yes"
End Select
Then using a if statement:
If printer_active = "Yes" Then
' autres instructions..........
End If

Récupération du nom de l'imprimante : news


Impression

Aperçu avant impression

activesheet.printpreview 'pour la feuille active
worksheets("feuil1").printpreview 'pour la feuille feuil1
activewindow.selectedsheets.printpreview 'pour les feuilles sélectionnées

'pour sa désactivation, une astuce se trouve plus bas

Nombre de pages à l'impression pour la feuille active

msgbox ExecuteExcel4Macro("GET.document(50)") & " pages"

Nombre de pages à l'impression pour la feuille stockée dans la variable sSheetname

msgbox ExecuteExcel4Macro("get.document(50," & """" & _ sSheetname & """" & ")")

Impressions de feuilles & de plages de cellules

range("A1:D25").printout
range("votre plagenommée").printout

activesheet.printout
sheets("feuil3").range("A1:D25").printout
workbooks("toto.xls").worksheets ("feuil1").printout
workbooks("toto.xls").worksheets ("feuil2").range("A1:A5").printout

'pour le fun, la commande ci-dessous imprime la feuille courante en simulant l'envoi de touches
SendKeys ("^p~")

Imprimer une zone variable

nbli = Application.CountIf(Range("E:E"), "~*")
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$" & Format(nbli)
ActiveWindow.SelectedSheets.PrintOut Copies:=1

'd'autres moyens sont envisageables comme utiliser une plage nommée ou construire la référence à une plage

Imprimer la page courante : news Impression de plusieurs feuilles

sheets(array("feuil1","feuil2","feuil3")).printout

sub demo
for each sh in activeworkbook.sheets
sh.activate
sh.printout
next sh
end sub

Imprimer une feuille masquée

sub Test()
application.screenupdating = True
with worksheets("feuil1")
.visible = xlsheetvisible: .printout : .visible = xlsheethidden
end with
end sub

Imprimer un formulaire de type userform ou seulement quelqu'un de ses objets : news Désactivation du bouton "Imprimer" de la fenêtre "Aperçu avant impression"

'Pour cela, il faudra que l'utilisateur accède à l'aperçu par le biais d'une de vos macros affecté à un bouton ou réaffecté dans le menu ou la barre d'outils
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If pre = False Then Cancel = True
    pre = False
End Sub

'Code in Module1
Public pre As Boolean
Public Sub Preview()
    pre = True
    thisworkbook.ActiveSheet.PrintPreview
End Sub

Imprimer les pages paires (de Catherine, sujet: "Re: Impression",  mardi 5 décembre 2000 22:04)

Sub PagesPaires()
For i = 1 To Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")
If Int(i / 2) = i / 2 Then
ActiveSheet.PrintOut From:=i, To:=i, Preview:=True
End If
Next i
End Sub
'Pour imprimer mettre Preview à False, sinon ça te le fait en aperçu (pour vérifier), et pour les pages impaires, au lieu de Int(i / 2) = i / 2 , mettre Int(i / 2) <> i / 2

Impression en ordre inverse

de Thomas Corvaisier, sujet: "Re: impression en ordre inverse", date : lundi 9 octobre 2000 17:04. Cette macro imprime la feuille 1 et respecte l'ordre des pages défini dans les options, mais à l'envers.

Sub Imprime_inverse()

Dim nb_pages As Integer, i As Integer
Application.ScreenUpdating = False

With Sheets("Feuil1") ' remplacer Feuil1 par le nom de votre feuille
.Select
nb_pages = ((.VPageBreaks.Count + 1) * (.HPageBreaks.Count + 1))
For i = nb_pages To 1 Step -1
.PrintOut from:=i, To:=i
Next i
End With
Application.ScreenUpdating = True
End Sub

Exemple d'impression conditionnée (avec boucle tant que/while)

Sub PrintInfo
Dim MyRawData as Worksheet, MyForm as Worksheet, RowCounter as Integer
Set MyRawData = Sheets("RawData")
Set MyForm = Sheets("Form")
RowCounter = 1 'Or row where your data starts

'assuming your table is continuous (no breaks) here's the loop
Do while MyRawData.Cells(RowCounter, "A") <> ""
If MyRawData.Cells(RowCounter, "A") = "Your CONDITION" Then
MyForm.Range("X5").Value = MyRawData.Cells(RowCounter, "D").Value
MyForm.Range("X6").Value = MyRawData.Cells(RowCounter, "F").Value
MyForm.Calculate
MyForm.PrintOut
End If
RowCounter = RowCounter + 1
Loop
end sub

!! D'autres exemples & d'autres problématiques d'impression sont proposées plus bas, notamment dans Exemples Divers
(Impression de zones masquées, de zones discontinues, à une heure fixe, tous les jours, d'enveloppes, des deux côtés, d'un document lié, dans un fichier, etc.).

 


 

Mise en page

Il est possible de définir la mise en page à l'aide du langage VBA comme vous le définissez à travers le menu Fichier (commande Mise en page). VBA vous permet en plus de mettre la valeur de cellules dans les en-têtes ou pied-de-pages ce qui est impossible à travers le menu Fichier.

La mise en page est définie pour une feuille donnée. Le nom VBA de l'objet "Mise en page" est Pagesetup.

Ainsi pour donner un titre à une page, vous pouvez utiliser l'instruction suivante

activesheet.pagesetup.centerheader="Votre titre"


Inscrire le nom du classeur et la date du jour dans le pied-de-page gauche

activesheet.pagesetup.leftfooter = "Page &P of &N"


Inscrire le contenu d'une cellule dans un en-tête ou pied de page

activesheet.pagesetup.leftheader = worksheets("feuil2").range("B5").value
'la valeur de la cellule B5 de la feuille Feuil2 est inscrite dans l'en-tête de gauche.


Inscrire le chemin complet du fichier dans le pied de page central

activesheet.pagesetup.centerfooter = thisworkbook.fullname


Répétition de lignes et colonnes sur chaque page

activesheet.pagesetup.printtitlerows = "$6:$6"
'cf le tableau plus bas pour les colonnes


Comme il y a plusieurs objets à manipuler, vous pouvez utiliser les instructions With & End With pour éviter d'écrire plusieurs fois la même chose. Cela donne :

with activesheet.pagesetup
.centerfooter = thisworkbook.fullname
.leftheader = worksheets("feuil2").range("B5").value
end with


Vous trouverez ci-après les objets d'une mise en page.

with activesheet.pagesetup

En-tête

.Left/Center/Right- Header = ""
Pied-de-page .Left/Center/Right- Footer = ""
Marges .Left/Right/ top/ Bottom/Footer/Header- Margin = application.InchestoPoints(0.787401575)
Imprimer les en-têtes de ligne et de colonne .PrintHeadings = false/true
Quadrillage .PrintGridlines = false/true
Imprimer les commentaires en bas de feuille ou tels quels, ne pas les imprimer .PrintComments = xlPrintSheetend/ xlPrintInPlace/ xlPrintNoComments
Début de la numérotation .FirstPageNumber = xlAutomatic
Centrer les pages .CenterHorizontally = false ou CenterVertically
format italien (paysage) ou portrait .Orientation = xlLandscape 'ou xlPortrait
Ordre d'impression des pages .Order = xldownthenOver/xlOverthendown
Colonnes/lignes à répéter sur chaque page .PrintTitlerows = "$1:$1"
.PrintTitleColumns = "$A:$A"
Qualité d'impression en dpi .PrintQuality = 600
Qualité brouillon .Draft = false/true
Taille du papier .PaperSize = xlPaperA4/xlPaperA4Small/.........
Impression en noir et blanc .BlackAndWhite = false/true
Taille du zoom en % .Zoom = 100
end with

Reproduire la mise en page sur plusieurs feuilles : news

Comment mettre en page des en-têtes et des pieds de page particulier ?

Je souhaite, par exemple, insérer un logo dans un en-tête.

Copie le logo dans la première ligne de la feuille de calcul, et élargis verticalement cette ligne de manière à ce qu'elle contienne la totalité du logo dans sa hauteur. Puis fais Fichier -> Mise en page, va dans l'onglet "Feuille" et sélectionne cette ligne dans la zone "Lignes à répéter en haut". Ce n'est pas un véritable en-tête de page, mais ça revient presque au même. (By L.L)
Voir aussi là : http://www.geocities.com/davemcritchie/excel/logoshd.htm

 


 

DEFINITION DE LA PLAGE D'IMPRESSION

La plage d'impression est l'ensemble des cellules que vous voulez imprimer. Vous pouvez indiquer à Excel quelle est cette plage, en passant par le menu Fichier, puis la commande Zone d'impression> Définir. Suite à cela, Excel va créer pour la feuille en cours (ou les feuilles sélectionnées) une plage nommée dont la référence sera celle de votre plage, la plage est nommée : "Zone_d_impression" ou encore Print_Area"

Sélection de la plage d'impression : Range("Print_Area").Select ou Range("Zone_d_impression").Select

Définition de la plage d'impression :

ActiveSheet.PageSetup.PrintArea = "$A$1:$G$20" 'pour la définir
ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address

Annulation de la plage d'impression

ActiveSheet.PageSetup.PrintArea = "" 'pour l'annuler ou l'affecter à la feuille entière
Essaie de faire Fichier -> Zone d'impression -> Annuler

Annulation des plages d'impression de toutes les feuilles de calcul

Dim Sht As Worksheet
For Each Sht In Worksheets
Sht.PageSetup.PrintArea = ""
Next Sht


Inclure toutes les lignes non vides dans la zone d'impression

Sub setPrintArea()
dim pArea As String
pArea = activesheet.cells.Specialcells(xlConstants).address
activesheet.pagesetup.PrintArea = pArea
end Sub


Autre exemple de définition
, basé sur le nombre de valeurs qui commencent par ~

Sub test()
nbli = Application.CountIf(Range("E:E"), "~*")
With ActiveSheet.PageSetup
.PrintTitleRows = "1:5"
.PrintArea = "$A$1:$G$" & Format(nbli)
End With
ActiveWindow.SelectedSheets.PrintOut Copies:=1
End Sub


Hors sujet : Limiter la zone sur laquelle on peut cliquer ou se déplacer

Vous pouvez définir la zone "scrollable", c'est-à-dire la "surface" sur laquelle vous poouvez vous déplacer, que ce soit à l'aide des barres de défilement ou du clavier.L'exemple suivant limite la zone de A7:G7 jusqu'à A(x+150):G(x +150)

ScrollArea = range("A7", "g" & (range("G7").End(xlDown).rows.Count + 150)).Address


SAUTS DE PAGES

Insérer un saut de page/Limiter le nombre de lignes par page : news
Nombre de pages : nombrePages = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")
Nombre de sauts de pages horizontaux
: ActiveSheet.HPageBreaks.Count
Nombre de sauts de pages verticaux : ActiveSheet.VPageBreaks.Count

Effacer les sauts de page
: Cells.PageBreak = xlPageBreakNone

Nombre limite de sauts possibles
: 1027 ?
Nombre de lignes dans la première page (et toutes celles concernées par le premier saut de page horizontal)
:
NbLignes = ActiveSheet.HPageBreaks(1).Location.Row - 1

Boucler sur les sauts de page

Sub TryItNow()
Dim myItem As HPageBreak
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.HPageBreaks.Count > 1 Then
For Each myItem In ws.HPageBreaks
MsgBox myItem.Location.Address
Next myItem
End If
Next ws
End Sub

Comment mettre en (vba) des sauts de page dans un tableau croisé dynamique apres chaque cellules comportant le mot "somme de..."

Sub SautDePage()
Dim Index As Integer, Nblig As Integer
' ActiveCell est sur la colonne contenant "Somme"
range("A1").Select
Nblig = ActiveCell.End(xldown).Row
For Index = 1 To Nblig
If UCase(Left(ActiveCell, 5)) = "SOMME" Then
sheets.hpagebreaks.Add Before:=ActiveCell.Offset(1, 0)
ActiveCell.Offset(1, 0).Select
Next
End Sub

Insérer des infos dans la ligne avant un saut de page : essayez ce bout de code d'Eric J. pour obtenir le numéro de la ligne d'avant le saut de page

Sub compteurPages()
nombrePages = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")
ReDim nbLignes(nombrePages)
For n = 1 To nombrePages: ligneSaut = Application.ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64)," & n & ")") - 1: Next
End Sub

Sélectionner la énième page d'impression : fichier texte (Août 2004)
Ce fichier texte contient une procédure (et deux fonctions reprenant son code) pour connaître à partir 'un index de page ou d'une plage de cellules l'adresse d'une page X. Elles fonctionnent même si la zone d'impression ne commence par en première ligne, première colonne, mais elles sont très très lentes :-(


EXEMPLES DIVERS

Imprimer une télécopie : news par jean-Yves K.

Imprimer une zone nommée

Sub GetPrintArea()
Set OldSelection = Selection
On Error GoTo NotFound
RangeToPrint = InputBox("Product to print?") 'il faut donner là le nom d'une plage
Application.Goto Reference:=RangeToPrint
Selection.PrintOut
OldSelection.Select
Exit Sub
NotFound: MsgBox "Product not found"
End Sub


Imprimer tous les jours d'un mois sauf le lundi, par Bernard G.
'vérifie si le mois saisi en A1 est bien un mois en se basant sur les trois premiers caractères
'calcule le nombre de jour du mois donné de l'année en cours.

Sub test()
' imprime une feuille pour chaque jour d'un mois donné en A1
Sheets("Feuil1").Activate
mmm = Format(Left(Range("A1"), 3), "<")
dc = InStr("janfevmaravrmaijunjuiaousepoctnovdec", mmm)
mm = (dc + 2) / 3: aa = Year(Now)
jr = Day(DateSerial(aa, mm + 1, 0))
For j = 1 To jr
If Format(DateSerial(aa, mm, j), "dddd") <> "lundi" Then
' ActiveWindow.SelectedSheets.PrintOut
MsgBox "j'imprime " & Format(DateSerial(aa, mm, j), "dddd dd mmmm yyyy")
End If
Next j
End Sub


Impression programmée à heure fixe, par Thomas C.

Sub Programme_le_réveil()
' lance la_macro_qui_imprime à 06h45 heures
Application.OnTime TimeValue("06:45:00"), "La_macro_qui_imprime", _
, True
End Sub

Sub La_Macro_qui_imprime()
'cette macro imprime la feuille Feuil1
thisworkbook.Sheets("Feuil1").PrintOut
' ou, si on est certain que la feuille à imprimer est la feuille
' active :
' Activesheet.PrintOut
End Sub


Imprimer dans un fichier

A) in Excel 97 :

Sub prinTofile()
Dim fileName As String
fileName = "MyPint.prn"

ChDrive "C"
ChDir "C:\My Documents"
If Dir(curdir & "\" & fileName) <> "" Then kill curdir & "\" & fileName
SendKeys fileName & "{enter}"
thisworkbook.Worksheets("Sheet1").PrintOut PrintToFile:=True
End Sub

B) in Excel 2000 :
Time to switch over to Excel2000 where you can specify the filename as follows :
thisworkbook.Worksheets("Sheet1").PrintOut PrintToFile:=True, Prtofilename:="C:\MyTest.prn"

 Impression d'enveloppes, par Bruno M., le 20/10/2000, sujet : "Re: cherche exemples d'impression d'enveloppes à partir d'excel", sur microsoft.public.fr.excel

1) Sur une feuille Excel tu fais ton tableau avec tes intitulés de colonnes qui te serviront de noms de champ.
2) Tu inscris sur chaque ligne les informations souhaitées
3) Tu sélectionnes ton tableau et tu définis un nom pour celui-ci (exemple : MonTab)
4) Tu enregistres ta feuille (exemple : Adresses.xls)

5) Dans Word, tu sélectionnes le menu "Outils", sous menu "Publipostage"
6) Dans la boite de dialogue tu sélectionnes "Créer des enveloppes"
7) Sources de données -> Ouvrir la source de données, et tu recherches ton fichier qui dans l'exemple est "Adresses.xls"
8) Une boite de dialogue te demande alors "Nom ou plage de cellules"
9) Si tu as suivi mon exemple, tu sélectionnes alors "MonTab"
10) Tu n'as plus qu'à choisir tes champs et cliquer sur OK
11) Tu as dorénavant une fusion d'un document Excel sur tes enveloppes sous Word


Impression d'un document Word insérée sous excel dans un lien hypertexte
, avec l'emploi de la fonction API ShellExecute. Approche rappelée par Frédéric S., le 30 Août 2001 sur microsoft.public.fr.excel, sujet : "Re: Help pbl impres fichier.doc sous excel"

'Mettre la déclaration suivante dans un module standard de ton projet :

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

'Puis dans le module de la feuille d'un classeur de ton classeur, on peut choisir de rendre possible l'impression par un clic droit sur une cellule (par exemple)

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
                      Cancel As Boolean)
  Cancel = True
  ShellExecute 0, "print", Target.Value, "", "", 0
End Sub

'L'utilisation de ShellExecute avec l'opération "print" produit le même résultat que le lancement d'une impression par un clic droit dans l'Explorateur sur le nom d'un document (et commande Imprimer dans le menu contextuel). Word s'ouvre, envoie le document vers l'imprimante et se referme sans intervention de
l'utilisateur.

Imprimer des deux côtés (à améliorer) - // Prints on Both Sides of a page, Dana DeLouis

Sub Print_Both_Sides()
Dim pg As Long; TotalPages As Long

With ActiveSheet.PageSetup
.PrintArea = False
.Order = xlOverThenDown
End With

TotalPages = ExecuteExcel4Macro("Get.Document(50)")
For pg = 1 To TotalPages Step 2 : ActiveSheet.PrintOut From:=pg, To:=pg : Next pg ' Print Odd pages
Beep: MsgBox "Turn Pages over...your instructions here."
For pg = 2 To TotalPages Step 2: ActiveSheet.PrintOut From:=pg, To:=pg: Next ' Print Even Pages

End Sub

Impression de zones discontinues

Range("A:A,C:C,F:F").Select : ActiveSheet.PageSetup.PrintArea = Selection.Address 'Zone à imprimer
ActiveWindow.SelectedSheets.PrintPreview 'Visualiser la zone
ActiveWindow.SelectedSheets.PrintOut copies:=1 'Imprimer

Autre message d'un forum anglais : news

Imprimer les zones de cellules non adjacentes, en masquant les cellules non sélectionnées

Sub testimpression
dim Sauve
dim Plage As range, AntiPlage As range, Used As range
Set Used = activesheet.Usedrange
Set Plage = Intersect(Used, range("A:A,C:C,E:E"))
Sauve = Used.formulaLocal
application.screenupdating = false
Used.Clearcontents
Plage = 1
Set AntiPlage = Used.Specialcells(xlCelltypeBlanks)
Used.formulaLocal = Sauve
AntiPlage.select
end sub

Afficher une boîte de définition des lignes et colonnes à l'impression

Application.Dialogs(Excel.XlBuiltInDialog.xlDialogSetPrintTitles).Show

!!! Masquer des cellules non désirées (pour une future impression)

Lisez les exemples dans les fichiers ci-dessous, mais sachez d'ores et déjà que si vous formatez la cellule avec trois points-virgules ";;;", alors celle-ci ne sera visible ni  à l'écran ni à l'impression.

Premier exemple : news
Autres exemples : news


Imprimer en filigrane

l'image qu'on fait apparaître via Format/Feuille/Arrière-plan n'est que pour le plaisir des yeux du travailleur de force face à son écran : elle n'est pas imprimable => FAUX, solution postée par Denny Campbell le 99-03-04 sur le forum de Microsoft.public.excel.programming

Sub ImpFiligrane()
'La Zone d'impression DOIT être préalablement définie

Dim ZoneImpr As Range
Set ZoneImpr = Range(ActiveSheet.PageSetup.PrintArea)
ZoneImpr.CopyPicture xlScreen, xlBitmap
ActiveSheet.Paste destination:=ZoneImpr
ActiveWindow.SelectedSheets.PrintPreview
ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Delete
End Sub


Nettoyer une plage de cellules de ses caractères non imprimables
:

Sub Testclean()
for each cell In range("A1:G7000")
cell.value = application.Worksheetfunction.Clean(cell)
next
end Sub


Imprimer soit en mode portrait, soit en mode paysage, selon la taille de la zone
' Setting page orientation according to print area height and width, by Neil N.

Exemple 1

Sub Orient()
dim wdth as integer, dim hgt as integer, dim PrintRange as range
Set PrintRange = ActiveSheet.Range(cell1:="Print_Area")
hgt = PrintRange.Height * 72 : wdth = PrintRange.Width * 72 'pour obtenir les dimensions de la zone d'impression
if wdth > 7.5 then : ActiveSheet.PageSetup.Orientation = xlLandscape
end sub

Exemple 2

Sub Impression_Selection()
With ActiveSheet.PageSetup
.PrintArea = Selection.Address 'definit la zone d'impression
If Selection.Height > Selection.Width Then .Orientation = xlPortrait Else .Orientation = xlLandscape 'determine l'orientation
.CenterHorizontally = True 'paracheve la mise en page
.CenterVertically = True
End With
With ActiveSheet
.PrintOut 'lance l'impression
.PageSetup.PrintArea = False 'efface la zone d'impression
.DisplayPageBreaks = False 'efface les sauts de page
End With
end sub

Y a-t-il moyen d'imprimer la bordure de bas lors d'un saut de page (ici bordures en double)
Solution par Laurent L.
(Attention, toutes les bordures horizontales des sauts de page sont effacées après l'exécution!)

Sub Imprimer()
ModifLignes xlDouble
Application.Dialogs(xlDialogPrint).Show
ModifLignes xlLineStyleNone
End Sub

Private Sub ModifLignes(Style As Long)
Application.ScreenUpdating = False
For Each HPB In ActiveSheet.HPageBreaks
With HPB.Location.Item(0).Cells
.Resize(1, .CurrentRegion.Columns.Count).Borders(xlEdgeBottom).LineStyle = Style
End With
Next HPB
Application.ScreenUpdating = True
End Sub



PROBLEMES DIVERS

J'ai une feuille Excel de plusieurs pages ou les sauts de pages sont réalisés manuellement par insertion saut de page. D'une imprimante à une autre je suis obligé de régler le % de réduction pour obtenir une largeur d'impression maximum. Je pensais pouvoir utiliser l'option ajuster de la mise en page hors si je l'utilise les sauts de pages manuels ne sont plus respectés. Solution par Catherine :

tu sélectionnes la ligne (ou la zone) la plus large, celle pour laquelle tu veux trouver le meilleur ajustement. Tu vas dans la mise en page demander l'ajustement à une page en largeur. Tu valides. Tu y retournes : il t'affiche alors le % de compression utilisé.
Tu désactives l'ajustement auto en gardant cette valeur : tes sauts de page manuels seront alors actifs, avec la bonne valeur d'ajustement.

La macro impression ne s'éxecute pas (message d'erreur) si elle est liée à un msg ou un bouton de boîte de dialogue alors qu'elle s'exécute sans problème quand je lance la macro "imprimer" seule ou depuis un bouton, là l'impression s'effectue normalement. Solution par Iznogood :
L'impression ne se lance pas tant que la le message ou la feuille de dialogue qui la appelée est actif(ve). Pour s'en sortir utilise un flag du genre :

Public flagImp as boolean

Sub myMacro
flagImp = False
<<Affiche ta feuille de dialogue qui contient le bouton qui lance Message4()>>
If flagImp Then Imprimer
End sub

Sub Message4()
If msgbox(.....) = vbYes then
flagImp=true
else flagimp = false
end if
end sub


Capture des fichiers en sortie d'imprimante : je cherche le moyen de capturer les documents qui sont orientés vers mon imprimante.

Si ces impressions sont lancées en dehors de votre application, regardez du côté de la fonction api suivante : SHChangeNotifyRegister, www.mvps.org/vbnet/code/shell/shchangenotify.htm (jamais vérifié cette piste de Didier L.).
Sinon, si vous croyez que c'est utile, tentez l'impression en double, le double étant l'impression dans un fichier (en utilisant l'évènement Workbook_beforeprint)

 


 

MACROS EVENEMENTIELLES

Pour déclencher une procédure avant l'impression, utiliser la procédure évènementielle
private sub workbook_beforeprint(Cancel As boolean)
........
end sub

 


 

LIENS SUR L'IMPRESSION

http://support.microsoft.com/support/kb/articles/Q143/2/74.asp
HOWTO: Retrieve Printer Name from Windows 95/98 Registry in VB

http://support.microsoft.com/support/kb/articles/Q167/7/35.asp
FIX: Setting Printer to Item in the Printers Collection Fails

http://support.microsoft.com/support/kb/articles/Q145/6/79.ASP
HOWTO: Use the Registry API to Save and Retrieve Setting

http://www.mvps.org/vbnet/code/system/defprinternt.htm

http://support.microsoft.com/support/kb/articles/q166/0/08.asp
ACC: Enumerating Local and Network Printers