Conversion texte en nombre

Bonjour à tous.

J'ai trouvé un un fichier bien pratique sur un forum.

Ce fichier permet de rechercher les différentes combinaisons possibles de sommes de différents nombres d'une liste donnée pour atteindre une valeur cible. Bref, pas facile à expliquer, mais lorsque vous aurez ouvert le fichier, vous aurez rapidement compris l'intérêt pour certaines applications, notamment en comptabilité...

Je souhaite rendre l'outil aussi simple d'utilisation que possible. J'ai ajouté un onglet (importation) à ce fichier.

Ce fichier est destiné à permettre à l'utilisateur de retraiter des données provenant de différentes sources qui peuvent donc se présenter sous différents formats, en particulier, lorsqu'on importe des fichiers provenant de PDF ou de fichiers texte...

C'est là que débute mon problème réel.

J'ai testé toutes sortes de solutions pour convertir les textes en nombres. J'ai appliqué des formules pour remplacer les points par des virgules, j'ai modifié le format des cellules, ou j'ai appliqué la technique consistant à multiplier les cellules par 1. Tant qu'on effectue l'opération manuellement, pas de problème. Les cellules passent du format texte au format nombre.

Mais dès que j'exécute la macro... patatras !!!

J'ai toujours mes petits triangles verts dans l'angle supérieur gauche des cellules et la notification me proposant de convertir les cellules en nombres...

Mais bon sang de bonsoir! N'y a-t-il donc pas un moyen de faire cela en automatique???

Merci à tous pour votre aide!

Je place mon fichier magique en PJ.

Bonjour,

Essaie ceci :

Sub Convertir()
    Dim c As Range
    For Each c In Selection
        If c Like "#*" Or c Like "*#.#*" Then c = Val(c)
    Next c
End Sub

S'applique à la sélection, pour faciliter test. A adapter...

Cordialement.

Bonjour le fil, bonjour le forum,

Ha merci Môssieu MFerrand ! J'ai l'air de quoi moi maintenant avec mon code tout pourri, Hein !...

Bon, il est clair que, passer après un Balèze c'est toujours difficile. Tant pis, voici quand même ma proposition :

Sub Macro1()
Dim OI As Worksheet 'déclare la variable OI (Onglet Importation)
Dim OS As Worksheet 'déclare la variable OS (onglet Somme)
Dim T1 As Variant 'déclare la variable T1 (Tableau 1)
Dim T2() As Varian 'déclare la variable T2 (Tableau 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)

Set OI = Sheets("importation") 'définit l'onglet OI
Set OS = Sheets("Somme") 'définit l'onglet OS
T1 = OI.Range("A1").CurrentRegion 'définit le tableau T1
For I = 2 To UBound(T1, 1) 'boucles sur toutes les lignes I du tableau T1 (en partant de la seconde)
    T1(I, 1) = Replace(T1(I, 1), ".", ",") 'remplace le point par la virgule
    T1(I, 1) = Trim(T1(I, 1)) 'supprime des éventuels espaces avant et après
    T1(I, 1) = CDbl(T1(I, 1) * 1) 'multiplie par 1
    If T1(I, 1) <> 0 Then 'condition : si différent de zéro
        ReDim Preserve T2(J) 'redimensionne le tableau T2
        T2(J) = T1(I, 1) 'récupere dans T2 la valeur de T1
        J = J + 1 'incrément J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
OI.Range("A2:A" & OI.Range("A" & Application.Rows.Count).End(xlUp).Row).Delete 'efface les anciennes valeurs de la colonne A
OI.Range("A2").Resize(UBound(T2, 1) + 1, 1).Value = Application.Transpose(T2) 'renvoie dans A2 redimensionnée le tableau T2 transposé
OI.Columns(1).NumberFormat = "0.00" 'formate la colonne A
OI.Range("A:A").Sort Key1:=I.Range("A1"), order1:=xlAscending, Header:=xlYes 'tri ascendant de la colonne A
OI.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlYes 'supprime les doublons (?)
OI.Range("A2:A" & OI.Range("A" & Application.Rows.Count).End(xlUp).Row).Copy OS.Range("E2") 'copie les valeurs dans la cellule E2
OS.Select 'sélectionne l'onglet OS
OS.Range("E2").Select 'sélectionne la celluel E2 de l'ongelt OS
End Sub

Salut ThauThème ! Pas de défaitisme.

Mon code ne résoud pas tous les cas je pense, mais utilise la particularité de Val, qui ne reconnaît que le point comme séparateur décimal, ce qui s'avère utile pour convertir dans certains cas, mais on ne peut tester avec IsNumeric qui renvoie FAUX s'il y a un point...

Bonne journée.

Salut MFerrand,

et un gros merci pour ta proposition. J'ai intégré la chose dans mon script, mais bizarrement, ta formule m'arrondit toutes les valeurs.

Y a-t-il moyen d'éviter cela?

J'ai également ajouté ceci pour que les valeurs négatives soient prise en compte, mais j'imagine qu'il y avait un moyen plus court de le faire...?

Dim c As Range
For Each c In Selection
If c Like "#*" Or c Like "*#.#*" Or c Like "-#*" Or c Like "*-#.#*" Then c = Val(c)
Next c

Bonjour,

Normalement, les valeurs négatives ne devraient pas se comporter différemment, et c'était bien le cas dans ton premier échantillon.

Le modèle de comparaison : "*#..." peut éventuellement poser problème selon ce qui débute la chaîne.

Arrondi : je pense que tu veux dire que les décimales sont tronquées. C'est que le séparateur n'est alors pas un point.

Un échantillon d'éléments récalcitrants est nécessaire pour étudier les cas.

Cordialement.

Rechercher des sujets similaires à "conversion texte nombre"