Microsoft 365 Cdbl et nombres à virgules

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

youguybass

XLDnaute Junior
Bonjour à tous
par ce code je cherche à comparer "Txt257" et ".Cells(Lag, C)" afin de me renvoyer une info s'ils sont différents.

La comparaison marche si les chiffres sont entiers, par contre a partir du moment ou ce sont des nombres à virgules ,
si ces nombres sont identiques, cela me renvoi le message comme quoi ils sont différents alors que ça ne devrait pas être le cas.
J'ai essayé avec Val( Txt ... cela n'y fait rien
Est que quelqu'un aurait une solution ?
D'avance merci

VB:
With Feuil16
For K = .[a65000].End(3).Row To 6 Step -1

For Col = 26 To 314 Step 12
If .Cells(K, Col) = Txt1 Then
 
        'tx31 = 0
        
           tx31 = tx31 + CDbl(Feuil16.Cells(K, Col + 7))
          
                    TextBox257 = tx31
            
        End If
Next
Next

End With
MsgBox (CDbl(.Cells(Lag, C)))
MsgBox (CDbl(TextBox257))

If CDbl(TextBox257) <> CDbl(.Cells(Lag, C)) Then
MsgBox ("Attention Le calcul des prix d'achat a été modifier depuis le dernière enregistrement" & vbCrLf & "Veuillez enregistrer a nouveau ce dossier")
End If
 
Bonjour youguybass,
TextBox257 contient un texte. Peut être que le séparateur décimal utilisé dans TextBox n'est il pas le séparateur décimal utilisé par le VBA ?
( par exemple "," au lieu de "." )
J'ai dû faire une manip sur le change du tbx 257
VB:
Private Sub TextBox257_Change() 'Tolal Achat ---------------------Ok
D = 257
Me.Controls("TextBox" & D).Value = Format(Me.Controls("TextBox" & D), "###0.00€")
Me.Controls("TextBox" & D).Value = Replace(Me.Controls("TextBox" & D).Value, ",", ".", 1, 1)
End Sub

et jouer avec val et cdbl dans la macro !
Code:
With Feuil16
For K = .[a65000].End(3).Row To 6 Step -1

For Col = 26 To 314 Step 12
If .Cells(K, Col) = Txt1 Then
 
        'tx31 = 0
           tx31 = tx31 + CDbl(Feuil16.Cells(K, Col + 7))
                    TextBox257 = CDbl(tx31)
         End If
Next
Next
End With

If Val(TextBox257) <> CDbl(.Cells(Lag, C)) Then
MsgBox ("Attention le total des prix d'achat a été modifié depuis le dernière enregistrement" & vbCrLf & "Veuillez enregistrer a nouveau ce dossier")
End If

et cela fonctionne

Merci sylvanu
 
Bonjour à tous,
@youguybass Il faut apprendre à être plus explicite. VBA est tolérant mais il y a des limites quand même.

Apprenez, et faites en sorte de déclarer toute vos variables. Pour vous y obliger inscrivez en tête de module l'Option Explicit. Ou mieux encore aller dans Menu/Options/2diteur et cocher la case Déclaration des variables obligatoires.

Pour en revenir à vôtre problème il faut savoir que la fonction Cdbl() se base sur les options régionales du PC, donc nous sommes en France et le séparateur est donc la virgule.
Le fait de passer le format en 'Monétaire' n'est pas obligatoire ici.
Vous devriez aussi découper votre code en fonctions qui n'ont qu'une tâche à effectuer, votre code n'en sera que plus lisible et compréhensif.
Si vous donnez aussi des noms explicites à vos contrôle cela vous évitera de devoir mettre une quantité de commentaires inutiles.
Par exemple TextBox257 devrait être TotalAchats.

Bon concernant la conversion voici une petite fonction (Je n'ai pas testé tous les cas...)
Vous pouvez choisir le retour qui vous va bien :
  • Double ou Currency (Pour l'utilisation de calculs)
  • String (Pour une utilisation simple en texte)
  • CurrencyString (Pour un formatage au format monétaire)
Dans un module coller l'énumération et la fonction
VB:
Option Explicit

Public Enum eReturnFormat
    fmtDouble = 5
    fmtCurrency = 6
    fmtString = 8
    fmtCurrencyString = 99
End Enum


'@Description "Adapte le séparateur pour une conversion en double"
Public Function AdaptSeparator(ByVal value As Variant, Optional ByVal ReturnType As eReturnFormat = fmtDouble) As Variant

    ' //  Conversion de la valeur d'entrée en String et suppression des espaces
    Dim sValue As String
    sValue = Replace(CStr(value), " ", "")

    ' //  Détermination du séparateur décimal du système
    On Error Resume Next
    Dim sDecimalSeparator As String
    ' // Valable que sous Excel...
    sDecimalSeparator = Application.International(xlDecimalSeparator)
    On Error GoTo 0

    ' //  Normalisation du séparateur décimal et retrait des séparateurs de milliers
    If sDecimalSeparator = "," Then
        sValue = Replace(sValue, ".", "")
    Else
        sValue = Replace(sValue, ",", "")
        If InStr(sValue, ".") = 0 And InStr(sValue, ",") > 0 Then
            sValue = Replace(sValue, ",", ".")
        End If
    End If

    ' //  Conversion et retour du résultat
    Select Case ReturnType
        Case vbString
            Dim vResult As Variant
            vResult = sValue

        Case vbDouble
            If IsNumeric(sValue) Then
                vResult = CDbl(sValue)
            Else
                vResult = Empty
            End If

        Case vbCurrency
            If IsNumeric(sValue) Then
                vResult = CCur(sValue)
            Else
                vResult = Empty
            End If

        Case fmtCurrencyString
            If IsNumeric(sValue) Then
                vResult = Format(CCur(sValue), "Currency")
            Else
                vResult = Empty
            End If

        Case Else
            vResult = sValue
    End Select
    AdaptSeparator = vResult
End Function

Ensuite vous pouvez appeler votre fonction pour définir le format de votre TextBox
Code:
'Private Sub TextBox257_Change() ' // Changer le nom des contrôles...
Private Sub TotalAchats_Change()
    With TotalAchats
        .value = AdaptSeparator(value:=.value, _
                                ReturnType:=fmtCurrencyString)
    End With
End Sub

Null besoin de passer par la collection de contrôles pour changer sa valeur, Utiliser la collection de contrôles quand vous êtes dans un module standard, mais pas dans le module du formulaire.

1762514073876.png
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
191
Réponses
5
Affichages
725
Réponses
5
Affichages
496
Réponses
4
Affichages
589
Réponses
8
Affichages
281
Réponses
2
Affichages
436
Réponses
8
Affichages
658
Retour