Valeur décimale inférieur à 1 non reconnu
Bonjour à tous
J'ai un faible niveau en vba, mais je me suis quand même lancé dans l'aventure Excel.
J'ai fait un petit formulaire de saisie pour ma facturation dont l'image est en pièce jointe en bas du post.
Les zones de textes, les zones de listes ou les options en blanc, font parties des zones à remplir (Remise, Qté, Code), à sélectionner (ID Client, Prestations, Commerce, Désignation) ou modifiable (Date).
Séquence :
Dès l'ouverture du formulaire, toutes les zones sont initialisées, les zones sont vides. Un numéro est affecté à la facture ainsi que la date du jour.
Après sélection d'un client sur ID Clients, ses données correspondantes sont affichées. Il reste à définir si il s'agit d'une facture à l'origine d'une prestation, d'un commerce ou les deux.
Une remise et/ou un acompte peuvent être saisie dans les zones de sous total située à côté des boutons d'impression, de validation d'enregistrement, etc,....
En partie basse du formulaire après sélection de la désignation d'une référence, un numéro de ligne est attribué ainsi que sa référence et sa valeur monétaire, le tout s'affichant dans les zones respectives.
Il suffit alors de saisir la quantité souhaitée, pour que son montant soit calculé. En cliquant sur le bouton du bas en bout de ligne du formulaire, l'ensemble des données est transmise sur une feuil de calcul Excel.
Pour éviter la transmission d'une ligne ou le montant ne serait pas calculé faute de ne pas avoir saisi la quantité, une condition est ajouté (Private Sub CmdLSuiv_Click()) . Effectivement dans le cas d'un oubli le click sur le bouton de fin de ligne donne lieu à un message ("Vous ne pouvez pas valider une référence sans préciser sa quantité !"). Cela est vrai lorsque la référence possède un prix unitaire, si par contre elle n'en possède pas aucun problème pour valider la ligne.
Mon problème se situe sur la valeur saisie dans la zone Qté (ZtxtQte) lorsqu'elle est inférieures à 1 soit de 0.01 à 0.99
il la considère comme vide. Les valeurs décimales sont reconnues au dessus de 1 mais pas en dessous.
Je ne sais pas comment solutionner ce problème.
Si quelqu'un à une idée je place le code du formulaire juste en dessous.
Pour si retrouver plus facilement je le sépare par commande :
Option Explicit
'format type des msgbox.
Dim Message As String
Dim Titre As String
Dim Style As Byte
Const entrees_decimales_permises = ".,0123456789"
Const entrees_entieres_permises = "0123456789"
Const Point = "."
Const Virgule = ","Sub annuler()
Dim lLigne As Long
If ZtxtNligne.Value = 1 Then 'Pas de facture
'Annuler ligne en cours
ZtxtNligne.Value = 0
Call NouvelleLigne
Exit Sub
End If
'Annuler les lignes de la facture annulée
For lLigne = Val(Range("V13").Value) - 1 To 1 Step -1
If Cells(lLigne, 1).Value <> Val(CboxDesignation.Value) Then
Exit For 'Terminé
Else
With Sheets("Devis_Facture")
.Range("U2:AA2").Value = ""
.Range("U4:V4").Value = ""
.Range("U6:W6").Value = ""
.Range("Z6").Value = ""
.Range("U8").Value = ""
.Range("B19:B46").Value = ""
.Range("F19:F46").Value = ""
.Range("N19:N46").Value = ""
.Range("P19:P46").Value = ""
.Range("S19:S46").Value = ""
.Range("W19:W46").Value = ""
.Range("X19:X46").Value = ""
.Range("T48").ClearContents
.Range("P50") = 0
.Range("V13").Value = 19
End With
End If
Next
'Annuler ligne en cours
ZtxtNligne.Value = 0
Call NouvelleLigne
'Annuler entête
CboxIdClient.ListIndex = -1
End SubPrivate Sub UserForm_Initialize()
Call InitialiseFiche
Call InitialiserZone1
'Les boutons de ligne suivante et précédente snt désactivé par défaut
Me.CmdLSuiv.Enabled = False
Me.CmdLPrec.Enabled = False
'Le numéro de ligne du formulaire par défaut est désactivé
Me.ZtxtNligne.Enabled = False
Me.ZtxtNligne.Value = 1
'On affecte les listes aux ComboBox
Me.CboxIdClient.RowSource = ("BD_CLIENTS!ID_Clients")
Me.CboxIdClient.ListIndex = -1
Me.CboxDesignation.RowSource = ("BD_PRESTATIONS!List_Prestations")
Me.CboxDesignation.ListIndex = -1
'On affecte les Boutons Option sur un même Groupe
OptType1.GroupName = "TypeFacture"
OptType2.GroupName = "TypeFacture"
OptType3.GroupName = "TypeFacture"
'On affecte la date du jour sur ZtxtDate au format dd/mm/yyyy
ZtxtDate.Value = Format(Now(), "dd/mm/yyyy")
Call InitialiseTotaux
'on déclare que la facture ou le devis n'a pas été imprimé
Range("AA4").Value = "NON"
'on déclare que la facture ou le devis n'a pas été Validé, Edité (PDF) et Enregistré dans la Base de données
Range("W4").Value = "NON" 'Valider
Range("X4").Value = "NON" 'Enegistrer
Range("Y4").Value = "NON" 'EditerPDF
'on intitule l'objet
If Val(Range("V8")) = 1 Then
Range("I17").Value = "Facture n°:"
Range("M52").Value = "Payable avant le :"
FrmDevisFacture.Caption = ("Edition Facture")
Me.Label22.Caption = ("N° de facture")
Me.TypeFacture.Caption = ("Type de facture")
Call NumFact
ElseIf Val(Range("V8")) = 2 Then
Range("I17").Value = "Devis n°:"
Range("M52").Value = "Offre valable jusqu'au :"
FrmDevisFacture.Caption = "Edition Devis"
Me.Label22.Caption = ("N° de devis")
Me.TypeFacture.Caption = ("Type de devis")
Call NumDev
Else
Exit Sub
End If
Worksheets("Devis_Facture").Activate
End SubPrivate Sub InitialiserZone1()
Dim Ctl As Object
With Me.Zone1
For Each Ctl In Me.Controls
If TypeOf Ctl Is MSForms.TextBox Then
Ctl.Value = ""
ElseIf TypeOf Ctl Is MSForms.ComboBox Then
Ctl.ListIndex = -1
End If
Next Ctl
End With
End SubPrivate Sub InitialiseTotaux()
'Initialisation des totaux
Worksheets("Devis_Facture").Select
With Worksheets("Devis_Facture")
Me.ZtxtSousTot.Text = Range("P47")
Me.ZtxtTVAR.Text = Range("D49")
Me.ZtxtTVAN.Text = Range("D50")
Me.ZtxtMontantDu = Range("P51")
End With
End SubPrivate Sub InitialiserZone2()
If CboxDesignation.ListIndex = -1 Then
Me.ZtxtPrxUnit.Value = ""
Me.ZtxtQte.Value = ""
Me.ZtxtCode.Value = ""
Me.ZtxtPref.Value = ""
Me.ZtxtRef.Value = ""
End If
End SubPrivate Sub InitialiseFiche()
'on vide toute les données de la facture par defaut
With Sheets("Devis_Facture")
.Range("U2:AA2").ClearContents
.Range("U4:V4").ClearContents
.Range("U6:W6").ClearContents
.Range("Z6").ClearContents
.Range("U8").ClearContents
.Range("B19:B46").ClearContents
.Range("F19:F46").Value = ""
.Range("N19:N46").Value = ""
.Range("P19:P46").ClearContents
.Range("S19:S46").ClearContents
.Range("W19:W46").ClearContents
.Range("X19:X46").ClearContents
.Range("T48").ClearContents
.Range("P50") = 0
.Range("V13").Value = 19
End With
End SubPrivate Sub CboxIdClient_Change()
Dim Rg As Range
Dim Sh As Worksheet
Set Sh = Worksheets("BD_CLIENTS")
If Me.CboxIdClient.ListIndex > -1 Then
'Recherche l'ID
Set Rg = Worksheets("BD_CLIENTS").Range("A:A").Find(what:=CboxIdClient.Value, LookIn:=xlValues, lookat:=xlWhole)
'Si ID trouvé on alimente les zones du formulaire en données
If Not Rg Is Nothing Then
Me.ZtxtFormeJuridique.Text = Rg.Offset(0, 1).Value
Me.ZtxtRaisonSociale.Text = Rg.Offset(0, 2).Value
Me.ZtxtCivilite.Text = Rg.Offset(0, 3).Value
Me.ZtxtFonction.Text = Rg.Offset(0, 4).Value
Me.ZtxtPrenom.Text = Rg.Offset(0, 6).Value
Me.ZtxtNom.Text = Rg.Offset(0, 5).Value
Me.ZtxtAdresseL1.Text = Rg.Offset(0, 7).Value
Me.ZtxtAdresseL2.Text = Rg.Offset(0, 8).Value
Me.ZtxtCodePostal.Text = Rg.Offset(0, 9).Value
Me.ZtxtVille.Text = Rg.Offset(0, 10).Value
Set Rg = Nothing
End If
Else
InitialiserZone1
End If
End SubPrivate Sub NumDev()
'On affecte le nouveau numéro de facture suivant l'ordre chronologique définit
Worksheets("BD_DEVIS").Select
Dim VarMois As String, ExVarMois As Variant
Dim LastCel As Range
With Worksheets("BD_DEVIS")
Set LastCel = [B65536].End(xlUp)
ExVarMois = Split(LastCel, "-DEV")
VarMois = Format(Date, "yymmdd")
If ExVarMois(0) = VarMois Then
Me.ZtxtNumFact.Text = ExVarMois(0) & "-DEV" & Format(CStr(ExVarMois(1) + 1), "00")
Else
Me.ZtxtNumFact.Text = VarMois & "-DEV01"
End If
End With
End SubPrivate Sub NumFact()
'On affecte le nouveau numéro de facture suivant l'ordre chronologique définit
Worksheets("BD_FACTURES").Select
Dim VarMois As String, ExVarMois As Variant
Dim LastCel As Range
With Worksheets("BD_FACTURES")
Set LastCel = [B65536].End(xlUp)
ExVarMois = Split(LastCel, "-")
VarMois = Format(Date, "yymmdd")
If ExVarMois(0) = VarMois Then
Me.ZtxtNumFact.Text = ExVarMois(0) & "-" & Format(CStr(ExVarMois(1) + 1), "000")
Else
Me.ZtxtNumFact.Text = VarMois & "-001"
End If
End With
End SubSub NouvelleLigne()
Me.ZtxtNligne.Value = Me.ZtxtNligne.Value + 1
Me.CboxDesignation.ListIndex = -1
Me.ZtxtPrxUnit.Value = ""
Me.ZtxtQte.Value = ""
Me.ZtxtCode.Value = ""
Me.ZtxtPref.Value = ""
Me.ZtxtRef.Value = ""
Call InitialiseTotaux
End SubPrivate Sub CboxDesignation_Change()
Dim Rg As Range
Dim Sh As Worksheet
Set Sh = Worksheets("BD_PRESTATIONS")
If (Me.CboxDesignation.ListIndex <> -1 Or (Val(ZtxtNligne.Value) > 1 And Val(ZtxtNligne.Value) <= 28)) And (Me.ZtxtPrxUnit.Value <> 0 Or Me.ZtxtPrxUnit.Value = "") Then
Me.ZtxtMontant.Enabled = True
Me.ZtxtNligne.Enabled = True
Me.CmdLSuiv.Enabled = True
Me.CmdLPrec.Enabled = True
'Recherche de la Référence
Set Rg = Worksheets("BD_PRESTATIONS").Range("A:A").Find(what:=CboxDesignation.Value, LookIn:=xlValues, lookat:=xlWhole)
'Si Référence trouvée on alimente les zones du formulaire en données
If Not Rg Is Nothing Then
Me.ZtxtPref.Text = Rg.Offset(0, 1).Value
Me.ZtxtRef.Text = Rg.Offset(0, 2).Value
Me.ZtxtPrxUnit.Text = Rg.Offset(0, 6).Value
Set Rg = Nothing
End If
Else
Me.ZtxtNligne.Enabled = False
Me.CmdLSuiv.Enabled = False
Me.CmdLPrec.Enabled = False
InitialiserZone2
End If
End SubPrivate Sub CmdLSuiv_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture :"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis :"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
Dim i, N, j
For i = 1 To 3
N = N + Controls("OptType" & i).Value
Next i
'Traiter la ligne en cours
If Val(Me.ZtxtPrxUnit.Value) <> Empty And Val(Me.ZtxtQte.Value) = Empty Then 'Pour ne pas enregistrer une ligne nulle
Beep
MsgBox "Vous ne pouvez pas valider une référence sans préciser sa quantité !", vbExclamation, "Action impossible !"
Exit Sub
ElseIf Val(Me.ZtxtCode.Value) = 0 And Val(Me.ZtxtMontant.Value) <> 0 Then
MsgBox "Vous ne pouvez pas enregistrer une référence sans préciser son code !", vbExclamation, "Action impossible !"
Exit Sub
ElseIf Val(Me.CboxDesignation.ListIndex) = -1 Then
MsgBox "Vous devez sélectionner une référence pour pouvoir éditer une nouvelle ligne !", vbExclamation, "Action impossible !"
Exit Sub
'On teste les saisies...
ElseIf Me.CboxIdClient.Text = Empty Then
MsgBox "Vous devez impérativement entrer ou sélectionner un ID CLIENT !", vbExclamation, "Erreur de sélection !"
CboxIdClient.SetFocus
Exit Sub
'On teste les options
ElseIf N = 0 Then
MsgBox "Vous devez impérativement sélectionner un type de " & obj2 & " !", vbExclamation, "Sélection obligatoire !"
Exit Sub
ElseIf Me.CboxDesignation.Text = Empty And Me.ZtxtNligne < 2 Then
MsgBox "Vous devez impérativement sélectionner une référence pour éditer " & obj1 & " !", vbExclamation, "Sélection Manquante !"
CboxDesignation.SetFocus
Exit Sub
ElseIf Val(Me.ZtxtRemise.Value) < 0 And Val(Me.ZtxtRemise.Value) > 100 Then
MsgBox "Vous devez saisir une valeur comprise entre 0 et 100", vbInformation, "Information"
Exit Sub
Else 'enregistrer la ligne
Cells(Range("V13").Value, 2) = Me.ZtxtNligne.Value
Cells(Range("V13").Value, 6) = Me.CboxDesignation.Value
Cells(Range("V13").Value, 14) = Me.ZtxtPrxUnit.Value
Cells(Range("V13").Value, 16) = Me.ZtxtQte.Value
Cells(Range("V13").Value, 19) = Me.ZtxtCode.Value
Cells(Range("V13").Value, 23) = Me.ZtxtPref.Value
Cells(Range("V13").Value, 24) = Me.ZtxtRef.Value
End If
'Passer à la ligne suivante
If Me.CboxDesignation.ListIndex <> -1 Then
Range("V13").Value = Range("V13").Value + 1
Else
Exit Sub
End If
'Info nombre de ligne max atteint
If Val(ZtxtNligne.Value) = 28 Then
MsgBox "Vous avez édité le nombre maximum de lignes," & Chr(10) & "pouvant être contenues dans la facture.", vbInformation, "Maximum atteint"
End If
'Initialiser les champs
If Cells(Range("V13").Value, 1) <> "" Then
'Édition de ligne existante
Me.ZtxtNligne.Value = Cells(Range("V13").Value, 2)
Me.CboxDesignation.Value = Cells(Range("V13").Value, 6)
Me.ZtxtPrxUnit.Value = Cells(Range("V13").Value, 14)
Me.ZtxtQte.Value = Cells(Range("V13").Value, 16)
Me.ZtxtCode.Value = Cells(Range("V13").Value, 19)
Me.ZtxtPref.Value = Cells(Range("V13").Value, 23)
Me.ZtxtRef.Value = Cells(Range("V13").Value, 24)
Call InitialiseTotaux
Else
Call NouvelleLigne
End If
Me.CboxDesignation.SetFocus 'Activer le 1er champ
'On affecte leur valeur
Dim IdFact As String
For Each j In FrmDevisFacture.TypeFacture.Controls
If j = True Then IdFact = j.Caption
Next j
If Me.ZtxtNligne.Value >= 1 And Me.ZtxtNligne.Value <= 28 And Me.ZtxtNligne.Enabled = True Then
'On envoi les données sur la Facture
With Sheets("Devis_Facture")
.Range("W6").Value = Me.ZtxtNumFact.Value
.Range("U2").Value = Me.ZtxtFormeJuridique.Value
.Range("V2").Value = Me.ZtxtRaisonSociale.Value
.Range("W2").Value = Me.ZtxtCivilite.Value
.Range("U8").Value = Me.ZtxtFonction.Value
.Range("Y2").Value = Me.ZtxtNom.Value
.Range("X2").Value = Me.ZtxtPrenom.Value
.Range("Z2").Value = Me.ZtxtAdresseL1.Value
.Range("AA2").Value = Me.ZtxtAdresseL2.Value
.Range("U4").Value = Me.ZtxtCodePostal.Value
.Range("V4").Value = Me.ZtxtVille.Value
.Range("U6").Value = Me.CboxIdClient.Value
.Range("Z6").Value = Me.ZtxtDate.Value
.Range("V6").Value = IdFact
.Range("P50").Value = Me.ZtxtAcompte.Value
If Me.ZtxtRemise.Value <> Empty Then
.Range("T48").Value = Me.ZtxtRemise.Value / 100
Else
.Range("T48").Value = Me.ZtxtRemise.Value
End If
End With
End If
Call InitialiseTotaux
End SubPrivate Sub CmdLPrec_Click()
If ZtxtNligne.Value = 1 Then
'On ne peut pas reculer avant la ligne 1
Beep
MsgBox "Vous êtes sur la première ligne !", vbExclamation, "Action impossible !"
Exit Sub
End If
With Sheets("Devis_Facture")
'On traite la ligne en cours
If Me.CboxDesignation.ListIndex <> -1 Then 'Enregistrer la ligne s'il y a une désignation
Cells(Range("V13").Value, 2) = ZtxtNligne.Value
Cells(Range("V13").Value, 6) = CboxDesignation.Value
Cells(Range("V13").Value, 14) = ZtxtPrxUnit.Value
Cells(Range("V13").Value, 16) = ZtxtQte.Value
Cells(Range("V13").Value, 19) = ZtxtCode.Value
Cells(Range("V13").Value, 23) = ZtxtPref.Value
Cells(Range("V13").Value, 24) = ZtxtRef.Value
End If
'On passer à la ligne précédente
Range("V13").Value = Range("V13").Value - 1
'Édition de ligne existante
ZtxtNligne.Value = Cells(Range("V13").Value, 2)
CboxDesignation.Value = Cells(Range("V13").Value, 6)
ZtxtPrxUnit.Value = Cells(Range("V13").Value, 14)
ZtxtQte.Value = Cells(Range("V13").Value, 16)
ZtxtCode.Value = Cells(Range("V13").Value, 19)
ZtxtPref.Value = Cells(Range("V13").Value, 23)
ZtxtRef.Value = Cells(Range("V13").Value, 24)
Call InitialiseTotaux
CboxDesignation.SetFocus 'Activer le 1er champ
End With
InitialiseTotaux
End SubPrivate Sub CmdValider_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
'On teste les saisies...
If Me.CboxIdClient.Text = Empty Then
MsgBox "Vous devez impérativement entrer ou sélectionner un ID CLIENT !", vbExclamation, "Erreur de sélection !"
CboxIdClient.SetFocus
Exit Sub
End If
If Me.CboxDesignation.Text = Empty And ZtxtNligne < 2 Then
MsgBox "Vous devez impérativement sélectionner une référence pour éditer " & obj1 & " !", vbExclamation, "Sélection Manquante !"
CboxDesignation.SetFocus
Exit Sub
End If
'On contrôle si la facture ou le devis à été imprimée avant de valider
If Sheets("Devis_Facture").Range("AA4").Value = "NON" And Sheets("Devis_Facture").Range("Y4").Value = "NON" Then
If MsgBox("Vous n'avez pas lancé l'impression" & Chr(10) & "souhaitez-vous le faire maintenant ?", vbYesNo, "Information") = vbYes Then
Call CmdImprimer_Click
Else
End If
End If
'On contrôle si la facture ou le devis à été enregistré avant de valider
If Sheets("Devis_Facture").Range("X4").Value = "NON" Then
If MsgBox("Votre " & obj2 & " n'a pas été enregistré" & term & "." & Chr(10) & "Souhaitez-vous le faire maintenant ?", vbYesNo, "Information") = vbYes Then
Call CmdEnregistrer_Click
Else
Exit Sub
End If
ElseIf Sheets("Devis_Facture").Range("X4").Value = "OUI" Then
If MsgBox("Souhaitez-vous apporter des modifications avant de valider ?", vbYesNo, "Attention !") = vbYes Then
Exit Sub
Else
Worksheets(BaseD).Select
'On contrôle pour savoir si le numéro de facture ou de devis n'existe pas déjà
Dim NumDevFact
NumDevFact = Me.ZtxtNumFact.Value
Set NumDevFact = Range("B:B").Find(NumDevFact, lookat:=xlWhole)
If NumDevFact Is Nothing Then
'On envoi les données sur la Base de Données Factures
Dim NewCel As Double
NewCel = Cells(65536, 2).End(xlUp).Rows.Row + 1
With Range("A" & NewCel & ":Z" & NewCel)
.Insert Shift:=xlDown
.Offset(-1).FillDown
.Offset(-1).SpecialCells(xlCellTypeConstants, 23).ClearContents
End With
With Sheets(BaseD)
.Range("B" & Val(NewCel)).Value = ZtxtNumFact.Value
.Range("C" & Val(NewCel)).Value = ZtxtFormeJuridique.Value
.Range("D" & Val(NewCel)).Value = ZtxtRaisonSociale.Value
.Range("E" & Val(NewCel)).Value = ZtxtCivilite.Value
.Range("F" & Val(NewCel)).Value = ZtxtFonction.Value
.Range("G" & Val(NewCel)).Value = ZtxtNom.Value
.Range("H" & Val(NewCel)).Value = ZtxtPrenom.Value
.Range("I" & Val(NewCel)).Value = ZtxtAdresseL1.Value
.Range("J" & Val(NewCel)).Value = ZtxtAdresseL2.Value
.Range("K" & Val(NewCel)).Value = ZtxtCodePostal.Value
.Range("L" & Val(NewCel)).Value = ZtxtVille.Value
.Range("M" & Val(NewCel)).Value = CboxIdClient.Value
.Range("N" & Val(NewCel)).Value = ZtxtDate.Value
.Range("P" & Val(NewCel)).Value = Sheets("Devis_Facture").Range("V6")
.Range("Q" & Val(NewCel)).Value = ZtxtMontantDu.Value
If Val(ZtxtTVAN.Value) > 0 Then
.Range("R" & Val(NewCel)).Value = ZtxtTVAN.Value
Else
.Range("R" & Val(NewCel)).Value = ""
End If
If Val(ZtxtTVAR.Value) > 0 Then
.Range("S" & Val(NewCel)).Value = ZtxtTVAR.Value
Else
.Range("S" & Val(NewCel)).Value = ""
End If
If Sheets("Devis_Facture").Range("AA4").Value = "OUI" Or Sheets("Devis_Facture").Range("Y4").Value = "OUI" Then
.Range("U" & Val(NewCel)).Value = "OUI"
Sheets("Devis_Facture").Range("W4").Value = "OUI"
Else
.Range("U" & Val(NewCel)).Value = "NON"
End If
End With
Call FormatCellAuto
Worksheets("Devis_Facture").Activate
MsgBox "Votre " & obj2 & " n°" & Me.ZtxtNumFact.Value & " a bien enregistré" & term & " dans la base de données", vbInformation, obj2 & " ajouté" & term
Else
Worksheets("Devis_Facture").Activate
MsgBox "Votre " & obj2 & " a déjà été validé" & term & " !", vbExclamation, "Action refusée"
Exit Sub
End If
End If
End If
'Si le devis ou la facture à été enregistré et validé on décharge le formulaire
Worksheets("Devis_Facture").Activate
If Range("X4").Value = "OUI" And Range("W4").Value = "OUI" Then
Unload FrmDevisFacture
FrmDevisFacture.Show
Else
Exit Sub
End If
End SubPrivate Sub CmdQuitter_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
If MsgBox("Vous souhaitez abandonner " & obj1 & " en cours ?", vbYesNo, "Annuler " & obj2) = vbYes Then
If Range("X4").Value = "NON" And Range("W4").Value = "NON" And Range("AA4").Value = "NON" Then
Call annuler
Worksheets("Formulaires").Activate
Unload FrmDevisFacture
ElseIf Range("X4").Value = "NON" And Range("W4").Value = "NON" And Range("AA4").Value = "OUI" Then
If MsgBox("Cette " & obj2 & " à été imprimé" & term & " mais n'est ni validé" & term & ", ni enregistré" & term & " ." & Chr("10") & "Souhaitez-vous effectuer ces opérations maintenant ?", vbYesNo, "Attention !") = vbYes Then
Call CmdEnregistrer_Click
Call CmdValider_Click
Else
Exit Sub
End If
ElseIf Range("X4").Value = "NON" And Range("W4").Value = "OUI" Then
If MsgBox("Vous avez validé " & obj1 & "," & Chr(13) & "mais n'a pas été enregistré" & term & " !" & Chr(10) & "Souhaitez-vous Enregistrer maintenant ?", vbYesNo, "Attention !") = vbYes Then
Call CmdEnregistrer_Click
Else
Exit Sub
End If
ElseIf Range("X4").Value = "OUI" And Range("W4").Value = "NON" Then
If MsgBox("Vous avez enregistré " & obj1 & "," & Chr(13) & "mais n'a pas été validé" & term & " dans la Base de données !" & Chr(10) & "Souhaitez-vous Valider maintenant ?", vbYesNo, "Attention !") = vbYes Then
Call CmdValider_Click
Else
Exit Sub
End If
ElseIf Range("X4").Value = "OUI" And Range("W4").Value = "OUI" And Range("AA4").Value = "NON" Then
If MsgBox("Vous n'avez pas imprimé " & obj1 & "." & Chr(10) & "Souhaitez-vous l'imprimer maintenant ?", vbYesNo, "Option") = vbYes Then
Call CmdImprimer_Click
Else
Call annuler
Worksheets("Formulaires").Activate
Unload FrmDevisFacture
End If
ElseIf Range("X4").Value = "OUI" And Range("W4").Value = "OUI" And Range("AA4").Value = "OUI" Then
Call annuler
Worksheets("Formulaires").Activate
Unload FrmDevisFacture
Else
Exit Sub
End If
Exit Sub
End If
End SubPrivate Sub CmdEnregistrer_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture :"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis :"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
If ZtxtMontantDu.Value = 0 Then
MsgBox "Vous ne pouvez pas enregistrer " & obj1 & " non renseigné" & term & " !", vbExclamation, "Oups !!!"
Exit Sub
ElseIf ActiveWorkbook.Saved = False Then
Sheets("Devis_Facture").Select
Sheets("Devis_Facture").Copy
If Val(Range("V8")) = 1 Then
ActiveWorkbook.SaveAs Filename:="C:\Users\Stéphane\Desktop\Factures\" & Range("Z4").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ElseIf Val(Range("V8")) = 2 Then
ActiveWorkbook.SaveAs Filename:="C:\Users\Stéphane\Desktop\Devis\" & Range("Z4").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End If
If ActiveWorkbook.Saved = True Then
ActiveWorkbook.Close
Sheets("Devis_Facture").Range("X4").Value = "OUI"
MsgBox obj1 & " " & Me.ZtxtNumFact.Value & " a bien enregistré" & term & " dans le répertoire Exercice3", vbInformation, obj2 & " ajouté" & term
Else
MsgBox "Une erreur est survenue pendant la sauvegarde !", vbExclamation, "Oups !!!"
Exit Sub
End If
End If
End SubPrivate Sub CmdPDF_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture :"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis :"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
If ZtxtMontantDu.Value = 0 Then
MsgBox "Vous ne pouvez pas enregistrer " & obj1 & " non renseigné" & term & " !", vbExclamation, "Oups !!!"
Exit Sub
Else
If Val(Range("V8")) = 1 Then
Range("A1:T57").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$T$57"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Users\Stéphane\Desktop\Factures\" & Range("Z4").Value & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
ElseIf Val(Range("V8")) = 2 Then
Range("A1:T57").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$T$57"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Users\Stéphane\Desktop\Devis\" & Range("Z4").Value & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
End If
Sheets("Devis_Facture").Range("Y4").Value = "OUI"
MsgBox obj1 & " " & Me.ZtxtNumFact.Value & " sous format PDF a bien enregistré" & term & " dans le répertoire Exercice3", vbInformation, obj2 & " ajouté" & term
Range("A1").Select
End If
End SubPrivate Sub CmdImprimer_Click()
Sheets("Devis_Facture").Select
If Range("AA4").Value = "NON" Then
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True, IgnorePrintAreas:=False
Range("AA4").Value = "OUI"
ElseIf Sheets("Devis_Facture").PrintOut = True And Range("AA4").Value = "OUI" Then
If MsgBox("Vous avez déjà lancé une impression. Désirez-vous en lancer une nouvelle ?", vbOKCancel, "Nouvelle impression !") = vbOK Then
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True, IgnorePrintAreas:=False
Else
Exit Sub
End If
End If
End SubPrivate Sub CmdEffacer_Click()
If MsgBox("Vous souhaitez Effacer la facture en cours ?", vbOKCancel, "Effacer facture") = vbOK Then
Call annuler
Call InitialiserZone1
'Les boutons de ligne suivante et précédente snt désactivé par défaut
Me.CmdLSuiv.Enabled = False
Me.CmdLPrec.Enabled = False
'Le numéro de ligne du formulaire par défaut est désactivé et sa valeur portée à 1
Me.ZtxtNligne.Enabled = False
Me.ZtxtNligne.Value = 1
'On affecte les listes aux ComboBox
Me.CboxIdClient.RowSource = ("BD_CLIENTS!ID_Clients")
Me.CboxIdClient.ListIndex = -1
Me.CboxDesignation.RowSource = ("BD_PRESTATIONS!List_Prestations")
Me.CboxDesignation.ListIndex = -1
'On affecte les Boutons Option sur un même Groupe
OptType1.GroupName = "TypeFacture"
OptType2.GroupName = "TypeFacture"
OptType3.GroupName = "TypeFacture"
'On affecte la date du jour sur ZtxtDate au format dd/mm/yyyy
ZtxtDate.Value = Format(Now(), "dd/mm/yyyy")
'on déclare que la facture ou le devis n'a pas été imprimé
Range("AA4").Value = "NON"
'on déclare que la facture ou le devis n'a pas été Validé, Edité (PDF) et Enregistré dans la Base de données
Range("W4").Value = "NON" 'Valider
Range("X4").Value = "NON" 'Enegistrer
Range("Y4").Value = "NON" 'EditerPDF
'on intitule l'objet
If Val(Range("V8")) = 1 Then
Range("I17").Value = "Facture n°:"
Range("M52").Value = "Payable avant le :"
FrmDevisFacture.Caption = ("Edition Facture")
Me.Label22.Caption = ("N° de facture")
Me.TypeFacture.Caption = ("Type de facture")
Call NumFact
ElseIf Val(Range("V8")) = 2 Then
Range("I17").Value = "Devis n°:"
Range("M52").Value = "Offre valable jusqu'au :"
FrmDevisFacture.Caption = "Edition Devis"
Me.Label22.Caption = ("N° de devis")
Me.TypeFacture.Caption = ("Type de devis")
Call NumDev
Else
Exit Sub
End If
Call InitialiseTotaux
Else
Exit Sub
End If
End SubPrivate Sub ZtxtMontant_Change()
ZtxtMontant.Value = Format(ZtxtMontant, "0.00")
End SubPrivate Sub ZtxtMontantDu_Change()
ZtxtMontantDu.Value = Format(ZtxtMontantDu, "0.00")
End SubPrivate Sub ZtxtPrxUnit_Change()
ZtxtPrxUnit.Value = Format(ZtxtPrxUnit, "0.00")
End SubPrivate Sub ZtxtQte_Change()
If ZtxtPrxUnit.Value = Empty Then
ZtxtMontant.Value = Empty
Else
ZtxtMontant.Value = ZtxtPrxUnit.Value * ZtxtQte.Value
End If
End SubPrivate Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'pour l'utilisation du point du pavé numérique comme virgule
If KeyAscii = Asc(Point) Then
If InStr(ZtxtQte, Virgule) = 0 Then
KeyAscii = Asc(Virgule)
Else
KeyAscii = 0
End If
ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
KeyAscii = 0
ElseIf InStr(ZtxtQte, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
KeyAscii = 0
End If
If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End SubPrivate Sub ZtxtSousTot_Change()
ZtxtSousTot.Value = Format(ZtxtSousTot, "0.00")
End SubPrivate Sub ZtxtTVAN_Change()
ZtxtTVAN.Value = Format(ZtxtTVAN, "0.00")
End SubPrivate Sub ZtxtTVAR_Change()
ZtxtTVAR.Value = Format(ZtxtTVAR, "0.00")
End SubMerci par avance de votre attention.
Pour ceux qui souhaiterai tester ce formulaire je joins une adresse sur un autre forum, le fichier étant trop volumineux pour être sur celui-ci.
A déziper sur le Bureau et il faut penser à modifier les chemins de sauvegarde dans la CmdEnregistrer et la CmdPDF.
Remplacer Stéphane par votre nom de session windows, pour moi le chemin est C:\Users\Stéphane\Desktop\Factures\
Vous aurez comme cela la possibilité de faire les différents test.
Bonjour
Modifies ta macro ZtxtQte_Change dans le code de l'userform FrmDevisFacture
Private Sub ZtxtQte_Change()
If ZtxtPrxUnit.Value = Empty Then
ZtxtMontant.Value = Empty
Else
ZtxtMontant.Value = ZtxtPrxUnit.Value * Val(Replace(ZtxtQte.Value, ",", "."))
'ZtxtMontant.Value = ZtxtPrxUnit.Value * ZtxtQte.Value
End If
End SubSalut et merci de ta réponse.
Le problème ne vient pas de la gestion du point ou de la virgule.
Cette option est abordée dans les déclarations d'option et dans le code
Private Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'pour l'utilisation du point du pavé numérique comme virgule
If KeyAscii = Asc(Point) Then
If InStr(ZtxtQte, Virgule) = 0 Then
KeyAscii = Asc(Virgule)
Else
KeyAscii = 0
End If
ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
KeyAscii = 0
ElseIf InStr(ZtxtQte, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
KeyAscii = 0
End If
If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
Exit Sub
End SubPour faire court un internaute sur un autre forum vient de me solutionner le problème. Tu peux remarquer qu'un exit sub à été rajouté sur la fin du code ci-dessus et il a suffit de modifier la condition suivante :
Private Sub ZtxtQte_Change()
' Si le PU est vide, ou si la Qt est vide, ou si la Qt n'est pas numérique
If ZtxtPrxUnit.Value = Empty Or ZtxtQte.Value = Empty Or Not IsNumeric(ZtxtQte.Value) Then
' On ne calcul rien et on met le montant à zéro
ZtxtMontant.Value = Empty
Else
ZtxtMontant.Value = ZtxtPrxUnit.Value * ZtxtQte.Value
End If
End SubMerci de t'être penché sur ce problème.
Bonsoir
C'est un gag ?
Rajouter un Exit Sub avant un End Sub c'est comment dire ..... ajouter de l'eau à de l'eau pour qu'elle soit mouillée : Inutile
Tu n'as pas tout copié ?
Mais juste pour m'informer as tu essayé la solution que je propose
Banzai64 a écrit :Bonsoir
C'est un gag ?
Rajouter un Exit Sub avant un End Sub c'est comment dire ..... ajouter de l'eau à de l'eau pour qu'elle soit mouillée : Inutile
Tu n'as pas tout copié ?
Mais juste pour m'informer as tu essayé la solution que je propose
Bonjour,
non ce n'est pas un gag et oui le exit sub est mal placé,
Désolé je n'avais pas vu ta réponse.
Pour l'explication, c'est moi qui l'ai mal recopié.
d'ailleurs je l'ai retirer complètement....
En ce qui concerne ta solution, non je n'ai pas eu le temps de la tester, ça devra attendre dimanche prochain.
Je n'ai pas le loisir de le faire en semaine, mais je te tiens informé.
Au risque de me répéter le problème ne vient pas de la gestion du point ou de la virgule mais de la valeur saisie dans ZtxtQte lorsqu'elle est inférieur à 1 et supérieur ou égale à 0.
Pour info voici les modifs apportées sur :
"Le rajout d'une troisième condition" : Or Not IsNumeric(ZtxtQte.Value)
Private Sub ZtxtQte_Change()
' Si le PU est vide, ou si la Qt est vide, ou si la Qt n'est pas numérique
If ZtxtPrxUnit.Value = Empty Or ZtxtQte.Value = Empty Or Not IsNumeric(ZtxtQte.Value) Then
' On ne calcul rien et on met le montant à zéro
ZtxtMontant.Value = Empty
Else
ZtxtMontant.Value = ZtxtPrxUnit.Value * ZtxtQte.Value
End If
End SubSuppression de Exit Sub :
Private Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'pour l'utilisation du point du pavé numérique comme virgule
If KeyAscii = Asc(Point) Then
If InStr(ZtxtQte, Virgule) = 0 Then
KeyAscii = Asc(Virgule)
Else
KeyAscii = 0
End If
ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
KeyAscii = 0
ElseIf InStr(ZtxtQte, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
KeyAscii = 0
End If
If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Subet enfin on ré-enfonce le clou avec And Not IsNumeric(Me.ZtxtQte.Value)
dans la première vérif:
Private Sub CmdLSuiv_Click()
Dim obj1 As String, obj2 As String, term As String, BaseD As String
If Val(Range("V8")) = 1 Then
obj1 = "la facture :"
obj2 = "facture"
term = "e"
BaseD = "BD_FACTURES"
ElseIf Val(Range("V8")) = 2 Then
obj1 = "le devis :"
obj2 = "devis"
term = ""
BaseD = "BD_DEVIS"
Else
Exit Sub
End If
Dim i, N, j
For i = 1 To 3
N = N + Controls("OptType" & i).Value
Next i
'Traiter la ligne en cours
If Val(Me.ZtxtPrxUnit.Value) <> Empty And Not IsNumeric(Me.ZtxtQte.Value) Then 'Pour ne pas enregistrer une ligne nulle
Beep
MsgBox "Vous ne pouvez pas valider une référence sans préciser sa quantité !", vbExclamation, "Action impossible !"
Exit Sub
etc......La gestion du point et de la virgule est déclarée dans les Option Explicit:
Option Explicit
'format type des msgbox.
Dim Message As String
Dim Titre As String
Dim Style As Byte
Const entrees_decimales_permises = ".,0123456789"
Const entrees_entieres_permises = "0123456789"
Const Point = "."
Const Virgule = ","Ainsi déclaré avec le Private Sub ZtxtQte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Quelque soit l'uitlisation du point ou de sa virgule sur le clavier aplha ou du point surle pavé numérique, le formulaire affiche toujours une virgule et effectue le calcul correctement du côté feuil de calcul excel.
Ce code correspond vraiment à mes attentes pour la conception de factures et de devis.
Merci encore.