Format décimal dans ListBox

je suppose que ce n'était pas une valeur "double" que vous avez passé vers la fonction "F_Exotique" mais un string qui ressemble à un chiffre ou quelque chose différent. Maintenant, la fonction n'accèpte que des valeurs double, donc l'erreur se déplacera peut-être vers la ligne ici dessous (oubien le "7), donc à ce moment, c'est quoi le contenu de ".list(N,6)" ?

J'ai aligné le listbox1 "à droite" pour ces 2 colonnes monétaires, mais alors les 5 autres colonnes aussi, si cela ne te plaît pas, mettez-le de nouveau à gauche

.List(N, 6) = f_Exotique(CDbl(.List(N, 6)))

Merci BsAlv pour la persévérance mais l'erreur 13 incompatibilité de type est toujours présente cette fois à la ligne

.List(N, 6) = f_Exotique(CDbl(.List(N, 6)))

Les colonnes 6 et 7 sont prévues pour avoir des nombres de type "2'455.99". J'essayé avec différents formats mais rien à faire, le message est toujours là.

Je dois partir maintenant mais peux reprendre vers minuit. Si vus avez encore une suggestion, je la verré en rentrant. Merci encore.

Re,

Pour le fun et pour montrer que je travaille aussi, ma petite version si j'ai bien compris la question :

  • pas de distinction entre majuscule ou minuscule (chercher "abc" ou "ABC" ou "aBc" donne le même résultat)
  • les accents sont ignorés (chercher é ou è ou ë ainsi que e donne le même résultat)
  • Les nombres doivent être pouvoir saisis avec les séparateurs décimal et milliers utilisés par le système ou sans aucun séparateur : 1'232.45 ou 1235.45

Ce dernier point n'a pas été vérifié. Je ne veux pas changer mes séparateurs sur mon PC. Si Georg pouvait me dire si le dernier point fonctionne sur sa configuration, ce serait très gentil de sa part .

Le code est commenté.

...

NB : J'ai mis un zoom (variable via la constante ValeurZoom=130 en début de code) car j'ai la vue basse . Il suffit de remettre la constante à 100 pour revenir au Zoom initial.

...

Re,

Remis le bon classeur dans le message précédent message.

re, salut Mafraise,

je l'avais dit que l'erreur se déplacera vers ce ".List(N, 6) = f_Exotique(CDbl(.List(N, 6)))", donc cela veut dire que le contenu de ".List(N,6) n'est pas comme prévu, mais je n'ai pas un idée comment vos données sont fait, donc une adaptation dans la fonction qui montrera "string", "erreur" ou "date" quand "valeur" n'est pas numérique, donc si vous voyez un de ces mots, c'était quoi la "valeur" de .list(N,6) ?

nouvelle version avec 2 erreurs dans le tableau "DS_Data"

List(n,6)="" (6 ou 7 je ne sais plus) d'où l'erreur.

Suffit de tester avec isnumeric par exemple.

Bonjour,

BsAlv : merci pour ta nouvelle proposition mais lorsque j'essaie de lancer une recherche dans le TextBox1 je reçois un nouveau message d'erreur

Erreur d'exécution '-2147352571(80020005)' Impossible de définir la propriété List. Le type ne correspond pas.

et la ligne surligné dans le bloc For C de TextBox1_Change est
Me.ListBox1.List(Me.ListBox1.ListCount - 1, C) = Range("TS_Data").Item(i, C + 1)

mafraise: merci pour ta proposition qui répond pleinement à ma requête. Elle effectue la recherche intuitive et conserve également la ponctuation (encore exotique...?) des nombres à tous les étages même dans les occurrences trouvées après une recherche en TextBox1.

Afin de la tester intégralement, je l'ai incorporé dans l'architecture de mon projet principal et elle fonctionne à merveille. Aucun conflit avec les autres procédures (frames <recherche>, <actions> et <navigation>). J'ai apprécié également le chic détail du compteur d'occurrences sur le total d'enregistrements.

Je saisi les nombres sans ponctuation sauf pour les décimales du genre 1245.55, le code fait le reste et place le séparateur des milliers à sa juste place (seul petit bémol : absence de séparateur pour les millions type 3'450'670.85). Mais, je peux parfaitement vivre avec l'absence de cet apostrophe millionnaire. Dans l'état de choses, je te remercie infiniment. Georg.

pouvez-vous me donner votre fichier (ici ou par MP) ?

BsAlv, voici le fichier où j'obtiens l'erreur mentionné.

Bonsoir georg, BsAlv ,

Vous obtenez une erreur parce que vous essayez de mettre dans la ListBox1 une valeur d'erreur quand la 1ère ligne répond au critère. En effet le débit de cette première ligne est égal à #DIV/0!

Ce cas n'a pas été prévu. Il semble bizarroïde d'avoir un débit égal à une erreur puisqu'un débit doit être un décimal (éventuellement nul).

Si vous remplacez le code de Private Sub TextBox1_Change() par le suivant, cela devrait fonctionner .

NB : néanmoins je vous conseille d'attendre l'intervention de BsAlv (que je salue), c'est toujours plus sûr de faire modifier le code d'un auteur par cet auteur lui-même plutôt que par un tiers.

