Problème conversion standard par VBA

Bonjour à tous,

J'ai un code VBA Excel qui me pose problème. Il me sert à convertir les données en format Standard de fichiers Excel issus d'extractions d'un logiciel.

Habituellement, lorsque je sélectionne une plage et que je fais Données < Convertir < Terminer, les données sont traduites en format Standard. Celles, chiffrées, sont inchangées et me permettent ainsi d'effectuer des calculs (même avec des cellules vides, colonne "SOLDE" dans le fichier joint). L'inconvénient, c'est que je dois faire ça colonne par colonne quand j'en ai souvent un grand nombre à effectuer. Parmi le lot, certaines sont vides, c'est pourquoi je les traduits au format Standard pour pouvoir effectuer des calculs.

J'ai recréé un code VBA, qui correspond "presque" à mes attentes, car il me permets de faire ça pour plusieurs colonnes à la fois.

Les soucis que j'ai :

1) c'est que lorsque je lance la macro, dont le code a été inspiré d'un enregistrement de Macro lors d'une conversion en Standard, elle me convertit les virgules des données chiffrées par des points. Or, je ne peux plus faire de calcul à cause de cela et les points à la place des virgules me dérangent. J'ai revérifié mes paramètres régionaux Windows (Panneau de configuration\Horloge et région\Modifier les formats de date, d'heure et de nombre\Paramètres supplémentaires), et il considère bien les "," comme le séparateur de décimale à afficher. Idem sur Excel (Options\Options avancées\Options d'édition, tout est configuré en Français et que je coche ou décoche "Utiliser les séparateurs système" avec comme séparateur de décimale "," rien n'y fait. Je veux à tout prix éviter les fonctions de type 'Replace' ou 'Substitute' car certaines cellules possédant du texte ont des points qui ont leur importance ;

2) Lorsque dans ma sélection, il y a une colonne ou les cellules sont 'vide' (mais bien à convertir !) ou que ma première cellule sélectionnée sur ma plage est 'vide' (cellule non grisée), ma macro plante et m'affiche "Erreur d'exécution '1004': La méthode TextToColumns de la classe Range a échoué.

Ce code a pour vocation d'être exécuté via mon Personal.xlsb via un raccourci clavier, mais le voici sur un fichier dans ThisWorkbook et ici :

Sub Format_Convertir_standard()

    Dim colonneDeb As Integer
    Dim colonneFin As Integer
    Dim colonneVariable As Integer
    Dim ligneDeb As Integer
    Dim ligneFin As Integer

    If Not Selection.Cells(1, 1) Is Nothing Then
        colonneDeb = Selection.Cells(1, 1).Column
        ligneDeb = Selection.Cells(1, 1).Row

        If Selection.Rows.Count = Rows.Count Then
            ligneFin = Cells(Rows.Count, colonneDeb).End(xlUp).Row
        Else
            ligneFin = ligneDeb + Selection.Rows.Count - 1
        End If

        If Selection.Columns.Count = Columns.Count Then
            colonneFin = Cells(ligneDeb, Columns.Count).End(xlToLeft).Column
        Else
            colonneFin = colonneDeb + Selection.Columns.Count - 1
        End If

        Application.ScreenUpdating = False

            'Si la plage de cellule contient seulement UNE colonne, Excel le gère parfaitement
            If colonneDeb = colonneFin Then
                Dim targetRange As Range
                Set targetRange = Range(Cells(ligneDeb, colonneDeb), Cells(ligneFin, colonneFin))
                targetRange.TextToColumns Destination:=targetRange, _
                    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
                    ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
                    Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
                    TrailingMinusNumbers:=True

            Else 'sinon il faut contourner le problème en faisant une boucle pour convertir colonne par colonne
                If colonneDeb < colonneFin Then
                    colonneVariable = colonneDeb
                    For colonneVariable = colonneDeb To colonneFin
                        Set targetRange = Range(Cells(ligneDeb, colonneVariable), Cells(ligneFin, colonneVariable))
                        targetRange.TextToColumns Destination:=targetRange, _
                            DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
                            ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
                            Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
                            TrailingMinusNumbers:=True
                Next colonneVariable
                End If
            End If

            Application.ScreenUpdating = True

    Else: MsgBox "Sélectionnez une cellule ou une plage de cellules.", vbExclamation, "Sélection invalide"

    End If
9macroforum.xlsm (14.07 Ko)
End Sub

Je me passionne pour le code depuis peu (code de débutant donc !), mais après près de 3 jours passés à tenter de trouver un moyen, je sèche !

Alors si quelqu'un avait une solution ne serait-ce qu'à l'un de ces deux soucis, je lui en serai très reconnaissant !

Je vous remercie par avance pour vos réponses et suggestions

MaxP2803

Hello,

Pour moi Convertir sert à dissocier une colonne en plusieurs et appliquer un format a ces colonnes.

D'apres ton fichier, tes colonnes sont déjà dissociées donc texttocolumn n'est pas la bonne méthode.

Je pense que c'est plutot cette méthode à utiliser :

Selection.NumberFormat = "General"

Bonjour le fil, salut Rag02700

Presque d'accord avec toi, sauf qu'il Il faut juste effectuer une petite manipulation pour que les chiffres puissent être correctement additionné

Sub RemplacerVide()
  Dim Col As Long, ColonneFin As Long, LigneFin As Long
  ' Avec la feuille active
  With ActiveSheet
    ' Dernière ligne de la 1ère colonne
    LigneFin = .Cells(Rows.Count, 1).End(xlUp).Row
    ' Dernière colonne remplie
    ColonneFin = .Cells(1, Columns.Count).End(xlToLeft).Column
    ' Avec la plage colonne 3 à colonne Fin - 1
    With .Range(.Cells(2, 3), .Cells(LigneFin, ColonneFin - 1))
      ' Remplace les cellules vide par zéro
      .Replace What:="", Replacement:="0"
    End With
  End With
End Sub

A+

Bonsoir,

Normalement tu dois pouvoir déterminer le type de données par colonne et aussi le séparateur décimal des colonnes numériques, voici un exemple VBA :

    Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 2), Array(2, 2), Array(3, 1)), DecimalSeparator:=".", _
        TrailingMinusNumbers:=True

La section intéressante est la ligne Array qui détermine le type de données, 1=Texte et 2=Standard et surtout DecimalSeparator:="."

Normalement tu ne devrais pas avoir de transformation complémentaire pour les nombres.

Refais l'opération manuellement, tu verras le bouton Avancé sur le troisième step.

Benead

Bonjour à tous,

Merci beaucoup pour vos réponses !

Le Replace "vide" par "0" me permet d'éviter le blocage de la macro lorsque les cellules sont vides lorsqu'exécuter avant conversion des données.

L'argument DecimalSeparator:="." m'a, quant à lui, permis de convertir mes données chiffrées par des virgules (et non par des points !), ce qui me permets (même sans le Replace) de faire du calcul.

Bien que ce ne soit pas le plus idéal qu'il soit, je suis obligé de passer par la conversion car ".NumberFormat = "General" n'a pas l'air de convertir.

Mon problème est résolu !!! Ce code va pouvoir enfin changer mon quotidien !

Encore merci !

Rechercher des sujets similaires à "probleme conversion standard vba"