Convertir des chiffres en indices/exposants - Macro

Bonjour à tous,

Je voudrais savoir si il est possible de configurer une macro pour :

- Dans un feuille Excel, il y a dans plusieurs cellules éparpillés un peu partout, des unités (m2, m3, teq CO2, etc..). L'idée serait de configurer une macro afin de détecter ces unités et convertir les chiffres automatiquement en indices (CO2) ou exposant (m2 / m3).

En clair, je voudrais éviter de parcourir l'ensemble des cellules à la main et changer une à une les indices/exposants.

Merci d'avance et très bonne journée,

Mathieu

Petit up

J'ai fais ce code pour la plage de cellule sélectionné afin de balayé toutes les possiblités :

Sub Test()

For Each c In Application.Selection

If c.Value <> "" Then

c.Value = Replace(c.Value, "co2", "C")

c.Value = Replace(c.Value, "m2", "m²")

c.Value = Replace(c.Value, "m3", "m³")

End If

Next c

End Sub

Par contre pour le CO2, impossible de mettre le 2 en indice dans le code, y-a-t-il un moyen ?

Bonsoir Mathieu,

Je te propose cette adaptation de ton code VBA :

Option Explicit

Sub Test()
  Dim c As Range, p As Byte
  For Each c In Application.Selection
    If c.Value <> "" Then
      c.Value = Replace$(c.Value, "m2", "m²")
      c.Value = Replace$(c.Value, "m3", "m³")
      p = InStr(UCase$(c.Value), "CO2")
      If p > 0 Then c.Characters(p + 2, 1).Font.Subscript = True
    End If
  Next c
End Sub

La mise en indice faite à l'aide de .Subscript doit obligatoirement être située après les instructions avec Replace$(), car sinon, les Replace$() annulent les indices.

Si besoin, tu peux demander une adaptation.

Merci de me dire si ça te convient.

dhany

Bonjour,

Pour les m2 et m3, ou similaires, on peut utiliser AutoCorrect (correction automatique).

Un exemple :

Public Sub Add_AutoCorrect()
    With Application.AutoCorrect
        .AddReplacement "m2", "m" & Chr(178)
        .AddReplacement "m3", "m" & Chr(179)
    End With
End Sub

Public Sub Delete_AutoCorrect()
    With Application.AutoCorrect
        .DeleteReplacement "m2"
        .DeleteReplacement "m3"
    End With
End Sub

Merci !!

Et pour les indices, vous avez une astuce ? impossible de trouver..

Exemple : pour convertir dans une cellule, CO2 en CO2 (avec le 2 en indice).

Bonjour,

Je n'ai pas trouvé de caractère Unicode pour représenter un indice 2.

Prends la proposition de Dhany !...

Cdlt.

Bonjour,

indice 2 c'est le code hexa 2082 (8322 en décimal).

2080 à 2089 pour indices 0 à 9.

Tu peux copier-coller ce caractère : ₂

A voir si ça passe dans le correcteur orthographique (?) Test par ajout manuel au dictionnaire ok

eric

@mathp82

pour tes indices, t'as pas dû lire mon post du 29 juin à 21:13 car ça le fait !

https://forum.excel-pratique.com/viewtopic.php?p=664458#p664458

et j'parle bien d'indices, pas d'exposants !


@eriiic

dans une cellule Excel, quand j'tape Alt 8322 (pavé numérique), j'ai « é », pas l'indice 2 !

j'ai p't'être pas fait la bonne manip ?

j'sais pas comment t'as eu ton « ₂ » mais il est petit, pas en indice ;

l'indice, c'est quand c'est plus bas que la ligne où on écrit.

dhany

Bonjour,

@ Eric,

Bonjour,

Je n'arrive pas à exécuter la chose en VBA, comme pour le m2 ou le m3.

Je travaille de plus sur un portable Lenovo, et pas possible de saisir ces codes.

Peux-tu regarder ?

Cdlt.

@Jean-Eric

attention : les codes avec Alt ne marchent que sur le pavé numérique !

si ton portable Lenovo en a un : y'a aucun problème ! sinon, faut espérer qu'y'ait un moyen d'simuler ce pavé numérique via une des combinaisons avec la touche Fn ; mais comme c'est très variable d'un modèle de PC à un autre, j'peux pas t'aider plus.

le plus sûr est d'consulter le mode d'emploi d'ton PC portable Lenovo ... si tu l'as encore ; sinon, fais une recherche google, de préférence sur le site du fabricant Lenovo.

dhany

Bonjour Dhany,

Sur mon Lenovo (laptop X1 Carbon), pas possibilité avec la touche fn, ou tout autre artifice.

Cette option n'est pas disponible!...

