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
End SubJe 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 SubA+
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:=TrueLa 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 !