J'aborde ici la définition d'une imprimante, les impressions conditionnées, la mise en page des feuilles excel, etc.
Montrer la boite de dialogue d'impression : application.dialogs(xlDialogPrint).showOrdre 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
Récupération du nom de l'imprimante : news Aperçu avant impressionattention, 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
Nombre de pages à l'impression pour la feuille activeactivesheet.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 stockée dans la variable sSheetnamemsgbox ExecuteExcel4Macro("GET.document(50)") & " pages"
Impressions de feuilles & de plages de cellulesmsgbox ExecuteExcel4Macro("get.document(50," & """" & _ sSheetname & """" & ")")
Imprimer une zone variablerange("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 la page courante : news Impression de plusieurs feuillesnbli = 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 une feuille masquéesheets(array("feuil1","feuil2","feuil3")).printout
sub demo
for each sh in activeworkbook.sheets
sh.activate
sh.printout
next sh
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"sub Test()
application.screenupdating = True
with worksheets("feuil1")
.visible = xlsheetvisible: .printout : .visible = xlsheethidden
end with
end sub
Imprimer les pages paires (de Catherine, sujet: "Re: Impression", mardi 5 décembre 2000 22:04)'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
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
Exemple d'impression conditionnée (avec boucle tant que/while)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
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
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.
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 |
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 :Annulation de la plage d'impressionActiveSheet.PageSetup.PrintArea = "$A$1:$G$20" 'pour la définir
ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address
Annulation des plages d'impression de toutes les feuilles de calculActiveSheet.PageSetup.PrintArea = "" 'pour l'annuler ou l'affecter à la feuille entière
Essaie de faire Fichier -> Zone d'impression -> Annuler
Dim Sht As Worksheet
For Each Sht In Worksheets
Sht.PageSetup.PrintArea = ""
Next Sht
Sub setPrintArea()
dim pArea As String
pArea = activesheet.cells.Specialcells(xlConstants).address
activesheet.pagesetup.PrintArea = pArea
end Sub
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
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
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..."
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 pageSub 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
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 :-(
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
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
Sub Programme_le_réveil()
' lance la_macro_qui_imprime à 06h45 heures
Application.OnTime TimeValue("06:45:00"), "La_macro_qui_imprime", _
, True
End SubSub 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
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.excelA) 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 SubB) 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"
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
Imprimer des deux côtés (à améliorer) - // Prints on Both Sides of a page, Dana DeLouis'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.
Impression de zones discontinuesSub Print_Both_Sides()
Dim pg As Long; TotalPages As LongWith ActiveSheet.PageSetup
.PrintArea = False
.Order = xlOverThenDown
End WithTotalPages = 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
Imprimer les zones de cellules non adjacentes, en masquant les cellules non sélectionnéesRange("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 'ImprimerAutre message d'un forum anglais : news
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.
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
Sub Testclean()
for each cell In range("A1:G7000")
cell.value = application.Worksheetfunction.Clean(cell)
next
end Sub
Y a-t-il moyen d'imprimer la bordure de bas lors d'un saut de page (ici bordures en double)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
Sub Imprimer()
ModifLignes xlDouble
Application.Dialogs(xlDialogPrint).Show
ModifLignes xlLineStyleNone
End SubPrivate 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
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.
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 subSub 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)
Pour déclencher une procédure avant l'impression, utiliser la procédure évènementielle
private sub workbook_beforeprint(Cancel As boolean)
........
end sub
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