Userform / validation format €

GADENSEB

XLDnaute Impliqué
Bonjour le Forum,
J’espère que vous allez bien !

Je reviens avec une question basique mais qui me pose probléme :
La validation des données à la sortie d'un Userform
J'ai 2 textbox (DEBIT et CREDIT) que je souhaite valider au format "€" classique.

Pour précision, je ne valide aucun format au moment de la saisie dans les textbox.

J'essaye avec un isnumeric et j'obtiens une erreur
"Erreur de compilation : Sub ou fonction non définie"
mmmm j'ai dû sauter une étape ....

Voici mon code :

Code:
Private Sub Validation_Click()
'Enregistre les données dans la BDD
Dim LastLigne As Integer
Dim ModeRecalcul As Long


ModeRecalcul = Application.Calculation

' Réglage du recalcul sur mode manuel
Application.Calculation = xlCalculationManual
 
If MsgBox("Ajouter une nouvelle Ligne ? ", vbYesNo, " Demande de confirmation d’ajout ") = vbYes Then
 
LastLigne = Sheets("COMPTES").Range("a65536").End(xlUp).Row + 1
Dim c, x&
     For Each c In Me.Controls
    
        If c.Tag <> "" Then
            x = c.Tag
            If IsDate(c.Value) Then
                Feuil3.Cells(LastLigne, x).Value = CDate(c.Value)
             if IsNumeric(c.Value) Then
               Feuil3.Cells(LastLigne, x).Value = SetFocus(c.Value)
            Else
                Feuil3.Cells(LastLigne, x).Value = c.Value
            End If
        End If
    Next
End If
Unload Me

' Rétablissement du mode de recalcul d'origine
Application.Calculation = ModeRecalcul

End Sub


QQn aurais une idée ??

Bonne journée

Seb
 

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

Mais, là évidemment !
VB:
ElseIf ContitionAppropriée Then
    Feuil3.Cells(LastLigne, X).Value = CCur(c.Value)
En même temps, même si c'est converti automatiquement ça documente en quelque sorte le code en indiquant que tu veux y mettre un montant
Le mieux serait sans doute de faire un Select Case X
avec des Case …,…,…: Feuil3.Cells(LastLigne, X).Value = CCur(c.Value) En remplaçant les … par les numéros des colonnes de montants ou alors de l'indiquer dans le Tag derrière le numéro de colonne, et récupérer les deux info dans un tableau XY = Split(Tag)
Est-ce d'ailleurs bien pratique de faire ça avec une boucle ? J'en doute !
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Re : Userform / validation format €

Oula je suis perdu.
Disons une solution simple mais efficace. .. :
- Au moment de l'insertion des données
- mise à jour des données précédentes de la BDD pour harmoniser le tout.....
c jouable ?
 

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

