Bonjour à vous tous,
encore merci à vous d'aidez les débutants en Excel, ou ceux qui veulent
faire plus qu'ils ne peuvent....
J'ai pas eu de succès pour mon problème de combobox pour imprimer.
Alors je pensais à autre chose :
-est-il possible d'insérer, dans ma barre d'outil personnelle, une liste
de
choix qui déclencheront des macros ??
Je vous remercie.
YANN
Bonjour à vous tous,
encore merci à vous d'aidez les débutants en Excel, ou ceux qui veulent
faire plus qu'ils ne peuvent....
J'ai pas eu de succès pour mon problème de combobox pour imprimer.
Alors je pensais à autre chose :
-est-il possible d'insérer, dans ma barre d'outil personnelle, une liste
de
choix qui déclencheront des macros ??
Je vous remercie.
YANN
Bonjour à vous tous,
encore merci à vous d'aidez les débutants en Excel, ou ceux qui veulent
faire plus qu'ils ne peuvent....
J'ai pas eu de succès pour mon problème de combobox pour imprimer.
Alors je pensais à autre chose :
-est-il possible d'insérer, dans ma barre d'outil personnelle, une liste
de
choix qui déclencheront des macros ??
Je vous remercie.
YANN
Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux pointillés
suivants, je l'ai je pense assez bien commenté pour plus de compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur", CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher", Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer, _
LargeurForm As Integer, Gras As Boolean, Barrer As Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer
Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux pointillés
suivants, je l'ai je pense assez bien commenté pour plus de compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur", CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher", Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer, _
LargeurForm As Integer, Gras As Boolean, Barrer As Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer
Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux pointillés
suivants, je l'ai je pense assez bien commenté pour plus de compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur", CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher", Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer, _
LargeurForm As Integer, Gras As Boolean, Barrer As Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer
Salut,
merci pour ton code, c'est un truc de pro ça !!!
Alors, par contre, j'ai un peu de mal sur le cadre.
En fait, je ne vois que peu les boutons "Imprimer" et "Aperçu".
de plus, j'ai une cinquantaine d'onglets, mais leur nom est assez court (5
caractères au max), donc est-il possible d'avoir 7 ou choix par ligne ?
Et peut-on faire un choix qui regroupe plusieurs onglets ? je m'explique.
C'est un dossier de travail que je crée.
En choix d'impression, je voudrais avoir un choix d'impression par cycle
En fait, si j'imprime la feuille 10, je veux par conséquent imprimer la
10.21, la 10.31 et la 10.41 en même temps. (avec une condition, qui je
pense
est complexe, je verrais ultérieurement)
et celà de manière un eu identique quand j'imprime la feuille 20.
Merci de votre aide.
YANN
"Hervé" a écrit :Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes
directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les
feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux
pointillés
suivants, je l'ai je pense assez bien commenté pour plus de
compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur",
CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher",
Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui
vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer,
_
LargeurForm As Integer, Gras As Boolean, Barrer As
Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer
Salut,
merci pour ton code, c'est un truc de pro ça !!!
Alors, par contre, j'ai un peu de mal sur le cadre.
En fait, je ne vois que peu les boutons "Imprimer" et "Aperçu".
de plus, j'ai une cinquantaine d'onglets, mais leur nom est assez court (5
caractères au max), donc est-il possible d'avoir 7 ou choix par ligne ?
Et peut-on faire un choix qui regroupe plusieurs onglets ? je m'explique.
C'est un dossier de travail que je crée.
En choix d'impression, je voudrais avoir un choix d'impression par cycle
En fait, si j'imprime la feuille 10, je veux par conséquent imprimer la
10.21, la 10.31 et la 10.41 en même temps. (avec une condition, qui je
pense
est complexe, je verrais ultérieurement)
et celà de manière un eu identique quand j'imprime la feuille 20.
Merci de votre aide.
YANN
"Hervé" a écrit :
Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes
directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les
feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux
pointillés
suivants, je l'ai je pense assez bien commenté pour plus de
compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur",
CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher",
Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui
vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer,
_
LargeurForm As Integer, Gras As Boolean, Barrer As
Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer
Salut,
merci pour ton code, c'est un truc de pro ça !!!
Alors, par contre, j'ai un peu de mal sur le cadre.
En fait, je ne vois que peu les boutons "Imprimer" et "Aperçu".
de plus, j'ai une cinquantaine d'onglets, mais leur nom est assez court (5
caractères au max), donc est-il possible d'avoir 7 ou choix par ligne ?
Et peut-on faire un choix qui regroupe plusieurs onglets ? je m'explique.
C'est un dossier de travail que je crée.
En choix d'impression, je voudrais avoir un choix d'impression par cycle
En fait, si j'imprime la feuille 10, je veux par conséquent imprimer la
10.21, la 10.31 et la 10.41 en même temps. (avec une condition, qui je
pense
est complexe, je verrais ultérieurement)
et celà de manière un eu identique quand j'imprime la feuille 20.
Merci de votre aide.
YANN
"Hervé" a écrit :Bonsoir Sunburn,
Surtout ne t'affole pas en voyant le code, suit simplement mes
directives.
Sur une form tu pose (n'importe où et de n'importe quelle façon) :
- 1 CommandButton que tu nomme "CmdImprimer"
- 1 CommandButton que tu nomme "CmdApercu"
- 1 Frame que tu nomme "Cadre"
- 1 TextBox que tu nomme "TxtHautForm"
- 1 ComboBox que tu nomme "CmbControle"
- 1 CheckBox que tu nomme "ChkCacher" et que tu titre "Inclure les
feuilles
cachées"
Puis dans le module de la Form, tout ce code (des pointillés aux
pointillés
suivants, je l'ai je pense assez bien commenté pour plus de
compréhension) :
'--------------------------------------------------
'API pour récupérer les dimensions de l'écran
'pour le centrage du formulaire
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
'Constantes pour le centrage du formulaire
Private Const LG_ECRAN = 0
Private Const HT_ECRAN = 1
'nom de la feuille active (pour la réactiver)
'tableau pour les feuilles cachées
Dim FeActive As String
Dim TblCacher() As String
'Constantes pour le dimenssionnement des contrôles
Const ESP_BTN As Integer = 2
Const LARGEUR As Integer = 70
Const HAUTEUR As Integer = 15
Const ESPACE As Integer = 6
Const DIM_BTN As Integer = 20
Const LG_BTN As Integer = 40
Const HT_BTN As Integer = 15
Const BARRE As Integer = 16
Private Sub UserForm_Initialize()
Dim I As Integer
With Me
With .CmbControle
For I = 1 To 10
.AddItem I
Next I
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
.Value = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
End With
.TxtHautForm.Value = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
.ChkCacher.Value = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
End With
CreerControles
FeActive = ActiveSheet.Name
End Sub
Private Sub CmdImprimer_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche la boîte d'impression en activant le bouton
'du menu "Fichier". Passe la variable "I" en référence pour
'savoir le nombre de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Imprimer...").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmdApercu_Click()
Dim I As Integer
'appelle la proc pour sélectionner les feuilles choisies
'et affiche l'aperçu en activant le bouton du menu "Fichier"
'passe la variable "I" en référence pour savoir le nombre
'de feuilles sélectionnées
FeuillesSelect I
If I = 0 Then
MsgBox "Aucune feuille n'a été sélectionnée !"
Exit Sub
End If
Me.Hide
Application.CommandBars("Worksheet Menu Bar") _
.Controls("&Fichier").Controls("&Aperçu avant impression").Execute
'cache à nouveau les feuilles qui l'étaient
On Error Resume Next
For I = 1 To UBound(TblCacher)
Worksheets(TblCacher(I)).Visible = False
Next I
'ré-active la feuille qui était sélectionnée
'à l'ouverture du formulaire
Worksheets(FeActive).Select (True)
Me.Show
End Sub
Private Sub CmbControle_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Controles", "Nombre", _
Me.CmbControle.Value
CreerControles
End Sub
Private Sub TxtHautForm_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Hte As Integer
Dim Tempo As Integer
Tempo = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
On Error Resume Next
With Me.TxtHautForm
Hte = CInt(.Value)
'gère l'erreur si du texte a été saisie
If Err.Number = 13 And .Value <> "" Then
MsgBox "Seul des nombres peuvent être saisies !", _
vbExclamation, "Incompatibilité de type."
.Value = Tempo
Exit Sub
End If
If .Value <> "" Then
If Hte < 75 Then
MsgBox "Valeur trop petite pour un affichage correct " & _
"des cases à cocher dans le formulaire !" & vbCrLf & _
"La dimension minimale est 75", vbExclamation, "Valeur
insuffisante."
.Value = Tempo
Exit Sub
End If
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Form", "Hauteur",
CInt(.Value)
CreerControles
End If
End With
End Sub
Private Sub ChkCacher_Click()
'inscrit la valeur dans la base de registre dans la clé :
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
SaveSetting "FormulaireImpression", "Feuille", "Cacher",
Me.ChkCacher.Value
CreerControles
End Sub
Private Sub CreerControles()
Dim Feuille As Worksheet
Dim CelNonVide As Range
Dim FeAfficher As Integer
Dim LForm As Integer
Dim Nombre As Integer, HauteurMax As Integer
Dim Haut As Integer, Gauche As Integer
Dim Cacher As Boolean
'récupère les valeurs dans la base de registre dans le clé
'HKEY_CURRENT_USERSoftwareVB and VBA Program
SettingsFormulaireImpression
Nombre = CInt(GetSetting("FormulaireImpression", _
"Controles", "Nombre", 4))
HauteurMax = CInt(GetSetting("FormulaireImpression", _
"Form", "Hauteur", 100))
Cacher = CBool(GetSetting("FormulaireImpression", _
"Feuille", "Cacher", False))
Haut = ESPACE
Gauche = ESPACE
LForm = (LARGEUR * Nombre) + (ESPACE * Nombre)
'vide le cadre si une modif est faite le formulaire affiché
With Me.Cadre
.Controls.Clear
.ScrollBars = fmScrollBarsNone
End With
'recherche tout dabord si au moins une cellule n'est pas vide
'si la feuille est visible et si elle contient des données, la
'case est activée sinon elle est désactivée. Si on veux afficher
'les feuilles cachées (case cochée) effectue le même manoeuvre
'que pour les feuilles visibles
'"FeAfficher" sert à compter le nombre de cases à cochées qui
vont
'être ajoutées pour permettre un réajustement de la hauteur
For Each Feuille In Worksheets
Set CelNonVide = Feuille.Cells.Find _
("*", Feuille.[A1], xlFormulas, , , xlPrevious)
If Feuille.Visible = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, False, False, True
End If
Else
If Me.ChkCacher.Value = True Then
FeAfficher = FeAfficher + 1
If CelNonVide Is Nothing Then
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, False
Else
CreerCases Feuille.Name, Haut, Gauche, _
LForm, True, True, True
End If
End If
End If
Next Feuille
'vérifie si il peut y avoir une ligne de cases
'à cocher inférieure au nombre défini et réajuste
'la dimension
If FeAfficher Mod Nombre <> 0 Then Haut = Haut + HAUTEUR + ESPACE
PositionDimensions LForm, Haut, HauteurMax, Nombre
Set Feuille = Nothing
Set CelNonVide = Nothing
End Sub
Sub CreerCases(NomFeuille As String, Haut As Integer, Gauche As Integer,
_
LargeurForm As Integer, Gras As Boolean, Barrer As
Boolean, _
Activer As Boolean)
Dim CaseACocher As MSForms.CheckBox
'crée les cases à cocher et les paramètres
Set CaseACocher = Me.Cadre.Controls.Add _
("Forms.CheckBox.1", _
"Chk" & NomFeuille)
With CaseACocher
.Left = Gauche
.Top = Haut
.Width = LARGEUR
.Height = HAUTEUR
.Caption = NomFeuille
.Enabled = Activer
With .Font
.Name = "Arial Narrow"
.Size = 8
.Strikethrough = Barrer
.Bold = Gras
End With
End With
'calcul du positionnement
If Gauche >= LargeurForm - (LARGEUR + ESPACE) Then
Gauche = ESPACE
Haut = Haut + (HAUTEUR + ESPACE)
Else
Gauche = Gauche + (LARGEUR + ESPACE)
Haut = Haut
End If
Set CaseACocher = Nothing
End Sub
Private Sub PositionDimensions(LargeurForm As Integer, Haut As Integer, _
HauteurMax As Integer, NBCtrl As Integer)
Dim TopCadre As Integer