Mettre du texte en majuscule sur une plage dynamique (VBA)
Bonjour tout le monde !
Je sus débutant en VBA mais j'essaye quand même d'apprendre et surtout de comprendre ce que je fais. J'ai pu pour l'instant faire tout ce que je voulais mais je bloque sur la fonction UCase appliquée sur une plage dynamique.
Voici mon code :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("$B:$B")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Dim lignes As Integer
lignes = WorksheetFunction.CountA(Range("B:B")) - 8
Dim numero As Integer
numero = 1
For I = 21 To 20 + lignes
Cells(20 + numero, 1) = numero
Cells(20 + numero, 1).RowHeight = 15
Cells(20 + numero, 1).NumberFormat = "0"
With Range(Cells(20 + numero, 2), Cells(20 + numero, 7))
.NumberFormat = "@"
End With
Cells(20 + numero, 8).NumberFormat = "#,##0.00 €_)"
With Range(Cells(20 + numero, 1), Cells(20 + numero, 8))
.HorizontalAlignment = xlHAlignCenter 'ou xlHAlignLeft ou xlHAlignRight
.VerticalAlignment = xlVAlignCenter 'ou xlVAlignTop ou xlVAlignBottom
End With
With Range(Cells(20 + numero, 1), Cells(20 + numero, 8)).Font
.Name = "Times New Roman"
.FontStyle = "Normal"
.Size = 10
End With
With Range(Cells(20 + numero, 1), Cells(20 + numero, 8))
.Borders((xlInsideVertical)).LineStyle = xlDot
.BorderAround Weight:=xlThin
End With
Dim Minuscules As String
Set Minuscules = Range(Cells(20 + numero, 1), Cells(20 + numero, 8))
Minuscules = UCase(Minuscules)
numero = numero + 1
Next
End If
End SubJe suis désolé si le code vous paraît rudimentaire. Je débute, je le rappelle
La partie qui ne fonctionne pas :
Dim Minuscules As String
Set Minuscules = Range(Cells(20 + numero, 1), Cells(20 + numero, 8))
Minuscules = UCase(Minuscules)J'ai essayé aussi ce morceau de code :
Dim Minusules As Range
Dim Cell As Range
Set Minuscules = Range(Cells(20 + numero, 1), Cells(20 + numero, 8))
For Each Cell in Minuscules
Cell = Ucase(Cell)
NextCa fonctionne, mes cellules se mettent bien majuscules mais je pense que ca plante au niveau de la définition de la plage car Excel se met à ramer. Je pense que ça travaille au niveau de toute la feuille.
J'en appelle donc à votre aide car je ne sais plus quoi utiliser pour définir ma plage d'application.
Je vous joints une copie épurée de mon fichier. L'idée est d'enregistrer des chèques. Ma plage commence donc en A21-H21 et est donc dynamique.
Je souhaite donc qu'à chaque fois qu'une case est remplie sur la plage B21-G21 (pour une question de simplicité même si ce n'est pas nécessaire pour les champs CP) puis à chaque nouvel enregistrement sur la même plage (22, 23, etc...).
D'avance, je vous remercie pour le temps que vous voudrez bien me consacrer !
Arnaud
PS : Je viens de me rendre compte que l'extension xltm n'est pas autorisée.. Je réup en xlsx.
PS2 : Désolé, je ne sais pas pourquoi mais quand j'enregistre mon xltm en xlsm le code ne fonctionne plus...
bonjour,
une proposition de correction
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("$B:$B"), Range(Target.Address)) Is Nothing Then
Dim lignes As Integer, c, i
lignes = Cells(Rows.Count, 2).End(xlUp).Row
Application.EnableEvents = False
For i = 21 To lignes
Cells(i, 1) = i - 20
Cells(i, 1).RowHeight = 15
Cells(i, 1).NumberFormat = "0"
With Range(Cells(i, 2), Cells(i, 7))
.NumberFormat = "@"
End With
Cells(i, 8).NumberFormat = "#,##0.00 €_)"
With Range(Cells(i, 1), Cells(i, 8))
.HorizontalAlignment = xlHAlignCenter 'ou xlHAlignLeft ou xlHAlignRight
.VerticalAlignment = xlVAlignCenter 'ou xlVAlignTop ou xlVAlignBottom
With .Font
.Name = "Times New Roman"
.FontStyle = "Normal"
.Size = 10
End With
.Borders((xlInsideVertical)).LineStyle = xlDot
.BorderAround Weight:=xlThin
End With
For Each c In Range(Cells(i, 1), Cells(i, 8))
c.Value = UCase(c.Value)
Next
Next
Application.EnableEvents = True
End If
End SubMerci H2SO4,
Ca a répondu à ma question et clarifié mon code mais ça m'a posé aussi un nouveau problème. En effet, je me suis rendu compte qu'avec ça, tant que je rajoutais une nouvelle ligne, tout se mettait en majuscule, mais lors de l'ajout de la dernière ligne, seule B2 se mettait en majuscule. J'ai donc modifié comme suit :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("$B:$B"), Range(Target.Address)) Is Nothing Then
Dim lignes As Integer, i
lignes = Cells(Rows.Count, 2).End(xlUp).Row
Application.EnableEvents = False
For i = 21 To lignes
Cells(i, 1) = i - 20
Cells(i, 1).RowHeight = 15
Cells(i, 1).NumberFormat = "0"
With Range(Cells(i, 2), Cells(i, 7))
.NumberFormat = "@"
End With
Cells(i, 8).NumberFormat = "#,##0.00 €_)"
With Range(Cells(i, 1), Cells(i, 8))
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
With .Font
.Name = "Times New Roman"
.FontStyle = "Normal"
.Size = 10
End With
.Borders((xlInsideVertical)).LineStyle = xlDot
.BorderAround Weight:=xlThin
End With
Next
Application.EnableEvents = True
End If
If Not Application.Intersect(Range("$H:$H"), Range(Target.Address)) Is Nothing Then
Dim lignes1 As Integer, c, z
lignes = Cells(Rows.Count, 2).End(xlUp).Row
Application.EnableEvents = False
For z = 21 To lignes
For Each c In Range(Cells(z, 1), Cells(z, 8))
c.Value = UCase(c.Value)
Next
Next
Application.EnableEvents = True
End If
End SubIl me reste encore à annoter le code, mais je n'ai pas encore tout compris, donc je vais prendre le temps d'analyser. En tout cas, un grand merci, j'ai appris de nouvelles fonctions grâce à toi