La solution simple et efficace c'est de foutre en l'air cette fichue boucle et d'affecter au coup par coup, par une série d'affectations individuelles qui descend tout droit, comme on dit dans ce cas, à chaque Cells(Ligne, Colonne).Value = [CDate(, CCur( ou rien du tout(]LeControle.Text[)]
Moi j'affecterais plutôt les valeurs de contrôles à des éléments d'un tableau 2D d'une seule ligne, de façon à pouvoir l'écrire d'un seul coup à la fin. (Un accès à un nombre quelconque de milllers de cellules ou d'une seule cellule prenant toujours à peu près le même temps pénalisant)
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Re : Userform / validation format €

ok alors s'y pour ça comment je prépare le travail ?
J'ai déjà qq de prédifini
cela suffit ?
formats.PNG
 

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

Sans boucle il n'y a rien à préparer, juste mettre les affectations les unes en dessous des autres.
Indiquez naturellement chaque contrôle par son nom, vous n'allez pas vous amuser à garder un Me.Controls(quelque chose)
 

GADENSEB

XLDnaute Impliqué
Re : Userform / validation format €

Bon je viens de composer cela :
ca marche
Qu'est-ce que tu en penses ?

Petit ajout pour DEDIT OU CREDIT : c'est soit l'un soit l'autre comment switché entre les deux au moment de l'import?


Code:
Private Sub Bt_Validation_Click()
'Enregistre les données dans la BDD
Dim LastLigne As Integer

'Fige l'écran pendant l'éxécution de la macro
Application.ScreenUpdating = False

' Réglage du recalcul sur mode manuel
Application.Calculation = xlCalculationManual

'Texte PopUp
TexteDate = "En date du : " & DATESAISIE
Textecompte = "Sur le Compte : " & COMPTE
TexteBR = "En : " & BUDGETREEL
TexteDépenses = "Pour la dépense : " & LIBELLE

If DEBIT <> "" Then
TexteMtt = "Pour un montant de : " & DEBIT & " €"
Else: TexteMtt = "Pour un montant de : " & CREDIT & " €"
End If

TextePopUp = Chr(10) & TexteDate & Chr(10) & Textecompte & Chr(10) & TexteBR & _
             Chr(10) & TexteDépenses & Chr(10) & TexteMtt

If MsgBox("Ajouter une nouvelle Ligne ? " & Chr(10) & TextePopUp, vbYesNo, _
    " Demande de confirmation d'ajout ") = vbYes Then
 
  Set f = Sheets("COMPTES")
  LastLigne = Sheets("COMPTES").Range("a65536").End(xlUp).Row + 1

f.Cells(LastLigne, 1) = Me.CODE
f.Cells(LastLigne, 2) = CDate(Me.DATESAISIE)
f.Cells(LastLigne, 4) = Me.MOIS
f.Cells(LastLigne, 5) = Me.BUDGETREEL
f.Cells(LastLigne, 6) = Me.COMPTE
f.Cells(LastLigne, 7) = Me.POSTE
f.Cells(LastLigne, 10) = Me.NUMERO
f.Cells(LastLigne, 11) = Me.LIBELLE
f.Cells(LastLigne, 12) = Me.MODERGT
f.Cells(LastLigne, 15) = Me.BQ
f.Cells(LastLigne, 16) = CCur(Me.DEBIT)
'f.Cells(LastLigne, 17) = CCur(Me.CREDIT)
    
End If

' Rétablissement du mode de recalcul d'origine
Application.Calculation = xlAutomatic


'Défige l'écran aprés l'éxécution de la macro
 Application.ScreenUpdating = True
 
 Unload Me

End Sub

Comment optimiser le tout si possible ?

Merci à toi
 

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

Je déclarerais une VLgn(1 To 1, 1 To 17)
Au lieu de f.Cells(Lastligne, X) je mettrais chaque fois VLgn(1, X)
et à la fin: f.Rows(LastLigne).Resize(, 17).Value2 = VLgn
Si c'est mis sous forme de tableau (Excel cette fois) on peut faire :
f.ListObjects(1).ListRows.Add.Range.Value2 = VLgn
 

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

Bon si c'est pas mis sous forme de tableau dans Excel, laisse tomber…
Si ça l'est on peut s'éviter le .End(xlUp).Row + 1
car le nombre de lignes du tableau est connu, et de plus on n'a même plus besoin de le connaître.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Userform / validation format €

C'est une bonne question… Je n'ai jamais souffert de devoir m'en passer en Excel 2003.
J'y ai vu un tout petit os en tant que programmeur: après ajout d'une ligne son DataBodyRange n'est pas rectifié dans une variable Range à laquelle on l'a affecté. Alors qu'avec un Range ordinaire, en insérant une copie de sa dernière ligne devant elle même, si. Or ça on n'a justement plus le droit de le faire sur un ListObject. Mais c'est le seul inconvénient. Le reste consiste plutôt en quelques légers avantages. Mais Microsoft n'a pas de quoi pavoiser pour avoir créé cet objet: j'aurais pu en faire largement autant !
 
Dernière édition:

GADENSEB

XLDnaute Impliqué
Re : Userform / validation format €

je t'avoue que je suis complément largé lol

Code:
Private Sub Bt_Validation_Click()
'Enregistre les données dans la BDD
Dim LastLigne As Integer

'Fige l'écran pendant l'éxécution de la macro
Application.ScreenUpdating = False

' Réglage du recalcul sur mode manuel
Application.Calculation = xlCalculationManual

'Texte PopUp
TexteDate = "En date du : " & DATESAISIE
Textecompte = "Sur le Compte : " & COMPTE
TexteBR = "En : " & BUDGETREEL
TexteDépenses = "Pour la dépense : " & LIBELLE

If DEBIT <> "" Then
TexteMtt = "Pour un montant de : " & DEBIT & " €"
Else: TexteMtt = "Pour un montant de : " & CREDIT & " €"
End If

TextePopUp = Chr(10) & TexteDate & Chr(10) & Textecompte & Chr(10) & TexteBR & _
             Chr(10) & TexteDépenses & Chr(10) & TexteMtt

If MsgBox("Ajouter une nouvelle Ligne ? " & Chr(10) & TextePopUp, vbYesNo, _
    " Demande de confirmation d'ajout ") = vbYes Then
 
  Set f = Sheets("COMPTES")
  LastLigne = Sheets("COMPTES").Range("a65536").End(xlUp).Row + 1

f.Cells(LastLigne, 1) = Me.CODE
f.Cells(LastLigne, 2) = CDate(Me.DATESAISIE)
f.Cells(LastLigne, 4) = Me.MOIS
f.Cells(LastLigne, 5) = Me.BUDGETREEL
f.Cells(LastLigne, 6) = Me.COMPTE
f.Cells(LastLigne, 7) = Me.POSTE
f.Cells(LastLigne, 10) = Me.NUMERO
f.Cells(LastLigne, 11) = Me.LIBELLE
f.Cells(LastLigne, 12) = Me.MODERGT
f.Cells(LastLigne, 15) = Me.BQ
If DEBIT <> "" Then
f.Cells(LastLigne, 16) = CCur(Me.DEBIT)
End If
If CREDIT <> "" Then
f.Cells(LastLigne, 17) = CCur(Me.CREDIT)
 End If
End If


' Rétablissement du mode de recalcul d'origine
Application.Calculation = xlAutomatic


'Défige l'écran aprés l'éxécution de la macro
 Application.ScreenUpdating = True
 
 Unload Me

End Sub

Fonctionne super bien

Merci de ton aide en tt as !!

A bientot
Seb
 

GADENSEB

XLDnaute Impliqué
Re : Userform / validation format €

Hello

JE reviens sur ce fichier, j'ai un soucis qui vient d'apapraitre suite à la nouvelle macro que l'on discutait

Code:
Private Sub Bt_Validation_Click()
'Enregistre les données dans la BDD
Dim LastLigne As Integer

'Fige l'écran pendant l'éxécution de la macro
Application.ScreenUpdating = False

' Réglage du recalcul sur mode manuel
Application.Calculation = xlCalculationManual

'Texte PopUp
TexteDate = "En date du : " & DATESAISIE
Textecompte = "Sur le Compte : " & COMPTE
TexteBR = "En : " & BUDGETREEL
TexteDépenses = "Pour la dépense : " & LIBELLE

If DEBIT <> "" Then
TexteMtt = "Pour un montant de : " & DEBIT & " €"
Else: TexteMtt = "Pour un montant de : " & CREDIT & " €"
End If

TextePopUp = Chr(10) & TexteDate & Chr(10) & Textecompte & Chr(10) & TexteBR & _
             Chr(10) & TexteDépenses & Chr(10) & TexteMtt

If MsgBox("Ajouter une nouvelle Ligne ? " & Chr(10) & TextePopUp, vbYesNo, _
    " Demande de confirmation d'ajout ") = vbYes Then
 
  Set f = Sheets("COMPTES")
  LastLigne = Sheets("COMPTES").Range("a65536").End(xlUp).Row + 1

f.Cells(LastLigne, 1) = Me.CODE
f.Cells(LastLigne, 2) = CDate(Me.DATESAISIE)
f.Cells(LastLigne, 4) = Me.MOIS
f.Cells(LastLigne, 5) = Me.BUDGETREEL
f.Cells(LastLigne, 6) = Me.COMPTE
f.Cells(LastLigne, 7) = Me.POSTE
f.Cells(LastLigne, 10) = Me.NUMERO
f.Cells(LastLigne, 11) = Me.LIBELLE
f.Cells(LastLigne, 12) = Me.MODERGT
f.Cells(LastLigne, 15) = Me.BQ
If DEBIT <> "" Then
f.Cells(LastLigne, 16) = CCur(Me.DEBIT)
End If
If CREDIT <> "" Then
f.Cells(LastLigne, 17) = CCur(Me.CREDIT)
 End If
End If


' Rétablissement du mode de recalcul d'origine
Application.Calculation = xlAutomatic


'Défige l'écran aprés l'éxécution de la macro
 Application.ScreenUpdating = True
 
 Unload Me

End Sub

LE textbox CODE , ne viens plus en format "GENERAL"
ce qui me pose des soucis car au chargement de l'usf je fais :

Code:
'Nb + 1 pour CODE
Dim myRange As Range
    Set myRange = Worksheets("COMPTES").Range("A2:A65000")
    MAXIMUM = Application.WorksheetFunction.Max(myRange)
     
CODE = MAXIMUM + 1

et là du coup le Textbx CODE, ne s’incrémente plus..... il reste sur la valeur la plus haute présente en colonne A
ce qui me créer des doublons.... et fausse toutes mes autres macros qui sont en cascade derriére cela.

Comment corrigé cela ? Formater CODE à l'implantation des données ?

Merci
Bonne AM
Seb
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 520
dernier inscrit
Azise