Conversion format lettres en format chiffres

J'ai converti un document pdf au format Excel. Tout va bien sauf pour ma colonne de chiffres. Je sais comment la convertir en nombres mais je ne sais pas comment bien écrire son format. Il s'agit d'une liste d'ancienneté. Je n'ai pas besoin d'additionner les lignes. Je veux juste qu'elle se classe correctement. Actuellement, elle se classe par le premier chiffre à gauche... 1J, 10j, 100j, 1A, 10A, 2j, 20j, 200j, 2A, 20A. Voici ce à quoi ressemble ces données de chiffres entremêlés de lettres: 34A‐208.82J ou .05J. Vous me sauveriez la vie! Merci à l'avance!

Bonjour,

Voilà, peut-être que ça aidera j'ai inséré 2 colonnes. Une première provenant d'un fichier excel original monté correctement et une deuxième provenant de la conversion d'un document pdf. La première se classe bien et la deuxième non. Ce que je comprends c'est que dans une première étape il faut convertir en «nombres» la deuxième colonne et dans une deuxième étape il faut décrire correctement à Excel le format des nombres de cette colonne... mais je sais pas comment!

Bonjour,

est ce que c'est toujours sous cette même forme,

c'est à dire que le dernier caractère avant le "-" est A

par exemple 25A-360.23J retour: 25 au niveau du trie

aussi la possibilité que la partie nombre est avant le "J"

par exemple: 28.00J retour: 28.00 au niveau du trie

Bonjour,

Un essai basique :

