Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

aide sur une macro

  • Initiateur de la discussion Initiateur de la discussion sniper2002
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

sniper2002

XLDnaute Occasionnel
bonjour à toute et à tous

j'ai pu trouver sur ce form un code me permet de convertir les lettres à la saisie en majiscule + les caractères spéciaux(!"'?#) en espaces.

Private Sub Worksheet_change(ByVal Target As Range)
If Target.Count = 1 Then
textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
textB = "EEEEOooAAAcaaaeeeecuuouii "
temp = Target
For i = 1 To Len(temp)
p = InStr(textA, Mid(temp, i, 1))
If p > 0 Then Mid(temp, i, 1) = Mid(textB, p, 1)
Next
Target = UCase(temp)
End If
End Sub

ce code est valable uniquement sur la saisie, mais pas sur le copier coller de plus de 1 cellule ==> copier/coller de 2 cellule ne fonctionne pas

ma question est comment ameliorer ce code pour qui soit valable pour las saise et le copier/coller

merci pour votre aide
 
Re : aide sur une macro

Bonjour



C'est ici que cela se joue

If Target.Count = 1 Then
(Mais en otant cette vérification le code plantera si tu sélectionnes plusieurs cellules )

Et la tu dois avoir un problème
textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
textB = "EEEEOooAAAcaaaeeeecuuouii "

car il n 'y a pas le même nombre d'éléments.
 
Dernière édition:
Re : aide sur une macro

pour la première remarque je n'est pas compris ce que tu voulais dire
pour la deuxième : c'est le mode de saise dans le forum qui ne me permet pas d'avoir l'espace vide
mais dans code j'ai bien respecté le nombre de caractères pour les 2 texte
 
Re : aide sur une macro

Re


Cette ligne
If Target.Count = 1 Then

veut dire si le nombre de cellules dans la sélection =1

donc en cas de sélection de plusieurs cellules c'est normal que cela buggue
 
Re : aide sur une macro

Bonjour à tous
Cela ferait-il l'affaire ?
Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim textA As String, textB As String, oCel As Range, vCel As String, p As Integer, i As Long
   textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
   textB = "EEEEOooAAAcaaaeeeecuuouii              "
   Application.EnableEvents = False
   For Each oCel In Target.Cells
      vCel = oCel.Value
      For i = 1 To Len(vCel)
         p = InStr(textA, Mid(vCel, i, 1))
         If p > 0 Then
            Mid(vCel, i, 1) = Mid(textB, p, 1)
         End If
      Next i
      oCel.Value = UCase(vCel)
   Next oCel
   Application.EnableEvents = True
End Sub
ROGER2327
 
Dernière édition:
Re : aide sur une macro

bonsoir

une autre solution pour eviter le enableevents qui peux poser des soucis de stabilité en cas de plantage de la macro

Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim textA As String, textB As String, oCel As Range, vCel As String, p As Integer, i As Long
Static flag As Boolean

textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
textB = "EEEEOooAAAcaaaeeeecuuouii              "
   
If Not flag Then
    flag = True
    For Each oCel In Target.Cells
        vCel = oCel.Value
        For i = 1 To Len(vCel)
            p = InStr(textA, Mid(vCel, i, 1))
            If p > 0 Then
                Mid(vCel, i, 1) = Mid(textB, p, 1)
            End If
        Next i
        oCel.Value = UCase(vCel)
   Next oCel
Else
    flag = False
End If

End Sub

salut ^^
 
Re : aide sur une macro

Bonjour
Suite à la proposition d'Hervé, j'ai repris le détail du code. Je confirme qu'il fonctionne, ainsi que celui d'Hervé. La différence entre les deux est que celui d'Hervé s'exécute deux fois plus souvent, car à chaque exécution de
Code:
        oCel.Value = UCase(vCel)
la valeur d'une cellule est modifiée : la procédure est alors immédiatement ré exécutée, avant de terminer la première exécution.
D'autre part, en cas de copier-coller d'une plage de plus d'une cellule, toutes les cellules sont traitées, quel que soit leur contenu. En particulier, si une cellule contient une formule, celle-ci est détruite et remplacée par sa valeur.
Si une cellule est vide, ou a un contenu purement numérique, on perd du temps à la traiter. Je propose donc une autre version, laquelle ne souffre pas des inconvénients décrits ci-dessus.
Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim textA As String, textB As String, oCel As Range, vCel As String, i As Long
   textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
   textB = "EEEEOooAAAcaaaeeeecuuouii              "
   Application.EnableEvents = False
   For Each oCel In Target.SpecialCells(xlCellTypeConstants, xlTextValues).Cells
      vCel = oCel.Value
      For i = 1 To Len(vCel)
         If InStr(textA, Mid(vCel, i, 1)) Then Mid(vCel, i, 1) = Mid(textB, InStr(textA, Mid(vCel, i, 1)), 1)
      Next i
      oCel.Value = UCase(vCel)
   Next oCel
   Application.EnableEvents = True
