[VBA] Eternel problème de format

Bonjour !

Je pensais être débarrassé des problèmes de format dans mes documents Excel ; tout semblait fonctionner dans mes tests, mais là je me retrouve à nouveau confronté à une erreur de format qui transforme une valeur extrêmement petite (0,000005261) en valeur extrêmement grande (526 134 127,21).

La conversion se fait via ce code, proposé par ric ; qui fait très bien l'affaire :

Set ws = Worksheets("CSV")
Set ws2 = Worksheets("VNEI (EI)")

    With ws2
        lrws2 = .Cells(Rows.Count, 2).End(xlUp).Row
        Dim cL As Range

        For Each cL In .Range(Cells(2, 4), Cells(lrws2, 4))
            cL = Replace(cL, ".", ",")      ' remplacer le . par la ,
            cL = cL / 10                    ' diviser la donnée par 10
            cL.NumberFormat = "#,##0.00"    ' mettre le format
            cL = cL * 10                    ' multiplier par 10 pour rétablir le data
        Next cL

Le problème vient peut-être de l'import des données. Elles sont récupérées depuis une source de données CSV ; pour être utilisées dans mon document Excel. Si je procède à un simple "copier-coller" des données de la feuilles CSV vers mon document Excel, alors je n'ai pas ce problème ! Savez-vous où se créée cette erreur?

Le code, au cas où :

Private Sub cmdAlimLesCasesFeuille_Click()

Dim r As Long, c As Long, a As Long, b As Long, f As Long, lrws As Long
Dim ws As Worksheet
Set ws = Worksheets("CSV")

 r = ws.Cells(Rows.Count, 34).End(xlUp).Row 
 c = Cells(1, Cells.Columns.Count).End(xlToLeft).Column 
 Range(Cells(1, 1), Cells(r, c)).ClearContents

    Dim mypath As String
    Dim myfile As String

        Application.FileDialog(msoFileDialogFilePicker).Show
        myfile = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)

    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & myfile, _
        Destination:=Range("$A$1"))
        .TextFileCommaDelimiter = True
        .TextFilePlatform = 65001
        .TextFileDecimalSeparator = ","
        .Refresh
    End With
UserForm2.Hide

Dim e As Range
    For Each e In Range(Cells(2, 36), Cells(r, 36))
    If e.HasFormula Then e.Value = Replace(e.Formula, "=", "'")
Next e

'lrws = ws.Cells(Rows.Count, 1).End(xlUp).Row
'ws.Range(Cells(2, 45), Cells(lrws, 45)).TextToColumns Destination:=ws.Range(Cells(2, 45), Cells(lrws, 45)), DataType:=xlDelimited
Unload UserForm2

End Sub

J'ai la solution, qui serait de supprimer les lignes où les valeurs extrêmement petites (car issues de traitements automatisés sur un logiciel de cartographie) ; mais j'aimerais bien savoir si vous sauriez d'où peut bien provenir ce problème (et éviter qu'il réapparaisse sous d'autres formes) !

Je joins un petit fichier Excel qui illustre bien se qui se passe.

Merci de votre attention

Bon après midi !

Bonjour,

En effet un copié collé fonctionne et pas le code d'import.

En utilisant la multiplication par 1 lors de l'import excel va peut-être comprendre que c'est des chiffres.

Bonjour,

Avec ça, de mon côté ça fonctionne:

Public Sub sumdel2()

Set ws = Worksheets("CSV")
Set ws2 = Worksheets("VNEI (EI)")

'Classer les données (A-Z) dans la colonne B
    lrws2 = ws2.Cells(Rows.Count, 2).End(xlUp).Row
    With ws2
        Range(Cells(1, 1), Cells(lrws2, 10)).Sort _
            Key1:=Range("B1"), Order1:=xlAscending, _
            Header:=xlYes, Orientation:=xlTopToBottom
    End With

    With ws2
        lrws2 = .Cells(Rows.Count, 2).End(xlUp).Row
        Dim cL As Range

        For Each cL In .Range(Cells(2, 4), Cells(lrws2, 4))
            cL = CDbl(cL)
'            cL = Replace(cL, ".", ",")      ' remplacer le . par la ,
'            cL = cL / 10                    ' déviser la donnée par 10
            cL.NumberFormat = "#,##0.00"    ' mettre le format
'            cL = cL * 10                    ' multiplier par 10 pour rétablir le data
        Next cL

    'Aditionner les surfaces par habitats
        For lRow = lrws2 To 2 Step -1
            If .Cells(lRow, 2) = .Cells(lRow - 1, 2) Then
                .Cells(lRow - 1, 4) = CDbl(.Cells(lRow, 4)) + CDbl(.Cells(lRow - 1, 4))
                .Rows(lRow).Delete Shift:=xlUp
            End If
        Next
    End With
End Sub

Bonsoir,

Merci pour votre proposition.

De mon côté j'ai une "incompatibilité de type".

Je vais chercher d'où ça peut bien venir.

En utilisant la multiplication par 1 lors de l'import excel va peut-être comprendre que c'est des chiffres.

Les virgules sont remplacées par des "." ; il ne peut pas y avoir de multiplication avant de changer cette virgule. Mais c'est justement le changement de "." en "," qui fait tout foirer. J'ai lu une fois qu'Excel considère parfois les "." comme des espaces entre milliers ; peut-être que ça provient de là.

Bonjour,

je te retourne à nouveau un essai

Je passe par une variable temporaire le temps de faire les changement de séparateur de milier et de séparateur décimal, puis j'utilise cdbl pour convertir en nombre, ça semble stable de cette façon de mon côté, j'espère que ça le sera aussi pour toi

Bonjour,

J'ai intégré ce code au reste et ça fonctionne !

Le code que vous proposé est affolant ; autant de lignes pour un problème qui paraît anodin !

Merci beaucoup pour votre aide ; cette fois-ci le souci semble résolu une bonne fois pour toute

Bonne journée !

Re,

c'est surtout la partie où je m'occupe du séparateur des miliers qui rallonge le code, mais finalement, pas bien sûr que cette partie serve réellement, je l'avais fait au départ, car tu suggérais que ça pouvait poser problème, je l'ai laissé au cas où

Content que ça fonctionne enfin en tout cas

Bonne journée, merci d'avoir passé le sujet en résolu

Testé avec la base de données mise à jour et même erreur

Pour que vous puissiez voir exactement les opérations qui sont réalisées je joins plutôt deux fichier ; la première feuille demandera d'importer des données et la seconde exécutera le code.

L'erreur se créée lorsqu'il y a un import j'ai l'impression...

Test05 est le document qui traite et la BDD est donc à importer.

Si je finis par faire fonctionner le document je posterai à la suite !

4bdd.zip (3.81 Ko)

Re,

rien de bien méchant, c'est une cellule vide qui pose problème, j'ai rajouté un tout petit truc qui fait que ça marchera quand même:

Ah oui merci !

C'est une erreur qui provenait du logiciel de cartographie mais qui n'est pas nettoyée en amont de l'import (pour le moment).

Encore merci !

Rechercher des sujets similaires à "vba eternel probleme format"