Sub TriCorrectif()
    Dim Plg As Range, c As Range
    With ActiveSheet
        Set Plg = .Range("B2:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        c = String(11 - Len(c), "#") & c
    Next c
    Plg.Sort key1:=Plg.Cells(1, 1), order1:=xlAscending, Header:=xlNo
    For Each c In Plg
        c = Replace(c, "#", "")
    Next c
End Sub

Cordialement.

Merci! On avance! Oui les chiffres sont toujours sous ce format: 10A‐120.50J, Ta macro a parfaitement classé la colonne du plus petit chiffre au plus grand. Par contre elle n'a pas «transformé» la colonne en «nombre» en tant que tel... ce que j'aurais besoin. Par exemple, j'ai tenté d'inverser l'ordre de classement de son tri... et elle est redevenue classé en lettres comme auparavant. C'est important parce c'est une colonne que je vais plus tard la subdiviser pour en créer plusieurs listes et que les gens qui l'utilisent sont appelés à en effectuer différents tri (Le fichier original contient de multiples autres colonnes lettres)

Si je donnais à Excel la bonne syntaxe de mes nombres, cela le guiderait à effectuer la bonne chose, non?

Ou encore, y-a-t-il moyen d'indiquer à Excel de faire avec la colonne B ce qui existe dans la colonne A? J'ai essayé en effectuant un collage spécial en cochant «multiplication». Ça n'a pas fonctionné!

Valeurs alphanumériques, c'est du texte ! Et ça restera du texte....

C'était pas classé comme tu demandais ?

j'ai tenté d'inverser l'ordre de classement de son tri...

C'est à dire ? Et comment ?

Oui c'était classé à la perfection! Mais si j'inverse le tri ça se défait! L'original est une liste plus vaste dans laquelle on fait différents tri. Je pensais qu'on pouvait convertir ces caratères "lettres" en vrai "nombres" en donnant à excel leur bonne description syntaxique.

La macro utilise un subterfuge : elle aligne tous les éléments au nombre de caractères maximal de l'ensemble, soit 11, en comblant les caractères manquants par des # placés devant. Ce caractère se classant au tri avant tout autre utilisé, on peut opérer un tri ordinaire, puis supprimer les caractères ajoutés.

La macro trie dans l'ordre croissant.

Pour trier dans l'ordre décroissant, il faut mettre le paramètre : order1:=xlAscending à : order1:=xlDescending.

Pour pouvoir faire l'un ou l'autre avec la macro, il faut transformer ce paramètre en variable et placer en début de macro un questionnement de l'utilisateur, ce qui peut être fait rapidement avec une MsgBox à 3 boutons (YesNoCancel) : On lui demande s'il veut un tri croissant, s'il répond Oui, ce sera croissant, Non, ce sera décroissant, et Annuler, pas de tri...

Wow! Merci. Je note tout!

Voilà une version aménagée :

Sub TriCorrectif()
    Dim Plg As Range, c As Range, ord%
    ord = MsgBox("Voulez-vous effectuer un tri croissant [répondre Oui] ou décroissant " _
     & "[répondre Non] ?", vbYesNoCancel + vbQuestion, "TRI")
    Select Case ord
        Case vbYes: ord = xlAscending
        Case vbNo: ord = xlDescending
        Case vbCancel: Exit Sub
    End Select
    With ActiveSheet
        Set Plg = .Range("B2:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        c = String(11 - Len(c), "#") & c
    Next c
    Plg.Sort key1:=Plg.Cells(1, 1), order1:=ord, Header:=xlNo
    For Each c In Plg
        c = Replace(c, "#", "")
    Next c
End Sub

Merci!!! Je regarde cela en revenant du boulot ce soir!

Dommage que tes efforts à ma cause ne soient pas fructueux mais non ce n'est pas opérationnel. Ma liste excel a à droite et gauche de la colonne ici traitée contient plusieurs autres colonnes qui même en les sélectionnant tous demeurent immobiles lors du tri par la macro. En conséquence l'ancienneté n'est plus rattachée à la bonne personne!

J'ai compris que tu utilisais un subterfuge et insérait des caractères supplémentaires afin de bien aligner les chiffres et permettre leur juste classement. Ne pourrait-on pas laisser en place ces caractères?

Je suis étonné que cette colonne alphanumérique ne puisse être converti en nombre. Plusieurs liens Microsoft semblent donner des façons pour le faire?

https://support.office.com/fr-fr/article/Convertir-les-nombres-stock%C3%A9s-en-tant-que-texte-en-nombres-40105f2a-fe79-4477-a171-c5bad0f0a885

Merci +++

Bon !

Si tu ne sais pas te servir d'Excel, il faut commencer par apprendre !

Tu demandes à trier une colonne ! Je fournis une procédure qui trie la colonne demandée.

Tu reviens dire que ça ne va pas parce que d'autres colonnes ne sont pas triées !!!!!!!!!!!!!!!!

Tu te moques de qui !!

On demande ce qu'on veut obtenir ! Et on est mal venu de se plaindre parce qu'on obtient ce qu'on a demandé.

Au demeurant, la procédure qui trie une colonne peut fort bien trier 50 colonnes ou plus, il suffit de redimensionner la plage sur laquelle elle opère pour qu'elle couvre la plage à trier lors de l'exécution du tri, sans affecter son intervention spécifique sur une colonne.

Tu disposes donc d'un outil adaptable à ta configuration, quelle qu'elle soit.

Un texte peut être converti en nombre s'il ne comporte que des chiffres, à l'exclusion de tout autre caractère, excepté le caractère reconnu comme séparateur décimal.

En principe, personne ne l'ignore ! Cela fait partie des bases les plus élémentaires...

J'apprécie l'aide, moins le ton. Je m'excuse de tout mon coeur de mon ignorance et je ne voulais pas t'en affliger une aussi grande souffrance et un tantinet d'impatience. Eh! Oui je ne suis qu'un néophite de passage pour un besoin bien ponctuel. Merci tout de même pour l'aide que tu m'as apporté. Et ne t'en fais pas tu es tout excusé. On n'habite sans doute pas du même côté de l'océan ce qui peut induire une certaine différence de tempérament. Merci encore et passe une belle journée malgré la montée d'émotions négatives que je t'ai très involontairement suscité.

Quiconque intervient ici, faisant état de méconnaissance ne lui permettant pas de régler une question Excel, même mineure, s'en voit naturellement absous ! Bien sûr un minimum est requis : savoir allumer son ordinateur, ouvrir Excel, et ce qu'est un classeur, une feuille, une cellule... sans la discussion n'est à la limite pas possible ! Mais s'il savait il ne serait pas là, du moins pas en tant que demandeur...

Par contre, savoir ce que l'on veut faire et poser la question pour laquelle on veut une réponse, et pas une autre, est une exigence à laquelle chacun peut et doit souscrire, sous peine de débats qui peuvent devenir proprement surréalistes et qui font perdre énormément de temps aux intervenants sans aucun profit...

Alors là, oui, ça me met en rage , et j'attends à la suite que l'intéressé réagisse, en faisant preuve d'un minimum de logique, de façon à faire déboucher positivement le sujet... Je ne trouve pas que l'abandon soit une réaction positive !

Au cas particulier, il est question de tri d'une plage. Le tri consiste à ordonner les lignes de la plage selon l'ordre, soit croissant soit décroissant d'une colonne de la plage (éventuellement d'autres colonnes pouvant intervenir en cas d'égalité...)

L'ordre de tri croissant ou décroissant s'interprète de façon quantitative (plus petit ou plus grand, ou plus grand au plus petit) s'il s'agit de valeurs numériques, ou selon l'ordre alphabétique (direct ou inverse) s'il s'agit de valeurs texte. Dans ce dernier cas, les chiffres précèdent les lettres, et des caractères spéciaux peuvent précéder les chiffres...

Il s'agissait de faire en sorte que dans le cadre d'un tri alphabétique, la partie numérique précédant les lettres soit triée comme s'il s'agissait de nombres. Ce que l'on peut obtenir en alignant le nombre de caractères des valeurs triées, de façon que les caractères ajoutés pour y parvenir soit équivalent au "0" dans l'ordre de classement ou le précède.

Le résultat voulu étant obtenu sur la colonne à ordonner lors du tri, il va de soi que la plage triée, qu'elle ne comporte que cette colonne ou qu'il s'en ajoute quantité d'autres, sera triée selon l'ordre voulu !

A partir du moment ou une procédure trie une plage d'une colonne selon les critères souhaités, elle triera de la même façon une plage étendue à d'autres colonnes. Il s'agit seulement de redéfinir la plage sur laquelle s'applique le tri, en continuant de déterminer le tri sur la colonne concernée.

Et donc d'adapter la procédure dans ce sens :

Sub TriCorrectif()
    Dim PlgTri As Range, Plg As Range, c As Range, ord%
    ord = MsgBox("Voulez-vous effectuer un tri croissant [répondre Oui] ou décroissant " _
     & "[répondre Non] ?", vbYesNoCancel + vbQuestion, "TRI")
    Select Case ord
        Case vbYes: ord = xlAscending
        Case vbNo: ord = xlDescending
        Case vbCancel: Exit Sub
    End Select
    With ActiveSheet
        Set Plg = .Range("B2:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
        'Set PlgTri = Plg
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        c = String(11 - Len(c), "#") & c
    Next c
    Plg.Sort key1:=Plg.Cells(1, 1), order1:=ord, Header:=xlNo
    'PlgTri.Sort key1:=Plg.Cells(1, 1), order1:=ord, Header:=xlNo
    For Each c In Plg
        c = Replace(c, "#", "")
    Next c
End Sub

Plg est une variable Range désignant la colonne que l'on traite avant tri pour que le tri s'opère selon l'ordre voulu, et après tri pour la rétablir. Pour une adaptation la plus simple possible, on ajoute une variable Range : PlgTri à laquelle on affectera la plage totale qui doit être triée (ajout surligné dans la ligne de déclaration de variables).

La ligne de commande qui effectue le tri est : Plg.Sort.... J'ai ajouté en dessous, une ligne commençant par : PlgTri.Sort... mise en commentaire (et surlignée). Il convient donc simplement de rendre active cette ligne (en supprimant l'apostrophe qui précède) et supprimer la ligne précédente qui opérait jusque là le tri. Les deux lignes sont identiques à la définition près de la plage triée.

Il reste à définir PlgTri, plus haut dans le code, concuremment à la définition de la plage colonne traitée.

Set Plg = débute la ligne qui affecte la colonne concernée à la variable Plg. Laquelle doit être naturellement maintenue et éventuellement adaptée si elle ne se situait pas en colonne B sur la feuille traitée...

En dessous, j'ai amorcé une ligne (mise en commentaire et surlignée) qui doit être ajoutée pour définir en complément la plage à trier à partir de la plage colonne à traiter définie (pour assurer que les deux plages coincideront bien en nombre de lignes).

Comment définit-on une plage par extension d'une autre plage ?

Si la première colonne de la plage à définir n'est pas la première colonne de la plage source de référence, on recadre la nouvelle plage à partir de la précédente avec Offset en indiquant le décalage colonne nécessaire pour atteindre l'objectif. Puis, le nombre de colonnes des deux plages étant différent, on redimensionne avec Resize le nombre de colonne de la plage à définir. Soit la ligne amorcée est à compléter par :

        Set PlgTri = Plg.Offset(, décalage+/-).Resize(, nbColonnes)

et l'adaptation sera réalisée...

Que tu n'apprécies pas mon ton me semble tout à fait naturel mais j'eusse préféré une non appréciation positive visant la résolution du problème posé !

Cordialement.

Rechercher des sujets similaires à "conversion format lettres chiffres"