End Sub
Si on craint (à mon avis, sans raison) des effets néfastes de l'instruction
Code:
   Application.EnableEvents = False
on peut aussi utiliser le code :
Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim textA As String, textB As String, oCel As Range, vCel As String, i As Long
   textA = "ÉÈÊËÔôöÀÂÄÇàâäéèêëçùüôûïî;°%@:,§&'#=+!?"
   textB = "EEEEOooAAAcaaaeeeecuuouii              "
   For Each oCel In Target.SpecialCells(xlCellTypeConstants, xlTextValues).Cells
      vCel = oCel.Value
      For i = 1 To Len(vCel)
         If InStr(textA, Mid(vCel, i, 1)) Then Mid(vCel, i, 1) = Mid(textB, InStr(textA, Mid(vCel, i, 1)), 1)
      Next i
      [COLOR="DarkOrange"]Application.EnableEvents = False[/COLOR]
      oCel.Value = UCase(vCel)
      [COLOR="DarkOrange"]Application.EnableEvents = True[/COLOR]
   Next oCel
End Sub
qui suspend la prise en compte des événements pour la seule durée de l'écriture d'un résultat dans la feuille.
Qu'en pensez-vous ?
ROGER2327
 
Re : aide sur une macro

Bonjour a tous

J'ai ajouté a ma liste des Grands Maitres le nom de ROGER2327 ou il devra cohabiter avec Hervé

A mon humble avis les differences entre le Application.EnableEvents et le Flag (que je prefere pour ma part) se situent
en terme de temps d'execution
le flag ne supprime pas la réexecution de la macro mais l'ecourte tres notablement
en terme de securite
avec flag et en cas de bug dans la macro ,les eventuelles autres macros ne seront pas affectées
 
Re : aide sur une macro

salut roger

une "longue" expérience de xld ma prouvé qu'une macro pouvait tres bien tournée à l'instant T, et plus lorsque le quidam de base la reprenait en l'adaptant à son souci.

j'essaye toujours de coder avec mes imprécisions et mes maladresses d'autodidacte, en me disant que mes codes doivent etre le plus "universel" possible puisqu'ils s'adressent à une tres grande majorité.

en tout humilité

votre serviteur, hervé

salut
 
Re : aide sur une macro

Salut,

...
une "longue" expérience de xld ma prouvé qu'une macro pouvait tres bien tournée à l'instant T, et plus lorsque le quidam de base la reprenait en l'adaptant à son souci.
...

Je pense que la moindre des choses serait que le quidam acquiert un minimum de bases avant de traficoter les codes fournis et commence par essayer de comprendre les procédures récupérées.
J’exclue, ici, celui qui se contente de leur finalité en ignorant leur travail invisible.

Il est vrai que mal utilisée, la booléenne «EnableEvents» peut provoquer un dysfonctionnement car, à False, elle inhibe toutes les évènementielles et si on oublie de la remettre à True, on bloque le système.

Mais de là à la remplacer par une autre booléenne ...
J’ai même lu des questions du genre « Que signifie Flag ? », alors qu’on pourrait utiliser, comme pour n’importe quelle autre variable, un mot français plus parlant (pour une meilleure compréhension de l’utilité du Drapeau).

De toute façon, pour que la procédure dans laquelle on a en entrée Flag = False (ou True) fonctionne bien, il faut, pour chaque sortie, un Flag = True (respectivement False) !

Il en est qui se protège à coup de On Error …

Donc, pour ma part, je préfère que l’utilisateur qui veut programmer sache ce qu’il fait au niveau des évènementielles avec les possibilités offertes par le logiciel. Quand la «chose» est bien maîtrisée les risques d’erreur diminuent.

Mais étant loin d’être un Maître es Excel, ce n’est qu’un point de vue personnel et ne fais aucune obligation de le partager.

Petite question : mon véhicule est équipé d’une marche arrière mais comme utiliser celle-ci peut s’avérer très dangereux, me faut-il descendre de la voiture et la pousser à la main pour la faire reculer ?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
928
Réponses
7
Affichages
836
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…