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

Access Discussion :

Impression d'état => Impossible d'ouvrir plus de bases de [À faire]


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut Impression d'état => Impossible d'ouvrir plus de bases de
    Bonjour,

    J'ai un petit problème avec un état utilisé pour faire le bilan du mois (resultats de l'entreprise au cours du dernier mois) qui est très important...
    Cet état contient pas moins d'une dizaine de sous-états mais s'affiche quand même bien... (au bout de presque 5 minutes)!!!
    Jusque là, ca va encore...

    Le problème, c'est que lorsque je veux l'imprimer, l'ordinateur m'envoie des msgbox :
    Impossible d'ouvrir plus de bases de données
    Ce qui correspond à l'erreur 3048 !!!

    La première chose que je ne comprends pas, c'est pourquoi le message indique "plusieurs bases de données" alors que je n'utilise qu'une base de données (mais j'utilise beaucoup de ressources dans cet état, le problème vient à mon avis de cela)!?!

    Mais mon gros probème est que je ne peux pas imprimer l'etat en entier!!!
    En fait, si j'ai bien compris, lorsque j'ouvre un état, on exécute les requêtes, et si je clique sur imprimer, les requêtes sont réexécutées ?!?

    J'ai donc essayé de contourné le problème : imprimer l'état sans passer par l'aperçu!!! Pour cela j'utilise une macro qui exécute une fonction d'un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport "Tableau de Bord", acViewNormal, "", "", acNormal
    L'etat s'imprime alors bien, sans problèmes, mais je ne sais pas comment afficher la boite de dialogue qui permet de choisir l'imprimante et le nombre copies à imprimer...
    Parce que là, je ne peux imprimer qu'un exemplaire à la fois et forcément sur l'imprimante par défaut !!! (quand on sait que ça met 5min à chaque fois pour faire les requêtes, ca saoule vite !!! )

    Voila... si vous avez bien suivi et que vous pouvez m'aider, ca serait super !!!

    Merci d'avance...

  2. #2
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Voir Docmd.Printout dans l'aide

    Mais, si tu as tellement de sous-états, est-ce que tu ne peux pas le fractionner en plusieurs états principaux, chacun ne contenant que 2 ou 3 sous-états ?

    Pour accélérer :
    Vérifie aussi que tu n'as pas mis le nombre de pages dans un pied de page ? Je m'explique : si tu mets dans un champ de l'état quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = [Page] & "/" & [Pages]
    pour afficher la page/nombre de pages, Access est obligé de compiler tout l'état pour pouvoir afficher le nombre de pages sans erreur.
    Il fait effectivement ça pour l'aperçu, puis il recommence pour l'impression

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    En fait, je ne prend pas en compte le nombre de pages puisque je n'ai qu'une seule page!!!
    Et justement, le but étant de tout avoir sur une page, je ne peux pas vraiment fractionner mon état en 2 ou 3 états principaux, ce qui, je dois l'avouer, m'aurait vraiment facilité la tâche !!!

    Je me suis donc penché sur la fonction Docmd.Printout et maintenant je peux choisir le nombre de pages que je veux imprimer !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DoCmd.SelectObject acReport, "Tableau de Bord", True
    DoCmd.PrintOut , , , , 2
    Le problème, c'est que je voudrais imprimer l'état en PDF, mais pour cela je dois pouvoir changer l'imprimante avant l'impression (l'etat est imprimé sur l'imprimante par defaut)...

    Après de nombreuses recherches, j'ai vu qu'il était possible de définir l'imprimante sur laquelle on veut imprimer notre état...
    J'ai ainsi pu récupérer les codes suivants... mais je ne sais pas trop comment les utiliser :
    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
    Private Sub GetPrinters()
       Dim cbo                 As ComboBox
        Dim sPname              As String
        Dim C                   As Byte
        Dim i                   As Byte
        Dim prt                 As Printer
     
        Set cbo = Me.cboPrinters
        C = cbo.ListCount
    'Clean the cbo
        If C > 0 Then
         For i = 0 To C
            cbo.RemoveItem (i)
         Next i
        End If
        i = 0: C = 0
        For Each prt In Printers
            sPname = C & ";" & prt.DeviceName
            cbo.AddItem (sPname)
    'This line is just to get the default printer to display it as the first option
            If prt.DeviceName = Access.Application.Printer.DeviceName Then
                i = C
            End If
            C = C + 1
        Next prt
       Me.cboPrinters = i
     
        Set prt = Nothing
     
    End Sub
    Cette fonction permet, avec le choix de la ComboBox de définir l'imprimante à utiliser?!?

    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
    Private Sub cmdPrint_Click()
     
        Dim prn            As Printer
        Dim sName       As String
        Dim rpt             As Object
        Dim i                 As Byte
        Dim intItem      As Integer
        Dim stDocName       As String
     
        stDocName = "Tableau de bord"
     
        If Not IsNull(Me.cboPrinters) Then
            intItem = (Me.cboPrinters)
        Else
            intItem = 0
        End If
     
    'Here is where you set the printer where the report will be sent
        Set Application.Printer = Application.Printers(intItem)
     
        Set prn = Application.Printer
           i = 0
     
        DoCmd.OpenReport stDocName, acViewPreview, , , acHidden
    'This is necessary to set the active report to the printer
        Reports(stDocName).Printer = prn
        DoCmd.Close acReport, stDocName
     
        DoCmd.SelectObject acReport, stDocName, True
        DoCmd.PrintOut , , , , 2
     
    End Sub
    Cette fonction lance l'impression de mon état avec l'imprimante choisie ds ma ComboBox ?!?

    Donc si j'ai bien compris :
    - On a une ComboBox nommée cboPrinters déjà remplie (avec le nom des imprimantes).
    - On a un bouton nommé cmdPrint.
    - A l'action "click" sur le bouton cmdPrint, on exécute la deuxième fonction qui appelle la première?!?

    Mon pb pour l'instant, c'est de créer une ComboBox avec la liste de mes imprimantes... Je ne sais pas trop comment m'y prendre, surtout que la liste est différente selon le poste.
    Donc, il faudrait que je fasse une fonction qui puisse aller chercher leur nom dans le répertoire "Imprimantes" mais je ne vois pas comment faire!!!

    J'ai donc deux questions :
    - Est-il possible de sélectionner une imprimante plus simplement?
    - Comment créer une ComboBox comprenant les noms des imprimantes?
    (Pour le code au-dessus, je le testerai apres, et j'aurais surement d'autres questions dessus )

    Voila...
    Si vous avez une idée, n'hésitez pas, toutes les idées sont les bienvenues!!!

    Merci d'avance...!!!

  4. #4
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Alors, là, tu me la coupes.
    Ça doit être le 3ème fois au moins, que je me la fais couper ici, mais tu bats un record : tu viens ici pour poser des questions et tu nous sorts du code qui, si il marche (?), est superbe. D'où tu sors ça ?
    Je ne sais pas encore ce que ça vaut, parce que, 1ère lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        DoCmd.OpenReport stDocName, acViewPreview, , , acHidden 
    'This is necessary to set the active report to the printer 
        Reports(stDocName).Printer = prn 
        DoCmd.Close acReport, stDocName 
     
        DoCmd.SelectObject acReport, stDocName, True 
        DoCmd.PrintOut , , , , 2
    Ça veut dire qu'il fait ce que tu ne veux pas faire : il ouvre l'état (caché) en mode preview, avant de lui affecter l'imprimante, de le fermer, de le resélectionner dans la fenêtre base de données, de l'imprimer enfin !
    Seul le test dira si cette méthode
    1- marche,
    2- est + rapide que la tienne.

    Excuse moi pour toutes mes questions là haut, c'était histoire d'éliminer toutes autres possibilités. OK, tu ne peux faire qu'une page. Même si cette méthode n'est pas plus rapide, on pourra probablement optimiser les requêtes de tes (sous-)états...
    D'abord, je vais regarder et tester ce code demain.
    Si ça marche (formulaire, combo avec toutes les imprimantes dedans, etc.), je le republies ici et il faudra que tu le testes avec ton super état, pour nous dire si c'est + rapide que d'ouvrir en mode aperçu (?)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Salut,

    Il existe un moyen plus rapide pour modifier l'imprimante sur laquelle tu imprime...

    Pour cela, tu peut ouvrir une application comme MS Word ( en mode Hidden ) et modifier l'imprimante par défaut... tu n'a plus qu'a fermer ton Word et a imprimer ton état sur l'imprimante par défaut...

    Une fois l'impression terminée, tu refait la même manip pour remetre l'imprimante par defaut a sa valeur initiale... (que tu aura précedemment stocké dans une variable a l'aide de ton appli Word )

    Tout cela loge en pas plus de 10 lignes de code toute simple...

    Si ca t'interresse je te post le code demain...

    Bonne soirée et bon courage,

    PS: J'ai galéré pour sortir un état en PDF donc si ca t'interresse, tu peut me faire signe car maintenant ca marche Nickel !

  6. #6
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    tilb : attention, ta solution Word fait exactement la même chose que la solution d'aymron, sauf que le code d'aymron le fait directement dans Access, donc sans :
    - faire référence à Word -> chargement de la DLL en mémoire,
    - ouvrir Word -> très gourmand,
    - avec un document vierge...
    or son problème est un manque de mémoire !
    Donc, merci de donner le code : ça sera utile à ceux qui ont une référence Word dans leur code, et qui s'en servent...

    aymron : le code ci-dessus ne marche pas chez moi (Access 97 + Access 2000). Quelle est ta version d'access, ou plus exactement, si tu ouvres un module de code et que tu tapes :
    est-ce que tu vois "Printers" dans la liste déroulante ? (parmi les propriétés et méthodes de "Application")

    Si oui, tu pourras tester le code, avec une boîte de dialogue complète proposant la liste des imprimantes (quels que soient le poste de travail et ses imprimantes ), le nombre de copies...

    Sinon, on va chercher autre chose (tu peux toujours rajouter 500 Mb de RAM par machine, mais c'est pas la solution la moins chère ni la plus élégante).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Voici quand même le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    change=Change_Imprimante_Defaut(PDFcreator)
     
    ' Impression de ton Etat
     
    restaure = Restaure_Imprimante_Defaut(change)
    Et les deux fonctions :


    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
     
    Function Change_Imprimante_Defaut(Impr As String)
    Dim wrd As New Word.Application
    Dim defaut As String
     
    ' Cette fonction passe par Word pour modifier l'imprimante par défaut
    wrd.Visible = False
    wrd.ScreenUpdating = False
    defaut = wrd.ActivePrinter
     
    ' Changement de l'imprimante par défaut par Impr
    wrd.ActivePrinter = Impr
    wrd.Quit False
    Set wrd = Nothing
     
    ' Renvoie la précédente imprimante par défaut
    Change_Imprimante_Defaut = defaut
     
    End Function
     
     
     
    Function Restaure_Imprimante_Defaut(Impr As String) As String
    Dim wrd As New Word.Application
     
    ' Cette fonction passe par Word pour restaurer l'imprimante par défaut
    wrd.Visible = False
    wrd.ScreenUpdating = False
     
    ' Changement de l'imprimante par défaut par Impr
    wrd.ActivePrinter = Impr
    wrd.Quit False
    Set wrd = Nothing
     
    End Function
    Il faut activer la référence Microsoft Word xx Object Library

    Voila quand même pour ceux que ca interresse...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Tout d'abord, merci de vous intéresser à mon problème...

    Pour la petite histoire, je sors ce petit bout de code magique d'un forum (en faisant une recherche sur google, comme quoi, quand on cherche bien on peut trouver plein de choses lol).
    Il est à cette adresse : http://www.accessvba.com/showthread.php?threadid=9293
    Et apparemment, en voyant la réponse dans le forum, ca marche !!!

    C'est vrai que la méthode ne semble pas plus rapide puisqu'on doit ouvrir l'état deux fois. Mais bon, comme je l'expliquais, le problème de l'ouvrir en aperçu pour l'imprimer après est que je n'avais pas assez de mémoire : Impossible d'ouvrir plus de bases de données...
    Or dans le code magique, on ouvre l'aperçu, puis on le referme pour enfin imprimer, ce qui doit normalement éliminer tous les problèmes de ressources mémoires dans mon cas...

    Je viens de voir ta réponse, papy turbo, et j'ai testé le Application.printers existe dans mon Access 2002

    Si tu peux encore m'aider un peu pour la boite de dialogue avec la selection des imprimantes, ca serait vraiment génial !!!

    Et merci aussi à tilb, je vais tester quand meme ton code, on ne sait jamais

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Salut...

    Je viens de tester le code de tilb !!! c'est bogoss !!! ca marche nikel : je lui donne le nom de l'imprimante et ca imprime nikel dessus !!! sans foutre la merde avec la memoire !!!

    J'en arrive donc au même point qu'avec l'autre solution, c'est à dire que je dois faire une boite de dialogue qui me permettrait de sélectionner une imprimante dans une liste !!! Et ca serait super...


    Bon, maintenant, je vais faire des petites recherches pour faire cette liste, si vous pouvez m'aider, c'est pas de refus!!!

    Je vous tiens au courant !!!

  10. #10
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    tilb : Merci
    Excuse moi d'être pointilleux, mais, à ta place, j'aurais une seule fonction (la 1ère) que j'appellerais 2 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim ImprDefaut as string
     
    ImprDefaut=Change_Imprimante("Nom de l'imprimante spécifique") 
     
    ' Impression de ton Etat 
     
    'rétablir la précédente imprimante par défaut
    Change_Imprimante ImprDefaut
    aymron : je viens d'aller visiter ton lien. Y a rien de plus, mais c'est bon (sur ce site, chacun des intervenants publie sa version d'access avec son nom, ça aide )
    Tu vas :
    - créer une boîte de dialogue (aide Access. En bref, form sans aucune source ni aucun des zigouigoui (boutons de navigation...) de l'onglet Format - Propriétés du formulaire)
    - ajouter une liste déroulante nommée cboPrinters,
    - coller dans l'évènement Form_Load (sur chargement) du formulaire, un appel pour remplir la liste.
    Je suppose que tu passeras le nom de l'état à imprimer à cette boîte de dialogue, donc faudra aussi le récupérer :
    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
    'variable au niveau module
    Dim m_stDocName As String
     
    Private Sub Form_Load()  
        GetPrinters
        m_stDocName = OpenArgs
    End Sub
     
    Private Sub GetPrinters()
    Dim cbo As ComboBox
    Dim sPname As String
    Dim C As Byte
    Dim i As Byte
    Dim prt As Printer
     
        'Pointeur sur la listbox des imprimantes
        Set cbo = Me.cboPrinters
        'Si ce code est appelé depuis l'évènement Form_Load, la liste est déjà vide.
        'Sinon, la vider en enlevant les marques de commentaires :
    '    C = cbo.ListCount
    '    'Clean the cbo
    '    If C > 0 Then
    '        For i = 0 To C
    '            cbo.RemoveItem (i)
    '        Next i
    '    End If
        C = 0
        For Each prt In Printers
            sPname = C & ";" & prt.DeviceName
            cbo.AddItem (sPname)
            'This line is just to get the default printer to display it as the first option
            'Cette ligne récupére l'index de l'imprimante par défaut
            If prt.DeviceName = Access.Application.Printer.DeviceName Then
                i = C
            End If
            C = C + 1
        Next prt
        'sélectionner l'imprimante par défaut, dans la liste :
        Me.cboPrinters = i
     
        Set prt = Nothing
    End Sub
    - ajouter un contrôle boîte de texte intitulé 'NombreCopies'; valeur par défaut = 1
    - un bouton de commande 'cmdPrint', avec le code suivant dans l'évènement sur Clic.
    J'aurais tendance, pour optimiser, à faire comme ça (à tester) :
    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
    Private Sub cmdPrint_Click()
     
        'Here is where you set the printer where the report will be sent
        'FAUX : c'est ici, (à vérifier) que vous CHANGEZ l'imprimante PAR DÉFAUT.
        'Inutile pour imprimer un état :
        'Set Application.Printer = Application.Printers(Me.cboPrinters)
        'Set prn = Application.Printer
     
        'Ouverture de l'état en mode DESIGN = le + rapide
        'acHidden est-il un nouveau paramètre apparu dans Office XP ? (à vérifier)
        DoCmd.OpenReport m_stDocName, acViewDesign, , , acHidden
        'Affectation à l'état de l'imprimante sélectionnée dans la liste
        Reports(m_stDocName).Printer = Application.Printers(Me.cboPrinters)
        'Je ne suis pas convaincu qu'on soit obligé de fermer l'état, puis l'imprimer.
        '   Si le code ne marche pas tel quel, enlever les commentaires en tête de ligne :
    '    'Fermer et enregistrer l'état, sans poser de question
    '    DoCmd.Close acReport, m_stDocName, acSaveYes
    '    'Sélectionne l'état dans la fenêtre base de données
    '    DoCmd.SelectObject acReport, m_stDocName, True
        'Si on n'a PAS fermé l'état,
        '   faut le sélectionner (PAS dans la fenêtre base de données)
        DoCmd.SelectObject acReport, m_stDocName, False
        'Lance l'impression avec le nombre de copies demandé
        DoCmd.PrintOut , , , , Me![NombreCopies]
        'Faut probablement le fermer après ?
        DoCmd.Close acReport, m_stDocName, acSaveNo
    End Sub
    Si ça marche comme ça, tu pourras supprimer les lignes inutiles ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Merci, je vais tester tout ca !!!

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Woawww!!!
    Ca marche nikel...

    Pour ceux que ca intéresse, voici les modifications à apporter :

    - Quand on crée la liste cboPrinters, il faut changer deux propriétés :
    Il faut mettre Nbre Colonnes à 2 et dans Origine Source, il faut mettre Liste de valeurs

    - Dans le code, il y a également quelques modifications à effectuer :

    Voilà le code qui lance l'impression :
    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
     
    Private Sub cmdPrint_Click()
     
        Dim intItem As Integer
        Dim m_stDocName As String
        m_stDocName = "Tableau de Bord"
     
        'On doit avoir un entier pour affecter l'imprimante. Si on laisse Me.cboPrinters on a une erreur!!! 
        'Avec cette affectation, on n'a plus d'erreur.
        If Not IsNull(Me.cboPrinters) Then
            intItem = (Me.cboPrinters)
        Else
            intItem = 0
        End If
     
        'Ouverture de l'état en mode DESIGN = le + rapide
        DoCmd.OpenReport m_stDocName, acViewDesign, , , acHidden
     
        'Affectation à l'état de l'imprimante sélectionnée dans la liste
        Reports(m_stDocName).Printer = Application.Printers(intItem)
     
        'Il faut sélectionner l'état
        DoCmd.SelectObject acReport, m_stDocName, False
     
        'Lance l'impression avec le nombre de copies demandé
        DoCmd.PrintOut , , , , Me![NombreCopies]
     
        'On le ferme
        DoCmd.Close acReport, m_stDocName, acSaveNo
     
    End Sub
    On lance la fonction GetPrinters au chargement du formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Form_Load()
        GetPrinters
    End Sub
    Voici la fonction GetPrinters utilisée pour mettre le nom des imprimantes dans une liste :
    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
     
    Private Sub GetPrinters()
    Dim cbo As ComboBox
    Dim sPname As String
    Dim C As Byte
    Dim i As Byte
    Dim prt As Printer
     
        'Pointeur sur la listbox des imprimantes
        Set cbo = Me.cboPrinters
        C = 0
        For Each prt In Printers
            sPname = C & ";" & prt.DeviceName
            cbo.AddItem (sPname)
            'Cette ligne récupére l'index de l'imprimante par défaut
            If prt.DeviceName = Access.Application.Printer.DeviceName Then
                i = C
            End If
            C = C + 1
        Next prt
        'sélectionner l'imprimante par défaut, dans la liste :
        Me.cboPrinters = i
     
        Set prt = Nothing
    End Sub
    C'est tout simplement génial... en tout cas, pour moi c'est génial
    Je n'ai pas de problème de mémoire et je peux changer d'imprimante, tout ce que j'attendais!!!

    La solution de tilb marche aussi, mais est à mon avis un peu moins performante (on passe par un doc. word!!!), mais tout à faire utilisable!!!

    Voila...
    Encore un grand à tilb et papy turbo... heureusement qu'il y a encore des bonnes âmes sur ce forum lol!!!

    Santé

  13. #13
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Citation Envoyé par aymron
    - Quand on crée la liste cboPrinters, il faut changer deux propriétés :
    Il faut mettre Nbre Colonnes à 2 et dans Origine Source, il faut mettre Liste de valeurs
    Et aussi Largeur colonnes = "0cm;", pour que la 1ère colonne soit invisible et qu'on voit le nom de chaque imprimante dans la liste plutôt que le n°.

    Si cboPrinters renvoie une valeur nulle, tu peux remplacer le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Dim intItem As Integer 
     
        'On doit avoir un entier pour affecter l'imprimante. Si on laisse Me.cboPrinters on a une erreur!!! 
        'Avec cette affectation, on n'a plus d'erreur. 
        If Not IsNull(Me.cboPrinters) Then 
            intItem = (Me.cboPrinters) 
        Else 
            intItem = 0 
        End If
    par Mais il y a mieux :
    Si tu utilises une zone de liste plutôt qu'une liste déroulante,
    - elle sera + rapide pour les utilisateurs (1 seul clic),
    - tu n'as même pas besoin de Nz()
    Du fait que tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'sélectionner l'imprimante par défaut, dans la liste : 
        Me.cboPrinters = i
    à la fin de GetPrinters(), cboPrinters renvoie toujours une valeur numérique et ne peut plus jamais être null (si c'est bien une zone de liste).

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Papy Turbo
    Et aussi Largeur colonnes = "0cm;"
    Oui, c'est beaucoup mieux!!!

    Il ne peut pas y avoir de valeur nulle, c'est vrai, sauf s'il n'y a pas d'imprimantes, et dans ce cas, ca ne sert à rien d'essayer d'imprimer le document !!! Donc ce test ne sert à rien!!!

    Néanmoins, on ne peut pas laisser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reports(m_stDocName).Printer = Application.Printers(Me.cboPrinters)
    Car si j'ai bien compris, Me.cboPrinters n'est pas du bon type...
    J'ai alors modifié cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim intItem As Integer
    intItem = (Me.cboPrinters)
    Reports(m_stDocName).Printer = Application.Printers(intItem)
    Ce qui marche bien....

    Voila, merci pour tes précisions...

  15. #15
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    salut,
    je viens de tester ce code sous access 2000.
    dans la fonction GetPrinters, la compilation échoue avec le message :

    Dim prt As Printer
    Type non défini.

    comment contourner ce problème ?

  16. #16
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Bonjour, quelle version d'access ?

    Le type printer est bien un élement d'access

  17. #17
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    ACCESS 2000

  18. #18
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    ce systeme fonctionne très bien chez moi sur un projet access.

    Le problème est que si je crée un mde, jai une erreur sur la commande cmdPrint.

    Il me met un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l'expression sur clic entrée comme parametre de la propriété de type évènement est à l'origine d'une erreur.cette commande n'est pas disponilbe pour une base de données MDE/ADE
    Je suis degouté, jai passé un moment à chercher ce code et à l'introduire et ca ne marche pas sous mde.

    N'"tant pas un tueur en vb, tout soutien face à cette situation critique serait grandement appércié..

  19. #19
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    j'ai pas encore eu l'occasion de "jouer" avec l'objet printer des nouvelles versions d'Access mais si tu ne peux pas te passer de l'ouverture en mode Design alors ce code ne fonctionnera pas avec un mde (ou avec le runtime non plus d'ailleurs)

    Par contre tu peux utiliser le module du message suivant :
    http://www.developpez.net/forums/viewtopic.php?t=469891

    Tu ouvres l'état en mode Preview et tu lances la fonction PrintBox.
    Tu peux choisir l'imprimante, le nombre de pages, ...
    Et si tu veux le dernier paramètre lance l'impression immédiatement.

    Comme le code ne fait qu'appeler et piloter la boîte de dialogue d'impression ça fonctionne avec mde.

  20. #20
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    ok merci pour ta reponse.

    En fait, hier comme je voyais que sur le projet la demande dimpression mle fesait apparaitre mon formulaire en mode creation (rapidement), et que je sais que le mode creation sous mde nest pas autorisé, jai testé en mode preview et ca a effectivement reolu le pb.

    En tout cas merci pour ta reponse.

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

Discussions similaires

  1. Problème : "Impossible d'ouvrir plus de bases de données"
    Par Matthieu IS dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/05/2007, 17h25
  2. Impossible d'ouvrir plus de bases de données
    Par tedparker dans le forum Access
    Réponses: 3
    Dernier message: 09/08/2006, 10h16
  3. Réponses: 5
    Dernier message: 27/06/2006, 12h27
  4. Impossible d'ouvrir plus de bases de données
    Par hugo69 dans le forum Access
    Réponses: 1
    Dernier message: 21/03/2006, 11h27
  5. Impossible d ouvrir plus de bases de données
    Par cla dans le forum Access
    Réponses: 8
    Dernier message: 24/02/2006, 16h06

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