Majuscules et NomPropre -EXCEL

Résolu
Bonjour,

Je fais du depouillement d'acte et j'aimerais que la saisie de certaine colonne soit automatisée.
que lorsque j'ecrit en minuscule, mes cellules ce transformes seules.
Car il y a plusieurs feuilles et des miliers de lignes dans chaques feuilles.

Par exemple:
1) Les colonnes B, D, F, J, K, N, R, T, X, AN, AQ doivent être en Majuscules.
2) Les colonnes C, E, M, O, S, U, W, Y, AO, AR doivent être en Nom propre (Chaque mot doit commencer par une majuscules)

Je n'y connais pas grand choses en BVA, sur la toile, j'ai trouver des codes, mais soit la feuilles completes est en Majuscules soit en Nompropre.

Merci pour ceux qui voudrons bien m'apporter leur aide.

Salutations
Configuration: Windows XP Internet Explorer 7.0 
OFFICE PRO 2007

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Encore merci..
    Merci aussi de tes explications, je comprends un peu mieux maintenant, surout que j'ai aussi trouver un "manuel" du language pour m'aider...
    Encore une grand merci et excuse moi de ma réponse tardive, j'etais absente aujourd'hui.
    Josyan
    1. Contributeur
      En vba il est préférable de ne faire travailler les fonctions que sur les types de données qu'elles attendent.
      Souvent ça génère une erreur car contrairement aux fonctions feuilles il n'y a pas de conversion automatique lorsque c'est nécessaire...
      Là, à-priori, on pourrait se passer du test isnumeric (d'ailleurs ça m'étonne) mais une date qui passe par Ucase se retrouve transformée en chaine. Un recherchev() par exemple ne la retrouvera plus.
      Ces fonctions travaillent sur des chaines, je ne leur passe que des chaines. De plus un traitement de chaine est souvent plus couteux en ressource qu'un test (bien que là toutes les cellules sont sensées être toutes des chaines donc toutes traitées, on est perdant...).
      eric
      1. Bonjour Eric,

        Merci Merci....

        Je viens de tester sur ma feuille, une vrai merveille....

        Effectivement il s'agit d'une autre feuille, celle si c'est pour des communiants et des soldats.
        Je commence à comprendre un peut mieux, en fait pour chaque caractéristiques (majuscules, nompropre) il faut un nouveau code. Par contre pourquoi mettre une ligne qui semble vouloir dire, si c'est pas numerique ou si c'est pas une date?? celà a t'il vraiment une importance?.

        Bonne journée
        Josyan.
        1. Contributeur
          Bonjour,

          Voici la procédure complète :
          Private Sub Worksheet_Change(ByVal Target As Range)
              Application.EnableEvents = False
              'cellules en majuscules
              If Not Intersect(Target, Union([C12], [H12])) Is Nothing Then
                  If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                      Target.Value = UCase(Target.Value)
                  End If
              'cellules en Nom Propre
              ElseIf Not Intersect(Target, Union([C11], [H11])) Is Nothing Then
                  If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                      Target.Value = Application.Proper(Target.Value)
                  End If
              End If
              Application.EnableEvents = True
          End Sub

          Comme on retrouve la colonne C qui était déjà définie je suppose que c'est sur une autre feuille.

          Sinon, si c'est sur la même feuille, je suppose que ça doit prendre le dessus sur la macro qui traite toute la colonne et doit être exécuté après. Dans ce cas copier le code (sans sub, end sub et Application.EnableEvents) et le mettre à la fin de l'autre, avant Application.EnableEvents = True.

          eric
          1. Salut,

            C'est vrai que pour toi c'est l'heure du dodo..moi j'ai moins 6h de décalage par rapport à toi.
            Merci de ta patience et de me répondre...

            Bon j'ai essayer de comprendre ... et bien c'est pas gagner...

            Dans le code Nº que tu m'avais noté, je crois comprendre que la ligne qui commence par Dim est la déclaration...
            ensuite la désignation des colonnes.
            Le reste j'ai pas tout suivis...donc je ne sais pas ou mettre le 3ème codes...

            Désolée, c'est pas trop mon truc et je rame.
            Mais comme j'aime bien savoir le pourquoi du comment je me permets de t'importuner de nouveau.

            Si tu pouvais me faire la meme chose pour mes cellules Majuscules et Nompropre en m'expliquant la démarche des formules employées.

            Je vais essayer aussi de trouver sur le net un "dictionnaire" de VBA.

            Encore merci merci de ton aide.
            Josyan
            1. Contributeur
              Re,

              Vite fait un exemple car c'est l'heure du dodo :
              If Not Intersect(Target, Union([C12], [H12])) Is Nothing Then
                  If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                      Target.Value = UCase(Target.Value)
                  End If
              End If


              Tu peux ajouter autant de ref que tu veux dans union()
              Toujours dans l'evenement change
              eric
              1. Salut Eric....Encore moi,

                J'essaye de comprendre le cheminement de ce que tu m'a donner... mais dur dur, j'y comprends pas vraiment tout.

                Je reviens donc vers toi avec une autre question.
                Si je voulais faire la même chose que pour mes colonnes mais avec cette fois ci, juste pour des cellules...
                avec:
                cellules C12 et H12 en majuscules
                et cellules C11 et H11 en NomPropre...

                Que devrais-je modifier à ton code pour que cela fonctionne...

                Encore merci
                Josyan.
                1. Un très très grand merci...

                  Je viens de tester dur un dépouillement c'est GENIAL...
                  Et en plus j'ai reussi a l'adapter à une autre feuille qui n'avait pas les même colonnes.
                  Je te remercie vivement.

                  Salutations
                  Josyan.
                  1. Contributeur
                    Bonjour,

                    A mettre dans chaque feuille concernée :
                    Private Sub Worksheet_Change(ByVal Target As Range)
                        Dim colsM As Variant, colsNP As Variant, c As Variant, col As String, i As Long, j As Long
                        'colonnes à convertir en majuscules
                        colsM = Array("B", "D", "F", "J", "K", "N", "R", "T", "X", "AN", "AQ")
                        'colonnes à convertir en Nom Propres
                        colsNP = Array("C", "E", "M", "O", "S", "U", "W", "Y", "AO", "AR")
                        Application.EnableEvents = False
                        col = Mid(Cells(1, Target.Column).Address, 2, Len(Cells(1, Target.Column).Address) - 3)
                        For Each c In colsM
                            If col = c Then
                                If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                                    Target.Value = UCase(Target.Value)
                                    
                                End If
                            End If
                        Next c
                        For Each c In colsNP
                            If col = c Then
                                If Not IsNumeric(Target.Value) And Not IsDate(Target.Value) Then
                                    Target.Value = Application.Proper(Target.Value)
                                End If
                            End If
                        Next c
                        Application.EnableEvents = True
                    End Sub


                    eric
                    1. Contributeur
                      Bonjour,

                      J'avais mal lu, je te transforme la feuille après saisie...
                      Sub ConvertiM()
                          Dim colsM As Variant, colsNP As Variant, c As Variant, i As Long, j As Long
                          'colonnes à convertir en majuscules
                          colsM = Array("B", "D", "F", "J", "K", "N", "R", "T", "X", "AN", "AQ")
                          'colonnes à convertir en Nom Propres
                          colsNP = Array("C", "E", "M", "O", "S", "U", "W", "Y", "AO", "AR")
                          For Each c In colsM
                              For j = 1 To Range(c & "65536").End(xlUp).Row
                                  If Not IsNumeric(Range(c & j).Value) And Not IsDate(Range(c & j).Value) Then
                                      Range(c & j) = UCase(Range(c & j))
                                  End If
                              Next j
                          Next c
                          For Each c In colsNP
                              For j = 1 To Range(c & "65536").End(xlUp).Row
                                  If Not IsNumeric(Range(c & j).Value) And Not IsDate(Range(c & j).Value) Then
                                      Range(c & j) = Application.Proper(Range(c & j))
                                  End If
                              Next j
                          Next c
                      End Sub

                      Si tu veux vraiment au fil de l'eau redemande...
                      eric
                      1. Salut Eric

                        Merci de ta réponse...
                        Ton code fonctionne à merveille sur des fichiers déjà "pleins".

                        Par contre, ce que je recherche c'est la possibiliter de cette transformation dès la saisie, cela évite d'avoir à revenir à chaque fois sur le feuille.

                        Donc si tu peux me redonner un coup de pouce...serait génial

                        Merci

                        Josyan