IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer la liste des imprimantes disponibles


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Récupérer la liste des imprimantes disponibles
    Bonjour,

    J'ai une macro qui exporte mon classeur dans un fichier pdf. Pour cela, j'imprime via Acrobat Distiller.
    Le code marche bien sur mon ordi en sélectionnant dans la ligne de code le nom de mon imprimante, dans le cas précis, elle s'appelle "Adobe PDF"
    Par contre, chez certains de mes collègues, l'imprimante Distiller s'appelle "Acrobat Distiller" et chez eux, l'impression exporte un fichier pdf en noir et blanc.. (il trouve pas l'imprimante mais il arrive à générer un fichier pdf quand même)

    Si j'inverse le nom de l'imprimante dans le code, c'est l'inverse, c'est moi qui fait du noir et blanc et eux de la couleur...

    Donc, j'aimerais savoir s'il est possible de récupérer la liste des imprimantes disponibles sur le PC de l'utilisateur. Après, ça me permet de chercher dans les imprimantes disponibles celle d'Adobe (et son nom) pour renseigner ainsi la ligne de code d'impression

    Merci d'avance

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    As-tu essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Dialogs(xlDialogPrinterSetup).Show
    Une fois l'imprimante sélectionnée,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.SelectedSheets.PrintOut Copies:=1

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Bonjour Maluje, ouskelnor

    ci dessous liste des imprimantes nommées sur le poste client que tu peux utiliser ensuite en variable dans un code; d'après un script activexpert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Sub lister_imprimantes()
    'travaille sur le poste client
    strComputer = "."
    'appel WMI
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
     
    Set imprimantesinstallées = objWMIService.ExecQuery _
        ("Select * from Win32_Printer")
    'restitution
    For Each imprimante In imprimantesinstallées
        defaut = ""
        If imprimante.Default Then
        defaut = "imprimante par défaut"
        End If
        MsgBox "Nom: " & imprimante.Name & vbCr _
        & defaut
    Next
     
    End Sub
    Michel_M

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    je vois

    sauf que ça donne un choix à faire pour l'utilisateur et je ne veux pas lui laisser le choix, d'un part pour limiter les interactions qu'il doit avoir avec l'application et de l'autre pour pas qu'il me spécifie une vraie imprimante (ce qui m'imposerait en plus de récupérer le nom de l'imprimante qu'il a choisi pour valider ou non l'impression)

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    Et moi je ne me sers ni d'une boîte de dialogue, ni de ce lourdaud de FSO (juste pour manifester, comme d'hab ...)... et reste ainsi indépendant !

    Une listbox nommé List1 et

    code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
    Private Type PRINTER_INFO_1
      flags As Long
      pDescription As String
      pName As String
      pComment As String
    End Type
    Private Sub UserForm_Initialize()
      Dim mamem() As Long, printinfo() As PRINTER_INFO_1, numbytes As Long
      Dim nums As Long, nbimpris As Long
      Dim i As Integer, rt As Long
      numbytes = 3076
      ReDim mamem(0 To numbytes / 4) As Long
      rt = EnumPrinters(&H2, "", 1, mamem(0), numbytes, nums, nbimpris)
      If rt = 0 Then
        numbytes = nums
        ReDim mamem(0 To numbytes / 4) As Long
        rt = EnumPrinters(&H2, "", 1, mamem(0), numbytes, nums, nbimpris)
        If rt = 0 Then
          MsgBox "Could not successfully enumerate the printes."
          End
        End If
      End If
      If nbimpris <> 0 Then ReDim printinfo(0 To nbimpris - 1) As PRINTER_INFO_1
      For i = 0 To nbimpris - 1
        printinfo(i).flags = mamem(4 * i)
        printinfo(i).pDescription = Space(lstrlen(mamem(4 * i + 1)))
        rt = lstrcpy(printinfo(i).pDescription, mamem(4 * i + 1))
        printinfo(i).pName = Space(lstrlen(mamem(4 * i + 2)))
        rt = lstrcpy(printinfo(i).pName, mamem(4 * i + 2))
        printinfo(i).pComment = Space(lstrlen(mamem(4 * i + 3)))
      Next i
      For i = 0 To nbimpris - 1
        List1.AddItem printinfo(i).pName
      Next i
    End Sub

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    ça m'a l'air quand même d'une usine à gaz ta technique ucfoutu

    finalement, j'ai repris le code de Michel_M en l'adaptant pour récupérer mon nom d'imprimante et ça marche très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Function RechercherNomImprimante() As String
     
    Dim strComputer As String
    Dim objImprimantes As Object
    Dim objImprimante As Object
    Dim objWMIService As Object
     
    'travaille sur le poste client
    strComputer = "."
    'appel WMI
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
     
    Set objImprimantes = objWMIService.ExecQuery _
        ("Select * from Win32_Printer")
     
    'restitution
    For Each objImprimante In objImprimantes
        If objImprimante.Name = "Adobe PDF" Or objImprimante.Name = "Acrobat Distiller" Then
        RechercherNomImprimante = objImprimante.Name
        Exit Function
        End If
    Next
     
    RechercherNomImprimante = ""
     
    End Function

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    ouais...

    ce n'est pas toujours ce qui parait être une usine à gaz, celle qu l'est finalement (et en cachette) ...

  8. #8
    Membre régulier Avatar de allergique
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 151
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Bonjour,

    Et moi je ne me sers ni d'une boîte de dialogue, ni de ce lourdaud de FSO (juste pour manifester, comme d'hab ...)... et reste ainsi indépendant !

    Une listbox nommé List1 et

    code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
    Private Type PRINTER_INFO_1
      flags As Long
      pDescription As String
      pName As String
      pComment As String
    End Type
    Private Sub UserForm_nitialize()
      Dim mamem() As Long, printinfo() As PRINTER_INFO_1, numbytes As Long
      Dim nums As Long, nbimpris As Long
      Dim i As Integer, rt As Long
      numbytes = 3076
      ReDim mamem(0 To numbytes / 4) As Long
      rt = EnumPrinters(&H2, "", 1, mamem(0), numbytes, nums, nbimpris)
      If rt = 0 Then
        numbytes = nums
        ReDim mamem(0 To numbytes / 4) As Long
        rt = EnumPrinters(&H2, "", 1, mamem(0), numbytes, nums, nbimpris)
        If rt = 0 Then
          MsgBox "Could not successfully enumerate the printes."
          End
        End If
      End If
      If nbimpris <> 0 Then ReDim printinfo(0 To nbimpris - 1) As PRINTER_INFO_1
      For i = 0 To nbimpris - 1
        printinfo(i).flags = mamem(4 * i)
        printinfo(i).pDescription = Space(lstrlen(mamem(4 * i + 1)))
        rt = lstrcpy(printinfo(i).pDescription, mamem(4 * i + 1))
        printinfo(i).pName = Space(lstrlen(mamem(4 * i + 2)))
        rt = lstrcpy(printinfo(i).pName, mamem(4 * i + 2))
        printinfo(i).pComment = Space(lstrlen(mamem(4 * i + 3)))
      Next i
      For i = 0 To nbimpris - 1
        List1.AddItem printinfo(i).pName
      Next i
    End Sub
    Merci pour ce code, il fonctionne très bien, mais après avoir rajouté le "i" qui a disparu dans une faute de frappe pour "Private Sub UserForm_initialize()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/05/2014, 11h08
  2. Comment obtenir la liste des imprimantes disponibles
    Par Higgins dans le forum Composants FMX
    Réponses: 7
    Dernier message: 30/08/2013, 17h37
  3. Réponses: 0
    Dernier message: 05/04/2008, 13h59
  4. Récupérer la liste des ports Série disponibles
    Par marcootz dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/11/2007, 19h00
  5. Liste des imprimante
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 17/06/2003, 19h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo