OVH Cloud OVH Cloud

VBA et l'impression

3 réponses
Avatar
Danièle
Bonjour à tous,

Novice en la matière et ayant (hélas) peu de temps à y consacrer, je passe
encore beaucoup de ce précieux temps à chercher à comprendre ce qui pour
vous est l'enfance de l'art.
Dans certains cas, pouvoir imprimer codes ou propriétés de ce qui existe
déjà me facilite bien la vie, mais, petit problème : je n'arrive pas
imprimer ce que je veux et rien que ce que je veux ! l'imprimante me crache
à tous les coups une dizaine de feuilles dont je n'ai pas besoin Alors, ne
riez pas de ma question idiote : comment dois-je procéder pour n'imprimer,
par ex, que les propriétés d'un objet, ou que le Initialize d'un UserForm ou
etc...

merci de m'éclairer et bravo pour ce forum
--
Danièle

3 réponses

Avatar
boblebob
salut,

oui effecticement la gestion de l'impression dans VBE c'est pas terrible (et
encore je reste poli)
à ma connaissance, 3 options dans Fichier/Imprimer:
1) Sélection : imprime ce que tu auras préalablement sélectionné
2) Module en cours : imprime toutes les macros de ton module actif
3) Projet en cours : imprime toutes les macros de tous tes modules y compris
Userform, Feul1, ThisWorkbook ...

Une astuce que j'utilise : je copie-colle dans Word ce que je veux imprimer
et je rectifie la mise en page !


--
A+

Bob
----

"Danièle" a écrit dans le message de
news:%
Bonjour à tous,

Novice en la matière et ayant (hélas) peu de temps à y consacrer, je passe
encore beaucoup de ce précieux temps à chercher à comprendre ce qui pour
vous est l'enfance de l'art.
Dans certains cas, pouvoir imprimer codes ou propriétés de ce qui existe
déjà me facilite bien la vie, mais, petit problème : je n'arrive pas
imprimer ce que je veux et rien que ce que je veux ! l'imprimante me
crache

à tous les coups une dizaine de feuilles dont je n'ai pas besoin Alors,
ne

riez pas de ma question idiote : comment dois-je procéder pour n'imprimer,
par ex, que les propriétés d'un objet, ou que le Initialize d'un UserForm
ou

etc...

merci de m'éclairer et bravo pour ce forum
--
Danièle




Avatar
michdenis
Bonjour Danièle,


Voici comme tu peux faire pour imprimer une procédure particulière de ton classeur : Facile comme dirait JPS !!! ;-))

Tu copies tout ce qui suit dans un module standard et tu lances la procédure : " ImprimerUneProcédure" en penant soin de
définir les 3 variables dûment identifiées.



'Déclaration API - haut d'un module standard :
'---------------------------------------------------
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

Const SW_SHOW = 5


Sub ImprimerUneProcédure()

'Important :
'La seule restriction, ne pas insérer cette procédure
'dans le même module que la procédure à imprimer

Dim LaProcedure As String, LeClasseur As String
Dim LeModule As String, A As Object

'******Définir ces 3 variables suivantes******

'Nom du classeur contenant la procédure
LeClasseur = ThisWorkbook.Name

'Nom de la procédure à imprimer
'Attention à la casse ...
LaProcedure = "ImprimerUneprocédure"

'nom du module où est écrite cette procédure
'Attention à la casse
CeModule = "Module1"
'**********************************************


'La variable module est déterminé par la fonction
Set A = fnThisVBComponent(ThisWorkbook, LaProcedure)
If Not A Is Nothing Then
LeModule = A.Name
Else
MsgBox "Procédure non trouvée." _
, vbInformation + vbOKOnly, "Opération annulée"
Exit Sub
Set A = Nothing
End If

ImprimerToutLeCode LeClasseur, LeModule, LaProcedure
Set A = Nothing

End Sub

'---------------------------------------
Function fnThisVBComponent(oBk As Workbook, _
ByVal sUniqueString As String) As Object
'Original crée par Stephen Bullen
'et adapter par moi ...
Dim oVBC As Object

'Loop through the VBComponents in the
'given workbook's VBProject
For Each oVBC In oBk.VBProject.VBComponents

'Using it's code module
With oVBC.CodeModule

'See if we can find the unique string
If .Find(sUniqueString, 1, 1, .CountOfLines, _
1000, True, True, False) Then
If oBk.Name = ThisWorkbook.Name Then
If oVBC.Name <> CeModule Then
'Found it, so return the
'VBComponent where it was found
Set fnThisVBComponent = oVBC
Exit For
End If
End If
End If
End With
Next

End Function

'---------------------------------------
Sub ImprimerToutLeCode(NomClasseur As String, _
LeModule As String, Procedure As String)

Dim VBComp As Object
Dim Texte As String, Ficher As String

Fichier = "C:ImprimerCode.txt"

Set VBComp = Workbooks(NomClasseur).VBProject. _
VBComponents(LeModule).CodeModule
'ligne du début de la procédure
Ligne = VBComp.ProcBodyLine(Procedure, vbext_pk_Proc)
'Nombre de ligne de la procédure
Nbligne = VBComp.ProcCountLines(Procedure, vbext_pk_Proc)

Open Fichier For Output As #1
With VBComp
If .CountOfLines <> 0 Then
Texte = vbCrLf & vbCrLf & vbCrLf
Texte = Texte & "*******Nom du Module : " & .Name _
& "*******" & vbCrLf & vbCrLf & vbCrLf
Texte = Texte & .Lines(Ligne, Nbligne)
Texte = Texte & vbCrLf & vbCrLf
Print #1, Texte
End If
End With
Close #1

'Imprimer le fichier abc.txt sans voir le fichier à l'écran.
ShellExecute hwnd, "print", Fichier, "", "", SW_HIDE

'Arrêt pour charger le buffer de l'imprimante
'La valeur de 5 secondes est aléatoire...
'cela pourrait être moins.
Application.Wait (Now + TimeValue("0:00:05"))

'détruit le fichier sans possibilité de récupération
Kill Fichier
End Sub
'---------------------------------------



Salutations!







"Danièle" a écrit dans le message de news:%
Bonjour à tous,

Novice en la matière et ayant (hélas) peu de temps à y consacrer, je passe
encore beaucoup de ce précieux temps à chercher à comprendre ce qui pour
vous est l'enfance de l'art.
Dans certains cas, pouvoir imprimer codes ou propriétés de ce qui existe
déjà me facilite bien la vie, mais, petit problème : je n'arrive pas
imprimer ce que je veux et rien que ce que je veux ! l'imprimante me crache
à tous les coups une dizaine de feuilles dont je n'ai pas besoin Alors, ne
riez pas de ma question idiote : comment dois-je procéder pour n'imprimer,
par ex, que les propriétés d'un objet, ou que le Initialize d'un UserForm ou
etc...

merci de m'éclairer et bravo pour ce forum
--
Danièle
Avatar
michdenis
Bonjour Danièle,

Pour pour les fins de l'impression, il y a création d'un fichier temporaire : "C:ImprimerCode.txt" dans la procédure :
ImprimerToutLeCode... , ce fichier est détruit à la fin de la procédure après l'impression. Si tu veux avoir accès à ce
dossier tu n'as qu'à mettre une apostrophe devant cette ligne de code : Kill Fichier , de la même procédure.


Salutations!





"michdenis" a écrit dans le message de news:
Bonjour Danièle,


Voici comme tu peux faire pour imprimer une procédure particulière de ton classeur : Facile comme dirait JPS !!! ;-))

Tu copies tout ce qui suit dans un module standard et tu lances la procédure : " ImprimerUneProcédure" en penant soin de
définir les 3 variables dûment identifiées.



'Déclaration API - haut d'un module standard :
'---------------------------------------------------
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

Const SW_SHOW = 5


Sub ImprimerUneProcédure()

'Important :
'La seule restriction, ne pas insérer cette procédure
'dans le même module que la procédure à imprimer

