Code VBA - Uniformisation du format

Bonsoir,

Une fois de plus j’ai besoin de votre aide !

J’exporte régulièrement des données dans un fichier comportant plusieurs feuilles, dont l’une d’entre elles ressemble à celle présentée ici.

https://www.excel-pratique.com/~files/doc/aaaa.xls

Dans la colonne A, j’ai des numéros de référence, mais malheureusement dans deux formats différents, l’un doit être du texte. Par exemple les cellules A8 et A10, ne sont pas au même format que les autres.

Comme j’ai besoin par la suite de comparer ces données à d’autres données existantes, je dois les uniformiser en les multipliant par 1.

A cet effet j’ai essayé d’enregistrer automatiquement la « Sub Macro2() » qui multiplie par 1 les données de la colonne A dans une autre colonne, qui remplace les formules par des valeurs et qui échange les anciennes données de la colonne A par ces nouvelles données uniformisées.

Tout ceci ne serait pas si mal, si je n’avais à chaque fois un nombre différent de lignes, d’où la nécessité de créer une boucle, ce que je suis incapable de faire.

Par la suite, ces données uniformisées devraient être triées. Serait-il alors utile d’incérer le code créé ci-dessus à la macro « Sub Tri() » existante.

A plus tard.

bonjour,

tu peux faire comme ça :

Sub Tri()
Dim LigFin As Long, ShtR As Worksheet, Arr()
Sheets("RepListeQuellensteuer").Select
' Définir le nom de l'objet ShtR
Set ShtR = Sheets("RepListeQuellensteuer")
LigFin = ShtR.Range("A" & Rows.Count).End(xlUp).Row
'Mise en forme des données
Arr = Range("A2:A" & LigFin)
Range("A2:A" & LigFin).Clear
Range("A2:A" & LigFin) = Arr
'--------------- Tri
Rows("2:" & LigFin).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub

A+

Salut Galopin,

Merci beaucoup pour ton code, il fonctionne à merveille.

Pourrais-tu juste m’expliquer comment fonctionne ta mise en forme des données

'Mise en forme des données 
Arr = Range("A2:A" & LigFin) 
Range("A2:A" & LigFin).Clear 
Range("A2:A" & LigFin) = Arr

Est-ce que le simple fait d’effacer et de réécrire les données change leur format ?

Bonne journée.

bonsoir,

Clear efface tout y compris les formats.

Donc si tu colles juste des données non formatées, tu as des chances d'avoir un format standart : Sur ce coup j'ai eu un peu de chance !

Mais il me semble quand même difficile de généraliser comme tu le fais...

Cela est uniquement inhérent à la méthode que j'utilise : Je commence par stocker les données dans un tableau virtuel (Array)

En l'absence d'instruction spécifique, VBA ne veut pas entendre parler de nombres stockés comme du texte et opère discrètement une conversion en nombre de toutes tes références.

Ensuite commes tes cellules sont réinitialisées il restitue des valeurs nombres...

Mais dire "que le simple fait d’effacer et de réécrire les données change leur format" : NON ! En effet faire un simple CollageSpécial / Valeur ne marcherait pas, même dans des cellules préformatées en nombre.

C'est donc bien une auto-conversion au niveau de ma variable de stockage qui permet cette facilité.

Nota : Cette manière de stocker des groupes de cellules (dans un Array) est une technique très uilisées par les programmeurs VBA : Ces Arrays véritable tableaux virtuels, complètement dépouillés de toute propriété, ont des caractéristiques de traitement qui multiplie souvent la vitesse d'exécution par 10 parfois même par 100 par rapport à un tableau Excel...

A+

Re-bonjour Galopin,

Merci pour cette explication très détaillée de ton code génial.

Lorsque je disais "effacer simplement les données", je parlais bien entendu de l'action de ta ligne de code et non pas d'une autre manière quelconque d'effacer. Mais je n'avais bien entendu pas saisis que tu avais enregistré ces données "quelque part" avant de les effacer.

Encore un tout grand merci pour tout.

Bonne soirée à tous ceux du Forum.

Rechercher des sujets similaires à "code vba uniformisation format"