Problème code VBA - majuscule
Bonjour,
la semaine passée, vous m'avez aidé avec mon code postal canadien dans mon fichier qui fonctionne merveilleusement.
Mais là, je voulais que pour mes colonnes f, g, i, j, l, n et o soit en majuscule sans accent.
J'ai trouvé ici un code qui fait cela mais lorsque je le mets avec mon autre code j'ai un message d'erreur et de plus je voudrais enlever le target 0.25 mais j'ose pas trop car j'ai peur de faire une erreur. Voici mes deux codes bout à bout.
Le premier est parfait mais c'est quand j'écris en minuscule et qu'il devrait convertir j'ai un message d'erreur : Erreur de compilation : nom ambigu détecté : Worksheet_change. Pouvez-vous m'aider
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range
Set Rg = Intersect(Target, Columns(16))
Application.EnableEvents = False
If Not Rg Is Nothing Then
For Each c In Rg
c.Value = UCase(Application.Trim(c))
If c.Value Like "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" Or _
c.Value Like "[A-Z][0-9][A-Z][0-9][A-Z][0-9]" Then
c.Value = Left(c, 3) & " " & Right(c, 3)
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
ElseIf c.Value <> "" Then
MsgBox "la saisie du code postal est inexacte"
c.Interior.ColorIndex = 3
c.Font.ColorIndex = 2
Else
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
End If
Next
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim codeA As String, codeB As String, temp As String
Dim i As Byte, p As Byte
If Target.Row = 1 Then Exit Sub
If Not IsNumeric(Target) Then
codeA = "ÉÈÊËÔéèêëàçùôûïî"
codeB = "EEEEOeeeeacuouii"
temp = Target
For i = 1 To Len(Target)
p = InStr(codeA, Mid(Target, i, 1))
If p > 0 Then Mid(temp, i, 1) = Mid(codeB, p, 1)
Next
Application.EnableEvents = False
Target = UCase(temp)
Else:
Application.EnableEvents = False
Target = Application.Ceiling(Target, 0.25)
End If
Application.EnableEvents = True
End Sub
Tu as en effet 2 procédures Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Il faut inclure ton second code dans la première procédure.
Bonjour,
Les 2 macros assemblées : (supprimer les précédentes)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim codeA$, codeB$, temp$, i As Byte, p As Byte, Rg As Range, c
Set Rg = Intersect(Target, Columns(16))
On Error GoTo GESTERR
Application.EnableEvents = False
If Not Rg Is Nothing Then
For Each c In Rg
c.Value = UCase(Application.Trim(c))
If c.Value Like "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" Or _
c.Value Like "[A-Z][0-9][A-Z][0-9][A-Z][0-9]" Then
c.Value = Left(c, 3) & " " & Right(c, 3)
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
ElseIf c.Value <> "" Then
MsgBox "la saisie du code postal est inexacte"
c.Interior.ColorIndex = 3
c.Font.ColorIndex = 2
Else
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
End If
Next
End If
Application.EnableEvents = True
'Part2
If Target.Row = 1 Then Exit Sub
If Not IsNumeric(Target) Then
codeA = "ÉÈÊËÔéèêëàçùôûïî"
codeB = "EEEEOeeeeacuouii"
temp = Target
For i = 1 To Len(Target)
p = InStr(codeA, Mid(Target, i, 1))
If p > 0 Then Mid(temp, i, 1) = Mid(codeB, p, 1)
Next
Application.EnableEvents = False
Target = UCase(temp)
Else:
Application.EnableEvents = False
Target = Application.Ceiling(Target, 0.25)
End If
Application.EnableEvents = True
ExitSub
GESTERR:
Application.EnableEvents = True
MsgBox "Une erreur est intervenue"
End Sub
J'ai juste rajoutée une gestion d'erreur car ce type de code est un peu "casse-cou" :
En cas d'apparition du message revenir en précisant quelle manip à provoqué le message.
A+
Allo,
bon j'ai copié la programmation et lorsque j'écris, j'ai ce message :
Erreur de compiliation : Sub ou Funciton non défini
et il se place à la fin sur Exitsub...
pkoi ?
bon,
j'ai fusionné mes deux codes sans faire aucun changement. Tout va bien, par contre, si j'écris quelque chose dans une cellule et que par la suite je l'efface, il me met un zéro (0). Pkoi fait-il cela. Si je veux effacer le contenu, je ne veux rien avoir....
Ah c'était le 0.25... qui faisait ce problème.
Donc pour l'instant je continue mes tests pour voir si tout est ok.
Bon tout va bien partout dans mon fichier.
par contre, j'ai une question.
Lorsque je sélectionne plusieurs cellule pour effacer avec Suppr il me dit : Erreur d'exécution "13" : Incompatibilité de type
comment puis-je régler ce problème car je dois envoyer ce fichier à plusieurs personnes qui ne connaissent rien en VBA, je ne veux donc pas ce type de message...
Merciiiii d'avance pour votre aide.
Bonsoir,
il faut corriger :
Exit Sub
En principe, on évite d'écrire des macros de ce type qui s'appliquent à plusieurs cellules. Pour cette raison on met habituellement dans cette macro cette condition :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim codeA$, codeB$, temp$, i As Byte, p As Byte, Rg As Range, c
If Target.count = 1 then
'Suite de la macro
...
End if
End Sub
Par suite la macro ne s'applique que lorsqu'on modifie une seule cellule.
Par suite le For each C in rg ... Next n'a pas de sens (est inutile) : C ne pouvant qu'être unique.
Il n'y a pas d'autres solutions.
A+
J'ai mis ça comme code et non celui du haut :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range
Set Rg = Intersect(Target, Columns(16))
Application.EnableEvents = False
If Not Rg Is Nothing Then
For Each c In Rg
c.Value = UCase(Application.Trim(c))
If c.Value Like "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" Or _
c.Value Like "[A-Z][0-9][A-Z][0-9][A-Z][0-9]" Then
c.Value = Left(c, 3) & " " & Right(c, 3)
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
ElseIf c.Value <> "" Then
MsgBox "la saisie du code postal est inexacte"
c.Interior.ColorIndex = 3
c.Font.ColorIndex = 2
Else
c.Interior.ColorIndex = xlNone
c.Font.ColorIndex = xlAutomatic
End If
Next
End If
Application.EnableEvents = True
'part2
If Target.Row = 1 Then Exit Sub
If Not IsNumeric(Target) Then
codeA = "ÉÈÊËÔéèêëàçùôûïî"
codeB = "EEEEOeeeeacuouii"
temp = Target
For i = 1 To Len(Target)
p = InStr(codeA, Mid(Target, i, 1))
If p > 0 Then Mid(temp, i, 1) = Mid(codeB, p, 1)
Next
Application.EnableEvents = False
Target = UCase(temp)
Else:
Application.EnableEvents = False
End If
Application.EnableEvents = True
End Sub
Y a t-il quelque chose à corriger pour éviter le message d'erreur ?