XL 2010 Erreur en VBA > Cdbl

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Bon je ne peux pas mettre le fichier car déjà c'est une inter action entre 2 gros fichiers dont l'un fait appel à une centaine de fiches pour les récapituler un par un dans des onglets
En fait ce doit être une erreur de mauvaise utilisation de l'instruction Cdbl
Dans mon USF selon le code du jeu entré , le libellé trouvé va s'afficher dans une box et selon le prix affecté le total des achats va s'incrémenter sauf si ce cas est rencontré :
Sur l'image l'erreur est sur TOTAL à cause de PRIX et cela ne se produit que si la valeur trouvée dans la liste est < à 1 ??
VB:
TextBox6.Value = Application.WorksheetFunction.VLookup(CDbl(CodeJ), Sheets("TOUTES LES LISTES").Range("B4:D2005"), 2, 0) ' Recherche du Code et affecte le libellé

Prix = Format(Application.WorksheetFunction.VLookup(CDbl(CodeJ), Sheets("TOUTES LES LISTES").Range("B4:D2005"), 3, 0), "#,##0.00")
ici Codej et "119" mais prix =""  ??? dans la fiche c'est 0.5
If TextBox6 = "Jeu Inexistant" Or JDV = 1 Then CodeJ = "": Exit Sub
Total = Total + CDbl(Prix)
Tfac = Format(Total, "#,##0.00")
Une raison ? en plus même en faisant ARRET suite à l'erreur Excel PLANTE !!!!!!!
Merci
 

Pièces jointes

  • err_total.jpg
    err_total.jpg
    38.9 KB · Affichages: 16
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir Sylvanu
En continuant à chercher ( en Pas à PAs) je viens de voir que c'est dans cette partie que ça ne va pas
Prix est une TextBox
VB:
Private Sub Prix_Change()
If Val(Prix) = 0 Then Prix = ""
other.SetFocus
End Sub
Et là je pige plus , si 3.00 5.5 .... etc OK Mais si 0.5 0.6 etc : Val(Prix) = 0 donc ensuite Prix="" ???
 

laurent950

XLDnaute Barbatruc
Bonsoir @herve62

Il semble que le problème réside dans la façon dont vous gérez la valeur de la TextBox Prix lorsque la valeur est inférieure à 1, comme 0.5 ou 0.6.

La fonction Val() dans VBA interprète une chaîne de caractères en un nombre, mais elle a des limitations. Pour des valeurs comme 0.5 ou 0.6, il est possible que Val() ne les interprète pas correctement.

Pour des décimales, vous pouvez utiliser CDbl() (convertir en double) pour vous assurer que la valeur est correctement évaluée, mais cela ne semble pas être le cas de votre code ?

C'est certainement pas la solution : CDbl(Prix)

S'il y a besoin de récupérer la valeur 0.5 ou 0.6 dans une chaine de caractères alors code ci-dessous.

VB:
Sub PrixChange()
    Dim Prix As String
    Prix = "Test chaine Numérique 0.5 suite du test"

    ' Utilisation d'une expression régulière pour extraire le nombre
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")

    With regex
        .Global = True
        .Pattern = "\d+(\.\d+)?"
        If .Test(Prix) Then
            Prix = .Execute(Prix)(0)
        Else
            Prix = ""
        End If
    End With

    MsgBox Prix ' Devrait afficher "0.5" si la valeur numérique est extraite avec succès
End Sub
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Oui c'est ça ! mais comme depuis 2 ans que j'ai créé cette appli pour une amie et sa journée annuelle de ventes de jouets cela ne s'est jamais produit ..... euh ? tout allait très bien
C'est comme ça que tout arrive le cas X ... et Dieu sait , si avec toutes mes programmations de test électroniques au boulot combien j'en ai eu !!!!
Là c'est dans 2 sem !!
On verra demain là j'ai FOOT
Bonne soirée , merci
 

laurent950

XLDnaute Barbatruc
Oui c'est ça ! mais comme depuis 2 ans que j'ai créé cette appli pour une amie et sa journée annuelle de ventes de jouets cela ne s'est jamais produit ..... euh ? tout allait très bien
Il n'y a peux être pas besoin de créer l'expression régulière si c'est un cas très rare, et gérer si il y a la rencontre de ce cas spécifique !

