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 Sub

Je 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)
Next

Ca 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...

9modele-test1.xlsm (37.27 Ko)

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 Sub

Merci 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 Sub

Il 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

Rechercher des sujets similaires à "mettre texte majuscule plage dynamique vba"