'*** RECHERCHE INTUITIVE *************************
Private Sub TextBox1_Change()
Dim i As Long, C As Integer, N%, Cl As Range, Valeur
   Me.ListBox1.Clear
   For i = 1 To Range("TS_Data").Rows.Count
      Set Cl = Range("TS_Data").Rows(i).Find(Me.TextBox1, lookat:=xlPart)
      If Not Cl Is Nothing Then
         Me.ListBox1.AddItem Range("TS_Data").Cells(i, 1).Value
         For C = 1 To 7
            Valeur = Range("TS_Data").Cells(i, C + 1): If IsError(Valeur) Then Valeur = ""   'ou =0
            Me.ListBox1.List(Me.ListBox1.ListCount - 1, C) = Valeur
         Next
      End If
   Next
   M_ListBox1_Formattage
End Sub

Re georg,

Avez-vous pu testé ma version pour le point concernant la recherche des nombres avec ou sans séparateurs systèmes ?

D'avance merci (mais ce n'est pas du tout une obligation).

mafraise

Avez-vous pu testé ma version pour le point concernant la recherche des nombres avec ou sans séparateurs systèmes ?

Oui, je l'ai testé, avec ou sans séparateurs et cela fonctionne très bien.

Cordialement.

Merci beaucoup georg

Bonne-nuit

bonjour, bien fait par mafraise, mais c'était moi qui avait mis cette valeur erronée pour faire des testes, désolé !

Mafraise a bien résolu mon erreur

Mais, je présente une autre solution, plus/trop(?) difficile qui traite & sauvegarde toutes les bonnes données dans une matrice en mémoire et les passe au Listbox1 au bout. Est-ce mieux que les passer au début et puis traiter les erreurs et les formats ? (les goûts et les couleurs ne se discutent pas)

'*** RECHERCHE INTUITIVE *********************************************************************************
Private Sub TextBox1_Change()
     Dim i As Long, C As Integer, N%, Cl As Range, s As Variant, Arr0, Arr1, j, bVide As Boolean, LR As Long

     Me.ListBox1.Clear                       'RAZ listbox1
     s = ""                                  's commence comme "string"
     For i = 1 To Range("TS_Data").Rows.Count
          bVide = (Len(Me.TextBox1.Value) = 0)
         If Not bVide Then Set Cl = Range("TS_Data").Rows(i).Find(Me.TextBox1.Value, lookat:=xlPart)
          If Not Cl Is Nothing Or bVide Then s = s & " " & i     'mémoriser toutes les LRs correspondantes
     Next
     If Len(s) > 0 Then                      'il y a des LRs qui correspondent !
          '************************************************************************************************
          'on fait toute la préparation du contenu du listbox1 en mémoire et charge le résultat au bout en une fois dans le listbox
          'cepandant, on traite les valeurs vides, erronées et les met, si nécessaire dans le bon format numérique dépendant de la colonne
          '************************************************************************************************
          Arr0 = Range("TS_Data").Value2     'lire contenu du tableau dans une matrice
          s = Split(s)                       'séparer les LRs mémorisées, s est maintenant array
          ReDim Arr1(1 To UBound(s), 1 To UBound(Arr0, 2))     'préparer une matrice pour le résultat avec autant de LRs que nécessaire (nombre de s)
          For i = 1 To UBound(s)             ' s(0) est vide ! Donc à partir du premier au dernier
          LR = s(i) 'Numero du "listrow"
               For j = 1 To UBound(Arr0, 2)  'boucler toutes les colonnes
                    Select Case VarType(Arr0(i, j))     'type de cet élément de Arr0
                         Case vbEmpty, vbNull, vbError     'si vide, null ou erronée = ignorer
                         Case Else           'les autres cas
                              Select Case j  'dépendant de la colonne
                                   Case 1: Arr1(i, j) = Format(Arr0(LR, j), "0000")     '* format iD
                                   Case 6: Arr1(i, j) = Format(Arr0(LR, j), "General Date")     '* format date
                                   Case 7, 8: Arr1(i, j) = f_Exotique(Arr0(LR, j))     'format exotique
                                   Case Else: Arr1(i, j) = Arr0(LR, j)     'le reste, simple copie-colle
                              End Select
                    End Select
               Next
          Next
          Me.ListBox1.List = Arr1            'colle matrice résultat dans le listbox1
     End If
End Sub

Bonjour BsAlv ,

BsAlv à écrit :

mais c'était moi qui avait mis cette valeur erronée pour faire des testes, désolé !

Bravo je suis tombé dans le piège sans n'avoir rien pressenti

Très bonne journée à toi.

la journée commence bien par un sourire.

Bonjour le forum, BsAlv, mafraise

Mais, je présente une autre solution, plus/trop(?) difficile qui traite & sauvegarde toutes les bonnes données dans une matrice en mémoire et les passe au Listbox1 au bout

Merci BsAlv! Dans cette nouvelle solution, quelles modifications devrait on apporter au macro <M_ListBox1_Formatage> et à la fonction <f_Exotique(Valeur)> ?

BsAlv pourrais-tu mettre une nouvelle version du classeur <004c-usf-ri-bslav.xlsm> que je t'ai envoyé hier à 11h49? Cette nouvelle version intègrerait toutes les modifications apportées aux codex. ça permettrait de faire un point de situation. En effet, j'aimerais essayer ton code en grandeur nature. Merci d'avance.

Merci BsAlv, je n'ai pas le temps de regarder maintenant mais je te donnerais des nouvelles un peu plus tard. Bonne soirée.

Rechercher des sujets similaires à "format decimal listbox"