ce bout de code est récent ?
Private Sub Prix_Change()
If Val(Prix) = 0 Then Prix = ""
other.SetFocus
End Sub

other.SetFocus cela sert a quoi, dans votre code ?
 

laurent950

XLDnaute Barbatruc
Bonsoir @herve62

Bonsoir Laurent
Je ne pige pas bien ? cela me paraît complexe pour si peu ! fort habitué des USF même utilisé pour des maths j'ai jamais eu ce style de bug ? en plus ça plante à chaque fois Excel ?????

Avec un test complet

A ) La chaine de caractères ne contient pas de valeur numérique.' renvoie Rien [Regex]
B ) La chaine de caractères contient une valeur numérique = Val(Chaine) ' renvoie 0 [Regex]
C ) La chaine de caractères contient une valeur numérique = Val(Chaine) ' renvoie <> 0 [Val]

Code:
Dim Chaine As String
Chaine = " 21e siècle"
MsgBox Val(Chaine) ' renvoie 21

Chaine = " siècle 21"
MsgBox Val(Chaine) ' renvoie 0

Chaine = "123,456"
MsgBox Val(Chaine) ' renvoie 123

Chaine = "123.456"
MsgBox Val(Chaine) ' renvoie 123.456

Le code : ci-dessous

VB:
Sub PrixChange()
    Dim TabChaineCar As Variant
    Dim Prix As String
    TabChaineCar = Array("Test chaine Numérique [Vide Pas de valeurs Numérique] suite du test", " 21e siècle", " siècle 21", "123,456" _
    & "123.456", "Test chaine Numérique 0.188 suite du test", "Test chaine Numérique 0.2 suite du test" _
    & "Test chaine Numérique 1 suite du test", "Test chaine Numérique 2 suite du test", "Test chaine Numérique 2.55 suite du test" _
    & "Test chaine Numérique 7.6667 suite du test")
   
    ' Utilisation d'une expression régulière pour extraire le nombre
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    For i = LBound(TabChaineCar) To UBound(TabChaineCar)
    ' Vérification si la chaîne ne contient pas de valeur numérique
        regex.Global = True
        regex.IgnoreCase = True
        regex.Pattern = "\d" ' Recherche des chiffres
        If Not regex.Test(TabChaineCar(i)) Then
                MsgBox "Test regex.Test(TabChaineCar(i)) =   [ " & " Il n'y a aucune valeur numérique dans la chaîne ]" & vbCrLf _
                        & vbCrLf & TabChaineCar(i)
        ElseIf Val(TabChaineCar(i)) = 0 Then
                With regex
                    .Global = True
                    .Pattern = "\d+(\.\d+)?"
                    Prix = .Execute(TabChaineCar(i))(0)
                End With
                    MsgBox "Test Val(TabChaineCar(i)) =   [ " & Val(TabChaineCar(i)) & " ]"
                    MsgBox "Devrait afficher : [ " & Prix & " ]   dans   " & TabChaineCar(i) & " soit : extrait avec succès"
        ElseIf Val(TabChaineCar(i)) >= 1 Then
                Prix = Val(TabChaineCar(i))
                MsgBox "Test Val(TabChaineCar(i)) =   [ " & Val(TabChaineCar(i)) & " ]"
                MsgBox "Devrait afficher : [ " & Prix & " ]   dans   " & TabChaineCar(i) & " soit : extrait avec succès"
        End If
    Next i
End Sub
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Bon voilà , j'ai trouvé le pourquoi et résolu , simple , mais tout vient du manque de savoir que VAL ne prend que la décimale et que si < 1 c'est par défaut pour vba (en maths défaut ou excès ) donc 0,5 donne 0 ( par excès aurait donné 1 et on aurait juste eu une erreur de 0,5€)
Et comme je dis que IF val(prix)= 0 alors prix="" quand on revient dans la sub avec total ou je fais CDbl( prix) ..... ben Cdbl("") ...ça le fait pas trop !!!!
J'ai tout bêtement remis : IF Prix ="" Then Msgbox "Prix non renseigné" ( au cas ou la recherche trouve case vide et plus haut je quitte la sub) comme ça je garde dans la Sub CodeJ , CDBl(prix) donc 0,5 en nombre et OK !!!
Merci Laurent pour ce que tu as fait ( PS : other.setfocus est un bouton dans l'USF)
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 137
Membres
112 668
dernier inscrit
foyoman