Dans une chaine, modifier le format de plusieurs caractères
Bonjour,
Je vous remercie de m'accueillir sur votre forum.
Je désirerais réaliser une fonction VBA permettant de modifier, dans une chaine contenue dans une cellule, le format de chaque caractère qui suit un caractère particulier :
Exemple : Voici une chaine à modifier dans la cellule A1 : =2^3 * 3^4 * 7^2.
Je désirerais modifier le format de tous les caractère qui suivent ^ pour obtenir après suppression des ^ :
= 23 * 34 * 72
Je vous remercie par avance pour votre aide.
Bien cordialement.
Patrick Bayle,
Bonjour,
Voici un essai avec ce codes à mettre dans un module normal :
Sub superscripter(plage As Range)
for each cell in plage
With cell
For i = 1 To Len(.Value)
If .Characters(i, 2).Text Like "^#" Then
.Characters(i, 1).Text = ""
.Characters(i, 2).Font.Superscript = True
End If
Next i
End With
next cell
End Sub
Sub Lancer()
Call superscripter(range("A1:A10"))
end subLe second exécute le premier. Il faut juste adapter la plage (ici, c'est A1:A10 pour l'instant).
Cdlt,
Bonjour,
Je vous remercie pour une réponse aussi rapide.
Votre code fonctionne très bien.
Je l'ai un peu modifié à ma façon et il continu à bien fonctionner
Sub MISENFORM()
Dim Cell As Range
Dim i As Integer
For Each Cell In Selection
With Cell
.Value = Replace(.Value, "=", "= ")
For i = 1 To Len(.Value)
If .Characters(i, 2).Text Like "^#" Then
.Characters(i, 1).Text = ""
.Characters(i, 2).Font.Superscript = True
End If
Next i
End With
Next Cell
End Sub
J'ai essayé en suite de l'intégrer dans une fonction pour l'utiliser comme formule mais je n'y parviens pas.
J'ai une erreur de Valeur.
Si vous pouvez encore m'aider, je vous en remercie par avance.
bien cordialement.
Patrick Bayle,
Bonjour à nouveau,
J'ai encore un peu amélioré le code :
Sub MISENFORM()
Dim Cell As Range
Dim i As Integer
For Each Cell In Selection
With Cell
.NumberFormat = "@"
.Value = ActiveCell.Previous
.Value = Replace(.Value, "=", "= ")
.Value = Replace(.Value, "*", "x")
For i = 1 To Len(.Value)
If .Characters(i, 2).Text Like "^#" Then
.Characters(i, 1).Text = ""
.Characters(i, 1).Font.Superscript = True
End If
Next i
End With
Next Cell
End SubJ'avais des problèmes de format de cellule, il fallait que je fasse une copie de la valeur de la cellule dont je voulait transformer la présentation et que je donne à la cellule le format texte pour que le code s'exécute convenablement.
Maintenant le contenu de la cellule cible se copie et se transforme automatiquement dans la cellule sélectionnée.
Pour la ligne :
.Characters(i, 1).Font.Superscript = True1 suffit.
Je vais maintenant tenter de trouver une solution pour adapter ce code pour une fonction.
Si vous avez des idées, je suis preneur.
Merci pour tout.
Bien cordialement.
Patrick Bayle,
Bonjour,
Je crains que coder une fonction qui mette le résultat en exposant soit impossible, à moins de vraiment mettre le paquet pour tenter de reproduire le résultat avec un comportement de fonction...
Que voulez-vous vraiment ? Vous avez remarqué, j'ai mis une macro paramétrée car j'avais dans l'idée d'utiliser cette macro dans un évènement change. Ce serait selon moi la solution la plus simple : Dès qu'une cellule est modifiée, on appelle la macro et on transforme, lorsque le modèle "^Chiffre" est présent, en exposant.
Cdlt,
Bonjour,
C'est ce que j'ai fait en fin de compte et le fonctionnement est suffisamment pratique.
j'ai mis le code dans un évènement Worksheet : "Private Sub Worksheet_SelectionChange"
Je vous remercie de toute l'attention que vous avez apporté à mon projet.
J'ai fait un fichier sur l'Algorithme d'Euclide pour mon petit fils à qui je donne des cours de math et j'ai trouvé dans ce cadre une fonction qui permet de décomposer les nombres en nombre premier.
Le code me permet d'affiner un peu la présentation.
Si le fichier peut présenter un intérêt éducatif, je veux bien le diffuser sur le site.
dite-moi ce que vous en pensez ?
Bien cordialement.
Patrick Bayle,
Je me suis rendu compte que ce qui était difficile à gérer dans les fonctions, c'est la mise en forme des cellules.
Bonjour,
Je suis content que vous y soyez parvenu et que le résultat vous plaise.
Oui, c'est une bonne idée de partager ce fichier. Il y a régulièrement des étudiants en maths/info qui ont des problèmes similaires, ça pourrait leur servir de support.
En effet, les fonctions servent à renvoyer une valeur. Le fait de tenter d'agir en même temps sur la cellule où est saisie la fonction tient presque de la référence circulaire. Honnêtement, c'est une des limites de mes connaissances mais j'ai l'impression que les fonctions sont surtout pensées pour renvoyer des valeurs dans les types "natifs" de VBA. Les objets "range" et autres, sont des types d'application (excel en l'occurrence). Et je dis peut-être des bêtises mais je pense qu'il est difficile, voire impossible, de créer une fonction qui puisse renvoyer un objet d'application sur l'application car l'objet est constitué de multiples propriétés (et parfois objets) ayant chacune une valeur. La fonction peut seulement utiliser l'information que ces objets contiennent.
Enfin, c'est l'impression que j'ai... Si un expert passait par là pour nous donner une explication, ça pourrait nous permettre de mieux comprendre.
Cdlt,
Voilà, J'ai testé toutes les possibilités pour éviter les erreurs dans les cas particulier.
Chez moi, ça marche.
En cas de problème, je pense pouvoir apporter une aide.
Ci-joint le fichier "Algorithme d'Euclide" qui permet également de décomposer les nombres entiers en nombres premiers.
Pour aider mon petit fils, j'en fait un actuellement sur les équations
du premier et deuxième degré.
Je vous en ferai profiter prochainement.
Je vous remercie pour votre attention.
Bien cordialement.
Patrick Bayle,