Conversion en valeur numérique VBA

Bonjour,
Voilà mon problème :
* Je récupère un énorme fichier csv dont je dois faire un certain ménage et ne récupérer que certaines données exploitables pour faire des calculs de moyenne par exemple.
* Après nettoyage, je dois gérer des valeurs aberrantes : il doit s'agir de scores entre 0 et 100, et parfois j'obtiens 100100100, ou encore 505050505050 (!) : le fichier csv comporte des erreurs, mais je veux pouvoir les corriger et je sais que c'est faisable
* Info importante, quand je clique sur une cellule contenant 100100100, la barre de formule contient bien le 100 qui m'intéresse

Voilà mes tentatives :
a) Convertir (dans l'onglet Données), qui fonctionne parfaitement, mais que je veux répéter sur toutes les colonnes (trop nombreuses pour être fait à la main) : pour ça, j'effectue la manip sur une colonne tout en enregistrant la macro, je récupère le code de la macro puis je crée ma macro en insérant ce code dans une boucle For ... Next :

Sub E_convert_as_number()
    lastColumn = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    For currentColumn = 3 To lastColumn
        Columns("currentColumn:currentColumn").Select
        Selection.TextToColumns Destination:=Range("_1_000468[[#Headers],[score]]"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
        :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
        Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
    Next
End Sub

Ca ne fonctionne pas : on rentre dans la boucle, on sélectionne la colonne, mais la 2ème instruction créé une erreur de compilation. J'avoue que je ne comprends pas bien l'intérieur de ce code donc j'ai du mal à savoir ce que je dois corriger pour que ça fonctionne... (ça fait 2 jours que j'apprends VBA en autodidacte ^^)

b) Utiliser la fonction Val, beaucoup plus simple :

Sub E_convert_as_number()
    Dim numeric_value

    lastColumn = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

    lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row

    For currentColumn = 2 To lastColumn
        For currentRow = 3 To lastRow
            If Cells(currentRow, currentColumn).Value <> "" Then
                numeric_value = Val(Cells(currentRow, currentColumn).Value)
                Cells(currentRow, currentColumn).Value = numeric_value
            End If
        Next
    Next
End Sub

// Mon if sert à ne pas mettre 0 à la place d'une cellule vide

Ca ne fonctionne pas : les valeurs aberrantes restent aberrantes (100100100 ne prend pas la valeur 100 mais la valeur 100100100)
Ce serait simple si les valeurs aberrantes étaient "logiquement aberrantes", mais ce n'est malheureusement pas le cas... j'ai du 100100, du 100100100, du 5050, du 50505050505050[...], bref quelque chose de complètement ingérable en utilisant de simple tests conditionnels !

Voilà ma conclusion : la tentative a) est la bonne manière de faire, et c'est là que j'ai besoin de la communauté : quelqu'un peut-il m'aider à corriger le code svp ?
À moins qu'une autre solution existe ?

Merci beaucoup, bonne journée tout le monde !

Bonjour et bienvenue sur le forum

Tu devrais joindre ton fichier.

Bye !

Bonjour à tous,

Je pense qu'il y a des retours à la ligne, ce qui expliquerait que :

100
100
100

soit lu comme 100100100, faute de renvoi automatique à la ligne...

Pour votre premier code, il serait mieux de l'avoir ainsi :

Sub E_convert_as_number()
    lastColumn = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    For currentColumn = 3 To lastColumn
        Columns(currentColumn).TextToColumns Destination:=Range("_1_000468[[#Headers],[score]]"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
        :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
        Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
    Next
End Sub

Pour n'obtenir que les premiers chiffres, il faudrait une fonction peut-être :

function FirstNumber(number)
pos = instr(number, vblf)
if pos = 0 then FirstNumber = number else FirstNumber = left(number, pos - 1)
end function

à utiliser ainsi dans le second code :

Sub E_convert_as_number()
    Dim numeric_value

    lastColumn = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

    lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row

    For currentColumn = 2 To lastColumn
        For currentRow = 3 To lastRow
            Cells(currentRow, currentColumn).Value = FirstNumber(Cells(currentRow, currentColumn).Value)
        Next
    Next
End Sub

// Mon if sert à ne pas mettre 0 à la place d'une cellule vide

Cdlt,

Bonjour,

Et si tu ouvrais ton csv avec Power Query ?

Cdlt.

Merci 3GB pour cette solution qui convient parfaitement !

Pour n'obtenir que les premiers chiffres, il faudrait une fonction peut-être :

function FirstNumber(number)

pos = instr(number, vblf)

if pos = 0 then FirstNumber = number else FirstNumber = left(number, pos - 1)

end function

à utiliser ainsi dans le second code :

Sub E_convert_as_number()

Dim numeric_value

lastColumn = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

lastRow = Cells(Cells.Rows.Count, 1).End(xlUp).Row

For currentColumn = 2 To lastColumn

For currentRow = 3 To lastRow

Cells(currentRow, currentColumn).Value = FirstNumber(Cells(currentRow, currentColumn).Value)

Next

Next

End Sub

Bon après-midi à tous et merci de vous être penchés sur le sujet !

Au fait, gmb :

Tu devrais joindre ton fichier.

Je l'aurais fait s'il ne s'agissait pas d'un fichier de travail avec des données confidentielles.

Merci quand même, quand je le pourrai, je suivrai ton conseil.

Bye !

Rechercher des sujets similaires à "conversion valeur numerique vba"