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

VBA Access Discussion :

[API-VBA]utilisation API Printer


Sujet :

VBA Access

  1. #1
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut [API-VBA]utilisation API Printer
    Bonjour,

    Je désire imprimer mes états à partir de la boîte de dialogue impression de Windows.
    Pour certains états je désire qu'il ne soit possible que d'imprimer toutes les pages ou d'annuler l'impression
    pour d'autre que l'utilisateur puisse choisir les pages à imprimer.

    J'ai trouver du 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    Option Explicit
     
    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32
    Private Const PD_RETURNDC = &H100
    Private Const PD_RETURNIC = &H200
    Private Const NULL_PTR = 0&
     
    Private Type DEVMODE
            dmDeviceName As String * CCHDEVICENAME
            dmSpecVersion As Integer
            dmDriverVersion As Integer
            dmSize As Integer
            dmDriverExtra As Integer
            dmFields As Long
            dmOrientation As Integer
            dmPaperSize As Integer
            dmPaperLength As Integer
            dmPaperWidth As Integer
            dmScale As Integer
            dmCopies As Integer
            dmDefaultSource As Integer
            dmPrintQuality As Integer
            dmColor As Integer
            dmDuplex As Integer
            dmYResolution As Integer
            dmTTOption As Integer
            dmCollate As Integer
            dmFormName As String * CCHFORMNAME
            dmUnusedPadding As Integer
            dmBitsPerPel As Long
            dmPelsWidth As Long
            dmPelsHeight As Long
            dmDisplayFlags As Long
            dmDisplayFrequency As Long
    End Type
    Private Type DEVNAMES
            wDriverOffset As Integer
            wDeviceOffset As Integer
            wOutputOffset As Integer
            wDefault As Integer
    End Type
    'renommé pour différencier avec la fonction PrintDlg
    Private Type InformationImprimante      ' PRINTDLG
        lStructSize As Long
        hwndOwner As Long
        hDevMode As Long
        hDevNames As Long
        hdc As Long
        flags As Long
        nFromPage As Integer
        nToPage As Integer
        nMinPage As Integer
        nMaxPage As Integer
        nCopies As Integer
        hInstance As Long
        lCustData As Long
        lpfnPrintHook As Long
        lpfnSetupHook As Long
        lpPrintTemplateName As String
        lpSetupTemplateName As String
        hPrintTemplate As Long
        hSetupTemplate As Long
    End Type
     
    Private Declare Function PrintDlg Lib "comdlg32.dll" Alias PrintDlgA" (pPrintdlg As InformationImprimante) As Long
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
     
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
     
    Private Sub cmdImprimer_Click()
        Dim retourAPI As Long
        Dim imprimanteSelectionne As InformationImprimante
        Dim infoDevice As DEVMODE
        Dim nomImprimante As String
        Dim adresseStructureDEVMODE As Long
        Dim imprimante As Printer
        '
        On Error GoTo Err_Impression
        '
        retourAPI = 0
        '
        ' Initialisation de la structure d'échange
        '
        imprimanteSelectionne.lStructSize = Len(imprimanteSelectionne)
        imprimanteSelectionne.hDevMode = NULL_PTR
        imprimanteSelectionne.hDevNames = NULL_PTR
        imprimanteSelectionne.flags = PD_RETURNIC
     
        ' Ouverture du CommonDialog via l'API PrintDlg
        retourAPI = PrintDlg(imprimanteSelectionne)
     
        ' Retour de l'API si Annulé -> Retour = 0
        Select Case retourAPI
     
        Case 0 'Abandon
            Exit Sub
        Case 1 ' OK
            adresseStructureDEVMODE = GlobalLockimprimanteSelectionne.hDevMode)
            Call CopyMemory(infoDevice, ByVal adresseStructureDEVMODE, Len(infoDevice))
     
            nomImprimante = Left(infoDevice.dmDeviceName, InStr(1, infoDevice.dmDeviceName, Chr(NULL_PTR)) - 1)
            For Each imprimante In Printers
                If nomImprimante = imprimante.DeviceName Then
                    Set Printer = imprimante
                    Exit For
                End If
            Next
        Case Else 'an error occured
            MsgBox ("Erreur inatendue")
            Exit Sub
        End Select
        '
        ' Affectation des paramètres de configuration de l'imprimante
        Printer.Orientation = infoDevice.dmOrientation
        Printer.Copies = infoDevice.dmCopies
        ' etc...
        '
        ' Ecriture du texte en utilisant l'objet Printer
        Printer.Print "OK"
        RichTextBox1.SelPrint Printer.hdc
        Printer.EndDoc
     
        Exit Sub
     
    Err_Impression:
     
    End Sub
    En essayant de l'adapter à windows. Il y a cependant une foule d'erreur qui apparaissent et en "supprimant" les erreurs c'est à dire en marquant la ligne de code avec ' j'ai fini par avoir la boîte de dialogue, mais pas moyen d'imprimer.

    Ma question: y a-t-il un spécialiste API qui saurait me guider ou m'indiquer où je peut trouver l'information.

    Le code fait notamment appel à l'objet "Printer" je ne sais pas du tout comment le manipuler.

    merci bien d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Pour afficher la boîte de dialogue Impression, tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.RunCommand acCmdPrint
    Mais je ne sais pas si disponible sur une version antérieure à Access 2000.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  3. #3
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    merci,

    j'ai effectivement access 2000 et je ne connaissais pas cette commande.
    Cepandant est-ce possible de l'afficher et d'empêcher l'utlisateur de choisir les pages à imprimer et ensuite savoir s'il a presser ok ou annuler?

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Re,

    Malheureusement, je ne peux guère t'en dire plus...

    Je l'utilise de manière tout à fait standard, et je ne sais pas s'il est possible de "personnaliser" la boîte de dialogue.

    Pour ce qui est du choix de l'utilisateur, c'est possible. L'annulation provoque une erreur '2501'. On peut donc jouer avec On Error pour savoir quel bouton a été cliqué.

    Voilà.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Re,

    Sorry, j'ai parlé trop tôt. Le (X) de fermeture ne lève pas d'erreur.

    Par contre, dans la montagne de choses que je me suis mis de côté pour étudier, disséquer et (mettre en oeuvre), j'ai ce code.

    Evidémment pas (encore) testé.

    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
    'Code de Pierre (3Stone)
        'Permet de savoir si un état a bien été imprimé
     
        'Déclarer une variable 
        Dim Printing As Integer 
     
     
        Private Sub Report_Activate() 
            Printing = -1 
        End Sub 
     
     
        Private Sub Report_Deactivate() 
            Printing = 0 
        End Sub 
     
     
         Private Sub ReportHeader_Print(Cancel As Integer, PrintCount As Integer) 
             Printing = Printing + 1 
         End Sub 
     
     
         Private Sub Report_Close() 
             If Printing >= 1 Then 
                MsgBox "Ok, c'est envoyé..."  ' ou ce que tu veux! 
                 ' Ceci ne marche que si l'état à été imprimé 
                 ' incluant depuis une prévisualisation! 
             End If 
         End Sub
    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

Discussions similaires

  1. Utilisation API COM VBA ->DELPHI
    Par nicola40 dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 17/01/2013, 15h44
  2. [VBA] Utilisation API FindWindows
    Par idir.17 dans le forum Général VBA
    Réponses: 5
    Dernier message: 28/03/2007, 14h39
  3. [VBA-E] API EbExecuteLine
    Par truman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/05/2006, 13h38
  4. Problème utilisation API MySQL
    Par naiko dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 09h55
  5. [VBA] DLL -API
    Par Ric500 dans le forum Access
    Réponses: 1
    Dernier message: 20/10/2005, 15h50

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