Ne me demande pas la raison pour laquelle Lenovo a shunté la chose...

Cdlt.

alors j'viens d'penser à cela : y'a p't'être un moyen logiciel : via le clavier virtuel par exemple ; ou via un utilitaire spécial à télécharger sur le net (un freeware de préférence) ; à part ça, j'ai pas d'autre idée.

la raison, ça m'étonnerait pas qu'ce soit une bête économie d'bouts d'chandelles, comme de plus mettre de LED pour la touche majuscule (et parfois même aussi pour la touche NumLock) !

dhany

Re,

oui, c'est un caractère unicode. Il faut utiliser ChrW :

        .AddReplacement "co2", "CO" & ChrW(8322) ' saisie minuscules avec code en décimal
        .AddReplacement "CO2", "CO" & ChrW(&H2082) ' saisie majuscules avec code en hexa

Mais tu peux enrichir la liste de correction manuellement : 'Fichier / Options / Vérification / Options de corrections automatiques/ Corrections automatiques'

Tu remplis Remplacer: xx Par: yy

Ici, si tu as trouvé le caractère voulu quelque part, tu peux le mettre par un simple copié-collé sans te préoccuper du code.

Par contre c'est lié au pc. Si ton fichier est amené à voyager, la macro tu peux la lancer pour en bénéficier sur le nouveau poste.

eric

ah, par VBA ! d'accord, merci pour ton complément d'info !

dhany

Bonjour à tous,

Pour renvoyer des caractères unicodes : ChrW et ChrW(8322) renvoie bien le 2 en indice tel qu'indiqué par Jean-Eric.

Bonne journée.

edit : J'avais pas rafraîchi Eric !

@MFerrand : lis la dernière phrase de ce post : https://forum.excel-pratique.com/viewtopic.php?p=662382#p662382

Bonsoir Mathieu,

Je te propose cette adaptation de ton code VBA :

Option Explicit

Sub Test()
  Dim c As Range, p As Byte
  For Each c In Application.Selection
    If c.Value <> "" Then
      c.Value = Replace$(c.Value, "m2", "m²")
      c.Value = Replace$(c.Value, "m3", "m³")
      p = InStr(UCase$(c.Value), "CO2")
      If p > 0 Then c.Characters(p + 2, 1).Font.Subscript = True
    End If
  Next c
End Sub

La mise en indice faite à l'aide de .Subscript doit obligatoirement être située après les instructions avec Replace$(), car sinon, les Replace$() annulent les indices.

Si besoin, tu peux demander une adaptation.

Merci de me dire si ça te convient.

dhany

Merci beaucoup pour votre aide.

J'ai testé ça a l'air de marcher !

Par contre pourrais tu m'expliquer clairement l'opération :

p = InStr(UCase$(c.Value), "CO2")

If p > 0 Then c.Characters(p + 2, 1).Font.Subscript = True

Je suis pas trop un expert en macro, j'aimerai comprendre plus en détail surtout si je fais des modifications !

Merci en tout cas

pour compléter mon dernier post de 13h20 (qu’apparemment tu n'as pas vu), si tu es souvent confronté à ces caractères spéciaux tu as un petit utilitaire que je trouve bien fait. Avec des combinaisons mnémotechnique de touches pour les saisir.

Tu ne peux pas écrire directement les caractères unicodes sur une feuille excel.

Avec cet utilitaire tu peux. Pour indice 2 c'est Alt droit (touche paramétrable) _ 2 pour obtenir ₂

WimCompose : https://github.com/SamHocevar/wincompose

Accessoirement il permet de retrouver les codes hexa assez facilement.

eric

Bonjour Mathieu,

Tu a écrit :

j'aimerai comprendre plus en détail surtout si je fais des modifications !

c'est très bien, que tu cherches à comprendre ! alors voici les explications :

p = InStr(UCase$(c.Value), "CO2")

avec UCase$(), ça met en majuscules la valeur de c ; et si ça y trouve "CO2", ça retourne dans p la position du 1er caractère "C".

(attention : si non trouvé, p vaut 0)

If p > 0 Then c.Characters(p + 2, 1).Font.Subscript = True

si p > 0 alors avec .Font.Subscript ça met en indice le caractère de la cellule c, à partir de la position p + 2 (car 2 caractères à droite du C, c'est bien le 2 de CO2) ; le 1 est pour la longueur : 1 seul caractère.

dhany

Re,

@ Eric

J'avais le chrW mais pas le 8322 (et les autres). Pas révéillé ce jour !...

Merci pour WinCompose (bien utile pour un Lenovo...)

Bonne journée.

Cdlt.

Rechercher des sujets similaires à "convertir chiffres indices exposants macro"