Dim LaProcedure As String, LeClasseur As String
Dim LeModule As String, A As Object

'******Définir ces 3 variables suivantes******

'Nom du classeur contenant la procédure
LeClasseur = ThisWorkbook.Name

'Nom de la procédure à imprimer
'Attention à la casse ...
LaProcedure = "ImprimerUneprocédure"

'nom du module où est écrite cette procédure
'Attention à la casse
CeModule = "Module1"
'**********************************************


'La variable module est déterminé par la fonction
Set A = fnThisVBComponent(ThisWorkbook, LaProcedure)
If Not A Is Nothing Then
LeModule = A.Name
Else
MsgBox "Procédure non trouvée." _
, vbInformation + vbOKOnly, "Opération annulée"
Exit Sub
Set A = Nothing
End If

ImprimerToutLeCode LeClasseur, LeModule, LaProcedure
Set A = Nothing

End Sub

'---------------------------------------
Function fnThisVBComponent(oBk As Workbook, _
ByVal sUniqueString As String) As Object
'Original crée par Stephen Bullen
'et adapter par moi ...
Dim oVBC As Object

'Loop through the VBComponents in the
'given workbook's VBProject
For Each oVBC In oBk.VBProject.VBComponents

'Using it's code module
With oVBC.CodeModule

'See if we can find the unique string
If .Find(sUniqueString, 1, 1, .CountOfLines, _
1000, True, True, False) Then
If oBk.Name = ThisWorkbook.Name Then
If oVBC.Name <> CeModule Then
'Found it, so return the
'VBComponent where it was found
Set fnThisVBComponent = oVBC
Exit For
End If
End If
End If
End With
Next

End Function

'---------------------------------------
Sub ImprimerToutLeCode(NomClasseur As String, _
LeModule As String, Procedure As String)

Dim VBComp As Object
Dim Texte As String, Ficher As String

Fichier = "C:ImprimerCode.txt"

Set VBComp = Workbooks(NomClasseur).VBProject. _
VBComponents(LeModule).CodeModule
'ligne du début de la procédure
Ligne = VBComp.ProcBodyLine(Procedure, vbext_pk_Proc)
'Nombre de ligne de la procédure
Nbligne = VBComp.ProcCountLines(Procedure, vbext_pk_Proc)

Open Fichier For Output As #1
With VBComp
If .CountOfLines <> 0 Then
Texte = vbCrLf & vbCrLf & vbCrLf
Texte = Texte & "*******Nom du Module : " & .Name _
& "*******" & vbCrLf & vbCrLf & vbCrLf
Texte = Texte & .Lines(Ligne, Nbligne)
Texte = Texte & vbCrLf & vbCrLf
Print #1, Texte
End If
End With
Close #1

'Imprimer le fichier abc.txt sans voir le fichier à l'écran.
ShellExecute hwnd, "print", Fichier, "", "", SW_HIDE

'Arrêt pour charger le buffer de l'imprimante
'La valeur de 5 secondes est aléatoire...
'cela pourrait être moins.
Application.Wait (Now + TimeValue("0:00:05"))

'détruit le fichier sans possibilité de récupération
Kill Fichier
End Sub
'---------------------------------------



Salutations!







"Danièle" a écrit dans le message de news:%
Bonjour à tous,

Novice en la matière et ayant (hélas) peu de temps à y consacrer, je passe
encore beaucoup de ce précieux temps à chercher à comprendre ce qui pour
vous est l'enfance de l'art.
Dans certains cas, pouvoir imprimer codes ou propriétés de ce qui existe
déjà me facilite bien la vie, mais, petit problème : je n'arrive pas
imprimer ce que je veux et rien que ce que je veux ! l'imprimante me crache
à tous les coups une dizaine de feuilles dont je n'ai pas besoin Alors, ne
riez pas de ma question idiote : comment dois-je procéder pour n'imprimer,
par ex, que les propriétés d'un objet, ou que le Initialize d'un UserForm ou
etc...

merci de m'éclairer et bravo pour ce forum
--
Danièle