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 :

Impression Frame d'un UserForm


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Par défaut Impression Frame d'un UserForm
    Bonjour à tous,

    Je crois que le titre dis tout: je souhaiterais imprimer seulement la frame de mon userrform et non le userform complet.

    J'ai essayé de bidouiller mes codes en long, large et travers avec toujours le même résultats, une erreur.

    Pouvez vous m'aider?

    En vous remerciant par avance.

  2. #2
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    Je ne pense pas que ce soit possible, du moins sans fabriquer une usine à gaz.

    Une solution éventuelle serait de rendre tous les autres contrôles invisibles et d'ensuite imprimer le Userform avec uniquement la Frame visible
    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
    Sub test()
    Dim Ctrl As Control, x As Integer
     
    'noms du Userform (Userform1) et de la Frame (Frame2) à adapter
     
    With UserForm1
     
        'rendre tous les contrôle du Userform1 invisibles
        For Each Ctrl In .Controls
            Ctrl.Visible = False
        Next
     
        'rendre la Frame2 visible
        .Frame2.Visible = True
     
        'rendre tous les contrôles de la Frame2 visibles
        For x = 0 To .Frame2.Controls.Count - 1
            .Frame2.Controls.Item(x).Visible = True
        Next
     
        'imprimer le Userform1
        .printform
     
    End With
     
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Par défaut sdispro
    Merci de ta réponse Fring,

    j'ai déjà effectué cette méthode mais l'impression du userform avec uniquement la frame en masquant les autres objets mais cela n'est pas très propre.

    Encore merci pour ta réponse

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonjour

    je n'en suis pas sur mais je pense que c'est possible

    une solution serait d'utiliser les api windows et gdiplus ou gdi

    en début de code déclarer les api
    gdi
    findwindows pour le handle
    getwindowa et setwindowa pour l'afichage

    dans un premier temps

    1 on declare les variable handle, rect,
    2 on cherche le handle avec findwindoa
    3 on créé le rectangle avec gdi sur la base du frame
    4 et on affiche l'userform sur la base du frame avec setwindowa......par son handle

    je pense que tu devrais trouver ton bonheur dans la faq et les anciennes discutions

    le seul doute que je peut avoir c'est la capture du userform si il n'a pas sa caption je n'ai jamais essayer ca
    je vais essayer de te faire un exemple
    je viens de faire l'essai comme ca :
    ca decoupe bien le userform mais a l'impression le userform est complet sans la caption c'est bien ce que je pensais
    code dans le userform sur un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton2_Click()
    impression_frame Me, Frame1
    End Sub
    et dans un module standard
    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
    '// Régions rectangulaires :
    Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    '// Fonction permettant de determiner le handle
    Declare Function fwa Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    '// Fonction permettant d'appliquer les régions sur une form :
    Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
     
    Type POINTAPI
        X As Long
        Y As Long
    End Type
     
    Sub impression_frame(usf As Object, laframe As Object)
    usf.Hide
    usf.Show 0
    handle = fwa(vbNullString, usf.Caption) 'on trouve le handle
    'on coupe tout ce qui est autour de la frame1
    partie_a_imprimer = CreateRectRgn(laframe.Left * 4 / 3, (laframe.Top + 20) * 4 / 3, (laframe.Left + laframe.Width) * 4 / 3, (laframe.Top + 20 + laframe.Height) * 4 / 3)
    'maintenant que le rectangle representant la frame est determiné on affiche le userform sur cette base ce qui a
    'pour effet d'afficher que la frame
    SetWindowRgn handle, partie_a_imprimer, False
     
    'ici ta macro pour imprimer ton userfom
     'comme ceci par exemple
     usf.PrintForm
     
     
    End Sub
    je pense que de cette maniere il faut crééer un hdc de facon a ne prendre en compte juste la frame


    maintenant il y a peut etre une autre maniere beaucoup plus simple

    le procédé serait le suivant

    1 comme fring rendre les controls invisible sauf ceux de la frame
    2 decalé la frame a 0 de left et 0 de top(en haut a gauche)
    3 redimentionner le userform a la dimention de la frame
    4 supprimer la caption
    5 imprimer
    6 tout remetre a l'initial
    ainsi la partie qui serait imprimer aurais les meme dimension que la frame (economie imprimante couleur,temp etc...)

    je vais essayer de faire un truc dans le genre

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Par défaut Sdispro
    salut Patrick,

    J'ai une solution (plutôt) du bricolage,

    J'ai fait une macro windows liée à Excel qui me permet de faire un print ecran et de lancer la capture d'image à un moment précis.

    Cela n'es plus du Excel et ne répond pas à mes éxigences et ne s'adaptera à aucun poste car il s'agit d'une réelle usine à Gaz.

    Je te remerci pour ton retour et reste très attentif à ton "truc dans le genre".

    A bientôt

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    rebonjour

    voila celon mon idée une macro generique dans un module standard
    et l'apel a cette macro dans un bouton de l'userfom ou tu veux

    code dans le module userfom

    code du bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton2_Click()
    impression_frames Me, frame1  ' a adapter le nom de ta frame
    End Sub
    et dans un module standard

    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
    Option Explicit
    Declare Function fwa Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Dim handle As Long, topframe As Long, leftframe As Long, heightme As Long, widthme As Long, X As Long
    Dim ctrl As Object
    Sub impression_frames(usf As Object, laframe As Object)
    ' ici on reprend l'idée de fring(invisibilité de tout les controls)
        With usf
            'rendre tous les contrôle du Userform1 invisibles
            For Each ctrl In .Controls
                ctrl.Visible = False
            Next
     
            'rendre la Frame2 visible
            .Controls(laframe.Name).Visible = True
            'rendre tous les contrôles de la Frame2 visibles
            For X = 0 To .Controls(laframe.Name).Controls.Count - 1
                .Controls(laframe.Name).Controls.Item(X).Visible = True
            Next
        End With
        'on memorise la taille initial du userform
        heightme = usf.Height
        widthme = usf.Width
        'on memorise la position initiale  de la frame
        topframe = usf.Controls(laframe.Name).Top
        leftframe = usf.Controls(laframe.Name).Left
        'on trouve le handle
        handle = fwa(vbNullString, usf.Caption)
        'on suprime la caption du userform
        SetWindowLong handle, -16, GetWindowLong(handle, -16) And Not &HC00000                                              '*
        'on deplace la frame a gauche et en haut
        usf.Controls(laframe.Name).Top = 0
        usf.Controls(laframe.Name).Left = 0
        'on aplique les dimentions de la frame a lcelle de l'userfom
        usf.Height = usf.Controls(laframe.Name).Height + 5
        usf.Width = usf.Controls(laframe.Name).Width + 5
        'on imprime l'userform
        usf.printform
     
     
        'on remet tout a l'initial
        SetWindowLong handle, -16, GetWindowLong(handle, -16) Or &HC00000                                              '*
        usf.Height = heightme
        usf.Width = widthme
        usf.Controls(laframe.Name).Top = topframe
        usf.Controls(laframe.Name).Left = leftframe
        For Each ctrl In usf.Controls
            ctrl.Visible = True
        Next
     
    End Sub
    et voila maintenant tu n'aura que la frame et ses controls d'imprimé

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre confirmé
    Homme Profil pro
    Developpeur
    Inscrit en
    Novembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 196
    Par défaut SDISPRO
    Un grand merci car c'est bien cela.
    Je suis fier de t'avoir ajouter ton 2152ème point.
    Juste petit point mais pas important, ma frame s'étend sur 2 pages d'impression mais seulement une s'imprime.
    Une idée?

    En tout cas, merci pour la réponse et a réactivité.

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

Discussions similaires

  1. [XL-2010] Navigation entre diverses textbox et frame d'un userform
    Par Naaby dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/06/2011, 18h34
  2. [XL-2003] Impression Multipage d'un UserForm
    Par Lufia dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/10/2009, 15h51
  3. Impression à partir d'un userform
    Par collinchris dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/08/2007, 11h44
  4. Réponses: 1
    Dernier message: 23/04/2007, 21h05
  5. [VBA-E]Impression feuille calcul sans userform
    Par pombela dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/03/2007, 19h09

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